- Mikä on DDS-toimintogeneraattori?
- Ymmärrä AD9833-toimintogeneraattorin IC toiminta
- Komponentit, joita tarvitaan AD9833-pohjaisen toimintageneraattorin rakentamiseen
- AD9833-pohjainen toimintageneraattori - kaaviokuva
- AD9833-pohjainen toimintogeneraattori - Arduino-koodi
- Testataan AD9833-pohjainen toimintageneraattori
- Lisäparannuksia
Jos olet kaltainen elektroninen harrastaja, joka haluaa säätää erilaisia elektronisia piirejä, kunnollisen toimintageneraattorin käyttö on joskus pakollista. Mutta yhden omistaminen on ongelma, koska tällaiset perusvälineet voivat maksaa omaisuuden. Oman testauslaitteiston rakentaminen on paitsi halvempaa myös hyvä tapa parantaa tietämystäsi.
Joten tässä artikkelissa aiomme rakentaa yksinkertaisen signaaligeneraattorin Arduino- ja AD9833 DDS -toimintogeneraattorimoduulilla, joka voi tuottaa sini-, neliö- ja kolmioaaltoja enintään 12 MHz: n taajuudella lähdössä. Ja lopuksi aiomme testata lähtötaajuutta oskilloskooppimme avulla.
Olemme aiemmin rakentaneet yksinkertaisen siniaaltogeneraattorin, neliöaaltogeneraattorin ja kolmion aaltogeneraattorin analogisten peruspiirien avulla. Voit tarkistaa ne, jos etsit joitain aaltomuodon generaattoripiirejä. Lisäksi, jos haluat rakentaa halvemman Arduino-toimintageneraattorin ilman AD9833-moduulia, voit tarkistaa DIY Arduino -aaltomuodon generaattoriprojektin.
Mikä on DDS-toimintogeneraattori?
Kuten nimestä käy ilmi, toimintageneraattori on laite, joka voi antaa tietyn aaltomuodon tietyllä taajuudella asetettaessa. Esimerkiksi, jos sinulla on LC-suodatin, jolle haluat testata lähtötaajuusvastetta, voit tehdä sen helposti toimintageneraattorin avulla. Sinun tarvitsee vain asettaa haluamasi lähtötaajuus ja aaltomuoto, sitten voit kiertää sitä alas tai ylös vasteen testaamiseksi. Tämä oli vain yksi esimerkki, voit tehdä enemmän asioita sen kanssa, kun luettelo jatkuu.
DDS tarkoittaa suoraa digitaalista synteesiä. Se on eräänlainen aaltomuodon generaattori, joka käyttää digitaalista analogiseksi muuntimia (DAC) rakentaakseen signaalin maasta ylöspäin. Tätä menetelmää käytetään erityisesti siniaallon muodostamiseen. Mutta käyttämämme IC voi tuottaa neliö- tai kolmion muotoisia aaltosignaaleja. DDS-sirun sisällä tapahtuneet toiminnot ovat digitaalisia, joten se voi vaihtaa taajuutta hyvin nopeasti tai se voi vaihtaa signaalista toiseen hyvin nopeasti. Tällä laitteella on hieno taajuusresoluutio ja laaja taajuusspektri.
Ymmärrä AD9833-toimintogeneraattorin IC toiminta
Projektin ytimessä on AD9833- ohjelmoitava aaltomuodon generaattori-IC, jonka on suunnitellut ja kehittänyt analogiset laitteet. Se on pienitehoinen, ohjelmoitava aaltomuotogeneraattori, joka kykenee tuottamaan sini, kolmiomainen, ja neliön aalto, jolla on suurin taajuus on 12 MHz. Se on hyvin ainutlaatuinen mikropiiri, joka pystyy muuttamaan lähtötaajuutta ja vaihetta vain ohjelmistolla. Siinä on 3-johdininen SPI-liitäntä, minkä vuoksi kommunikointi tämän IC: n kanssa tulee hyvin yksinkertaiseksi ja helpoksi. Tämän IC: n toiminnallinen lohkokaavio on esitetty alla.
Tämän mikropiirin toiminta on hyvin yksinkertaista. Jos katsomme yllä olevaa toiminnallista lohkokaaviota, huomaamme, että meillä on vaiheakku, jonka tehtävänä on tallentaa kaikki mahdolliset siniaallon digitaaliset arvot alkaen 0: sta 2π: een. Seuraavaksi meillä on SIN-ROM, jonka tehtävänä on muuntaa myöhemmin suoraan kartoitettavat vaihetiedot amplitudiksi. SIN-ROM käyttää digitaalista vaihetietoa osoitteena hakutaulukkoon ja muuntaa vaihetiedot amplitudiksi. Ja viimeiseksi, meillä on 10-bittinen digitaalinen-analogimuunnin, jonka tehtävänä on vastaanottaa digitaalista dataa SIN-ROM-levyltä ja muuntaa se vastaaviksi analogisiksi jännitteiksi, juuri mitä saamme lähdöstä. Lähdössä meillä on myös kytkin, jonka voimme kytkeä päälle tai pois vain pienellä ohjelmistokoodilla. Puhumme siitä myöhemmin artikkelissa.Yllä olevat yksityiskohdat ovat hyvin riisuttu versio IC: n sisällä tapahtuvasta, ja suurin osa yllä näkyvistä yksityiskohdista on otettu AD9833-tietolomakkeesta, voit myös tarkistaa sen saadaksesi lisätietoja.
Komponentit, joita tarvitaan AD9833-pohjaisen toimintageneraattorin rakentamiseen
AD9833-pohjaisen toimintageneraattorin rakentamiseen tarvittavat komponentit on lueteltu alla. Suunnittelimme tämän piirin hyvin yleisillä komponenteilla, mikä tekee replikointiprosessista erittäin helppoa.
- Arduino Nano - 1
- AD9833 DDS-toimintageneraattori - 1
- 128 X 64 OLED -näyttö - 1
- Yleinen pyörivä kooderi - 1
- DC-tynnyriliitin - 1
- LM7809 Jännitesäädin - 1
- 470uF-kondensaattori - 1
- 220uF-kondensaattori - 1
- 104pF-kondensaattori - 1
- 10K vastus - 6
- Kosketuskytkimet - 4
- Ruuviliitin 5,04 mm - 1
- Nainen otsikko - 1
- 12 V: n virtalähde - 1
AD9833-pohjainen toimintageneraattori - kaaviokuva
AD9833: n ja Arduino-pohjaisen toimintageneraattorin täydellinen kytkentäkaavio on esitetty alla.
Aiomme käyttää AD9833: ta Arduinon kanssa halutun taajuuden luomiseen. Ja tässä osassa selitämme kaikki yksityiskohdat kaavion avulla; anna minun antaa sinulle lyhyt katsaus piirin tapahtumiin. Aloitetaan AD9833-moduulista. AD9833-moduuli on toimintogeneraattorimoduuli ja se on kytketty Arduinoon kaavion mukaisesti. Piirin virtalähteeksi käytämme LM7809-jännitesäätimen IC: tä, jolla on kunnollinen irrotuskondensaattori, tämä on välttämätöntä, koska syöttömelu voi häiritä lähtösignaalia, mikä johtaa ei-toivottuun lähtöön. Kuten aina, Arduino toimii tämän projektin aivoina. Asetetun taajuuden ja muun arvokkaan tiedon näyttämiseksi olemme liittäneet 128 X 64 OLED -näyttömoduulin. Taajuusalueen muuttamiseksi käytämme kolmea kytkintä. Ensimmäinen asettaa taajuudeksi Hz, toinen asettaa lähtötaajuudeksi KHz, ja kolmas asettaa taajuudeksi MHz, meillä on myös toinen painike, jota voidaan käyttää lähdön ottamiseen käyttöön tai poistamiseksi käytöstä. Lopuksi meillä on kiertokooderi,ja meidän on kiinnitettävä siihen joitain vetovastuksia, muuten nämä kytkimet eivät toimi, koska tarkistamme painallustapahtuman poolointimenetelmässä. Pyörivää kooderia käytetään taajuuden muuttamiseen ja kiertokooderin sisällä olevaa kosketuskytkintä käytetään asetetun aaltomuodon valitsemiseen.
AD9833-pohjainen toimintogeneraattori - Arduino-koodi
Tässä projektissa käytetty täydellinen koodi löytyy tämän sivun alaosasta. Kun olet lisännyt vaaditut otsikkotiedostot ja lähdetiedostot, sinun pitäisi pystyä kääntämään Arduino-tiedosto suoraan. Voit ladata ad9833 Arduino-kirjaston ja muut kirjastot alla olevasta linkistä tai muuten voit käyttää kirjastonhallintamenetelmää kirjaston asentamiseen.
- Lataa Bill Williamsin AD9833-kirjasto
- Lataa Adafruit SSD1306 OLED -kirjasto
- Lataa Adafruit GFX -kirjasto
Koodin selitys inossa. tiedosto on seuraava. Ensinnäkin aloitamme sisällyttämällä kaikki vaaditut kirjastot. Kirjaston varten AD9833 DDS moduuli ensin seuraa kirjaston OLED ja Matematiikkakirjasto tarvitaan joitakin laskutoimituksia.
#include // AD9833-moduulin kirjasto #include
Seuraavaksi määritellään kaikki tarvittavat tulo- ja lähtönastat painikkeille, kytkimelle, kiertokooderille ja OLED: ille.
#define SCREEN_WIDATA_PINH 128 // OLED-näytön leveys pikseleinä #define SCREEN_HEIGHT 64 // OLED-näytön korkeus pikseleinä #define SET_FREQUENCY_HZ A2 // Painike Aseta taajuus Hz: ksi #define SET_FREQUENCY_KHZ_HF_FF_HF__F_HF_Z_FF_define sisään // Aseta painike A6 // Taajuuden asettaminen painikkeella Mhz: ssä #define ENABLE_DISABLE_OUTPUT_PIN A7 // Painike ottaaksesi käyttöön / poistaaksesi lähdön # määrittele FNC_PIN 4 // Fsync, vaaditaan AD9833-moduulista #define CLK_PIN 8 // Koodin # koodin # koodin / Kooderin tietotappi #define BTN_PIN 9 // Kooderin sisäinen painike
Sen jälkeen määritämme kaikki tarvittavat muuttujat, jotka vaaditaan tässä koodissa. Ensin määritellään kokonaisluvun muuttujan laskuri, joka tallentaa kiertokooderin arvon. Seuraavat kaksi muuttujaa clockPin ja clockPinState tallentavat neulasan, jota tarvitaan kooderin suunnan ymmärtämiseen. Meillä on aika muuttuja, joka pitää nykyisen ajastin-laskurin arvoja, tämä muuttuja käytetään painiketta Debouncing. Seuraavaksi meillä on allekirjoittamaton pitkä muuttuja moduleFrequency, joka pitää sovellettavan lasketun taajuuden. Seuraavaksi meillä on poistumisviive. Tätä viivettä voidaan säätää tarpeen mukaan. Seuraavaksi meillä on kolme loogista muuttujaa set_frequency_hz,set_frequency_Khz ja set_frequency_Mhz näitä kolmea muuttujaa käytetään määrittämään moduulin nykyinen asetus. Puhumme siitä tarkemmin myöhemmin artikkelissa. Seuraavaksi meillä on muuttuja, joka tallentaa lähtöaaltomuodon tilan, oletusulostulon aaltomuoto on siniaalto. Ja lopuksi meillä on muuttuja encoder_btn_count, joka pitää kooderipainikkeiden määrän, jota käytetään lähtöaaltomuodon asettamiseen.
int-laskuri = 1; // Tämä laskurin arvo kasvaa tai pienenee, kun kiertokooderia käännetään int clockPin; // Paikannin piikkitilalle, jota kiertokooderi käyttää int clockPinState; // Kiertokooderin käyttämän pin-tilan paikkamerkki pitkäaikainen allekirjoittamaton = 0; // Käytetään allekirjoittamattoman pitkän moduulin purkamiseenFrequency; // käytetään lähtötaajuuden asettamiseen pitkä debounce = 220; // Debounce delay bool btn_state; // käytetään AD98333-moduulin boolilähdön poistamiseen käytöstä set_frequency_hz = 1; // AD9833-moduulin varmentamistaajuus set_frequency_khz; bool set_frequency_mhz; Merkkijono waveSelect = "SIN"; // Moduulin käynnistyksen aaltomuoto int encoder_btn_count = 0; // käytetään tarkistamaan kooderipainikkeen painallusta Seuraava, meillä on kaksi objektiamme, toinen on OLED-näyttö ja toinen AD9833-moduuli.Adafruit_SSD1306-näyttö (SCREEN_WIDATA_PINH, SCREEN_HEIGHT & Wire, -1); AD9833 gen (FNC_PIN);
Seuraavaksi meillä on setup () -funktiomme, siinä asetustoiminnossa aloitetaan ottamalla Serial käyttöön virheenkorjaukseen. Me alustaa AD9833 moduulin avulla aloitetaan () menetelmällä. Seuraavaksi asetamme kaikki määritetyt kiertokooderin nastat tuloksi. Ja tallennamme kellonastan arvon clockPinState- muuttujaan, tämä on välttämätön vaihe kiertokooderille.
Seuraavaksi asetamme kaikki painikkeen nastat tuloksi ja otamme OLED-näytön käyttöön display.begin () -menetelmän avulla, ja tarkistamme myös mahdolliset virheet if-käskyllä . Kun tämä on tehty, tyhjennämme näytön ja tulostamme käynnistysikkunan, lisätään 2 sekunnin viive, joka on myös roiskunäytön viive, ja lopuksi kutsumme toimintoa update_display (), joka tyhjentää ruudun ja päivittää uudelleen. Yksityiskohtia update_display () menetelmää käsitellään myöhemmin tässä artikkelissa.
void setup () {Sarja.alku (9600); // Ota käyttöön Serial @ 9600 baud gen.Begin (); // Tämän PITÄÄ olla ensimmäinen komento AD9833-objektin pinMode (CLK_PIN, INPUT) ilmoittamisen jälkeen; // Nastojen asettaminen tulona pinMode (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Nastojen asettaminen tuloksi pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Osoite 0x3D mallille 128x64 Serial.println (F ("SSD1306 allokointi epäonnistui")); varten (;;); } display.clearDisplay (); // Tyhjennä näyttö display.setTextSize (2); // Aseta tekstin koko display.setTextColor (VALKOINEN); // aseta LCD-värinäyttö.setCursor (30, 0); // Aseta kohdistimen sijainnin näyttö.println ("AD9833"); // Tulosta tämä tekstinäyttö.setCursor (17, 20); // Aseta kohdistimen sijainnin näyttö.println ("Toiminto"); // Tulosta tämä teksti display.setCursor (13, 40); // Aseta kohdistimen sijainti display.println ("Generaattori"); // Tulosta tämä teksti display.display (); // Päivitä näytön viive (2000); // 2 SEC-päivityksen viive (display) (); // Soita päivitysnäyttö -toiminto}
Seuraavaksi meillä on loop () -funktio, kaikki tärkeimmät toiminnot kirjoitetaan silmukkaosaan.
Ensin luemme pyörivän kooderin kellonastan ja tallennamme sen aiemmin ilmoitettuun clockPin-muuttujaan. Seuraavaksi tarkistamme if- lauseessa, ovatko tapin edellinen arvo ja tapin nykyinen arvo samanlaisia vai eivät, ja tarkistamme myös tapin nykyisen arvon. Jos kaikki on totta, tarkistamme datanastan, jos tosi, se tarkoittaa, että kooderi pyörii vastapäivään ja vähennämme laskurin arvoa counter-- -komennon avulla. Muutoin lisäämme laskurin arvoa counter ++ -komennolla. Lopuksi laitamme toisen if- lauseen asettamaan vähimmäisarvoksi 1. Seuraavaksi päivitämme clockPinState nykyisellä clockPinarvo tulevaa käyttöä varten.
void loop () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {laskuri -; } else {laskuri ++; // Kooderi kiertää CW: tä niin, että inkrementti} jos (laskuri <1) laskuri = 1; Serial.println (laskuri); update_display (); }
Seuraavaksi meillä on koodi tunnistaa painikkeen painallus. Tässä osassa olemme havainneet kooderin sisällä olevan painikkeen joidenkin sisäkkäisten if-lauseiden avulla, jos (digitalRead (BTN_PIN) == LOW && millis () - aika> irtisanoa), tässä lausekkeessa tarkistamme ensin, onko painike tappi on matala tai ei, jos se on alhaalla, se painetaan. Sitten tarkistamme ajastimen arvon poistumisviiveellä, jos molemmat lauseet ovat totta, julistamme sen onnistuneeksi painikkeen toiminnoksi, jos niin kasvatamme kooderin_btn_määrä arvoa. Seuraavaksi julistamme toisen if-lauseen asettamaan maksimilaskurin arvoksi 2, tarvitsemme sitä, koska käytämme sitä lähtösignaalin asettamiseen.Kolme peräkkäistä lausetta tekevät niin, jos arvo on nolla, valitaan siniaaltomuoto, jos se on yksi, se on neliöaalto ja jos arvo on 2, se on kolmion muotoinen aalto. Kaikissa näissä kolmessa if-lauseessa päivitämme näytön update_display () -toiminnolla. Ja lopuksi päivitämme aikamuuttujan nykyisellä ajastinlaskurilla.
// Jos havaitsemme LOW-signaalin, painiketta painetaan, jos (digitalRead (BTN_PIN) == LOW && millis () - aika> debounce) {encoder_btn_count ++; // Lisää arvoja if (kooderin_btn_luku> 2) //, jos arvo on suurempi kuin 2, palauta se arvoon 0 {kooderin_btn_luku = 0; } if (kooderin_btn_luku == 0) {// jos arvo on 0 siniaalto on valittu waveSelect = "SIN"; // päivitä merkkijonomuuttuja sin-arvolla update_display (); // päivitä näyttö} if (kooderin_btn_luku == 1) {// jos arvo on 1 neliön aalto on valittu waveSelect = "SQR"; // päivitä merkkijonomuuttuja SQR-arvolla update_display (); // päivitä näyttö} if (kooderin_btn_luku == 2) {// jos arvo on 1 Kolmiomainen aalto on valittu waveSelect = "TRI"; // päivitä merkkijonomuuttuja TRI-arvolla update_display ();// päivitä näyttö} aika = millis (); // päivitä aikamuuttuja}
Seuraavaksi määritellään kaikki tarvittavat koodit, joita tarvitaan kaikkien painikkeiden asettamiseen poistumisviiveellä. Koska painikkeet on kytketty Arduinon analogisiin nastoihin, käytämme analogista lukukomentoa tunnistamaan painikkeen painalluksen, jos analogisen lukeman arvo saavuttaa alle 30, havaitsemme sen onnistuneen painalluksen ja odotamme 200 ms tarkista onko kyseessä varsinainen painallus vai vain ääni. Jos tämä lause on totta, määritämme loogiset muuttujat arvoilla, joita käytetään funktiogeneraattorin Hz-, Khz- ja Mhz-arvojen asettamiseen. Seuraavaksi päivitämme näytön ja päivitämme aikamuuttujan. Teemme sen kaikille Arduinoon liitetyille painikkeille.
jos (analogRead (SET_FREQUENCY_HZ) <30 && millis () - aika> debounce) {set_frequency_hz = 1; // päivitä loogiset arvot set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // päivitä näyttöaika = millis (); // päivitä aikamuuttuja} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - aika> debounce) {set_frequency_hz = 0; // päivitä loogiset arvot set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = laskuri * 1000; update_display (); // päivitä näyttöaika = millis (); // päivitä aikamuuttuja} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - aika> debounce) {// tarkista analoginen tappi debounce delay set_frequency_hz = 0; // päivitä loogiset arvot set_frequency_khz = 0; set_frequency_mhz = 1; moduleFrequency = laskuri * 1000000; update_display ();// päivitä näyttöaika = millis (); // päivitä aikamuuttuja} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - aika> debounce) {// tarkista analoginen nasta poistumisviiveellä btn_state =! btn_state; // Käännä painikkeen tila gen.EnableOutput (btn_state); // Aktivoi / poista toimintageneraattorin lähtö painikkeen tilasta riippuen update_display (); // päivitä näyttöaika = millis (); // päivitä aikamuuttuja}}// päivitä aikamuuttuja}}// päivitä aikamuuttuja}}
Lopuksi meillä on update_display () -funktiomme. Tässä toiminnossa teimme paljon muutakin kuin vain päivittämällä tämän näytön, koska tiettyä näytön osaa ei voida päivittää OLED: ssä. Jos haluat päivittää sen, sinun on maalattava se uusilla arvoilla. Tämä vaikeuttaa koodausprosessia.
Tämän toiminnon sisällä aloitamme näytön tyhjentämisen. Seuraavaksi asetamme vaaditun tekstikoon. Sen jälkeen asetamme kohdistimen ja tulostetun toimintogeneraattorin display.println: llä ("Toimintotoiminto"); komento. Asetamme uudelleen tekstin kooksi 2 ja kohdistimen arvoksi (0,20) display.setCursor (0, 20) -toiminnon avulla.
Täältä tulostamme tiedot siitä, mikä aalto se on.
display.clearDisplay (); // Ensimmäinen tyhjennä näytön display.setTextSize (1); // aseta tekstin koko display.setCursor (10, 0); // Aseta kohdistimen sijainnin näyttö.println ("Funktiogeneraattori"); // tulosta tekstinäyttö.setTextSize (2); // aseta tekstin koko display.setCursor (0, 20); // aseta kohdistimen sijainti
Seuraavaksi tarkistamme loogiset muuttujat taajuuden yksityiskohdista ja päivitämme arvon moduleFrequency- muuttujassa. Teemme tämän Hz-, kHz- ja MHz-arvoille. Seuraavaksi tarkistamme waveSelect- muuttujan ja tunnistamme, mikä aalto on valittu. Nyt meillä on arvot aaltotyypin ja taajuuden asettamiseksi.
jos (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// tarkista, painetaanko taajuuden asettamispainiketta Hz: ssä moduleFrequency = counter; // päivitä moduleFrequency-muuttuja nykyisellä laskuriarvolla} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// tarkista, painetaanko taajuuden asettamista KHz-painikkeella moduleFrequency = laskuri * 1000; // päivitä moduleFrequency-muuttuja nykyisellä laskuriarvolla, mutta kertomalla 1000 asetamme sen KHZ: lle} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// tarkista, painetaanko taajuuden asettamiseen MHz-painiketta = laskuri * 1000000; if (moduulin Taajuus> 12000000) {moduulin Taajuus = 12000000;// älä anna taajuuden olla raastin, että 12 MHz: n laskuri = 12; }} if (waveSelect == "SIN") {// Siniaalto on valittu display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Sqr-aalto on valittu display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri-aalto on valittu display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // päivitä AD9833-moduuli. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Sqr-aalto on valittu display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri-aalto on valittu display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // päivitä AD9833-moduuli. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Sqr-aalto on valittu display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri-aalto on valittu display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // päivitä AD9833-moduuli. Serial.println (moduleFrequency); }
Asetamme kohdistimen uudelleen ja päivitämme laskurin arvot. Jälleen kerran tarkistamme totuusarvon päivittääksesi taajuusalueen näytöllä, meidän on tehtävä tämä, koska OLED: n toimintaperiaate on erittäin outo.
display.setCursor (45, 20); display.println (laskuri); // tulosta laskuritiedot näytölle. jos (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // tulosta Hz näyttöön. näyttö (); // kun kaikki joukot päivittävät näytön} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // kun kaikki joukot päivittävät näytön} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // kun kaikki asetetut päivittävät näytön}
Seuraavaksi tarkistamme painallusmuuttujan tulostaaksesi tulostuksen / tulostaaksesi OLED: ään. Jälleen tämä on tehtävä OLED-moduulin takia.
if (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output ON"); // tulosta tulostusnäyttöön.display (); display.setTextSize (2); } else {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output OFF"); // tulosta tulosignaali näyttöön. näyttö (); display.setTextSize (2); }
Tämä merkitsee koodausprosessimme loppua. Jos olet hämmentynyt tässä vaiheessa, voit tarkistaa koodin kommentit ymmärtämistä varten.
Testataan AD9833-pohjainen toimintageneraattori
Piirin testaamiseksi käytetään yllä olevaa asetusta. Kuten näette, olemme liittäneet 12 V DC-virtalähteen DC-tynnyriliittimeen ja Hantek-oskilloskoopin piirin lähtöön. Olemme myös liittäneet oskilloskoopin kannettavaan tietokoneeseen visualisoimaan ja mittaamaan lähtötaajuutta.
Kun tämä on tehty, asetetaan lähtötaajuudeksi kiertokooderin avulla 5Khz ja testataan lähtösiniaalto ja varmasti, että lähtö on 5Khz siniaalto.
Seuraavaksi olemme muuttaneet lähtöaaltomuodon kolmion muotoiseksi aalloksi, mutta taajuus pysyi samana, lähtöaaltomuoto on esitetty alla.
Sitten muutimme lähdön neliöaalloksi ja tarkkailimme lähtöä, ja se oli täydellinen neliöaalto.
Muutimme myös taajuusalueita ja testasimme lähtöä, ja se toimi hyvin.
Lisäparannuksia
Tämä piiri on vain todiste konseptista ja tarvitsee lisäparannuksia. Ensinnäkin tarvitsemme laadukkaan piirilevyn ja hyvänlaatuisen BNC-liittimen lähtöä varten, muuten emme voi saada suurempaa taajuutta. Moduulin amplitudi on hyvin pieni, joten sen parantamiseksi tarvitsemme joitain op-amp-piirejä lähtöjännitteen vahvistamiseksi. Potentiometri voidaan kytkeä lähtö amplitudin muuttamiseksi. Kytkin signaalin siirtämiseksi voidaan liittää; tämä on myös pakollinen ominaisuus. Ja edelleen, koodi vaatii paljon parannusta, koska se on vähän buginen. Lopuksi OLED-näyttöjä on muutettava, muuten on mahdotonta kirjoittaa helposti ymmärrettävää koodia.
Tämä merkitsee tämän opetusohjelman loppua, toivottavasti pidit artikkelista ja opit jotain uutta. Jos sinulla on kysyttävää artikkelista, voit jättää ne alla olevaan kommenttiosioon tai käyttää elektroniikkafoorumiamme.