- Kas yra DDS funkcijų generatorius?
- Supraskite AD9833 funkcijų generatoriaus IC veikimą
- Komponentai, reikalingi norint sukurti AD9833 pagrįstą funkcijų generatorių
- AD9833 pagrįstas funkcijų generatorius - scheminė schema
- AD9833 pagrįstas funkcijų generatorius - „Arduino“ kodas
- „AD9833“ pagrindu sukurtų funkcijų generatoriaus testavimas
- Kiti patobulinimai
Jei esate elektronikos entuziastas, kaip ir aš, norintis pakoreguoti įvairias elektronines grandines, turėti padorų funkcijų generatorių kartais tampa privaloma. Tačiau jos turėjimas yra problema, nes tokia pagrindinė įranga gali kainuoti nemažą sumą. Sukurti savo bandymų įrangą yra ne tik pigiau, bet ir puikus būdas pagerinti savo žinias.
Taigi šiame straipsnyje mes sukursime paprastą signalo generatorių su „Arduino“ ir AD9833 DDS funkcijų generatoriaus moduliu, kuris gali išgauti sinuso, kvadrato ir trikampio bangas, kurių išėjimas ne didesnis kaip 12 MHz dažnis. Ir galiausiai, mes ketiname išbandyti išėjimo dažnį savo osciloskopo pagalba.
Anksčiau mes sukūrėme paprastą sinusinių bangų generatorių, kvadratinių bangų ir trikampių bangų generatorių, naudodamiesi pagrindinėmis analoginėmis grandinėmis. Galite juos patikrinti, jei ieškote pagrindinių bangos formos generatoriaus grandinių. Be to, jei norite sukurti pigesnį „Arduino“ funkcijų generatorių nenaudodami „AD9833“ modulio, galite patikrinti „pasidaryk pats“ „Arduino“ bangos formos generatoriaus projektą.
Kas yra DDS funkcijų generatorius?
Kaip rodo pavadinimas, funkcijų generatorius yra prietaisas, kuris nustatydamas gali išleisti tam tikrą bangos formą tam tikru dažniu. Pavyzdžiui, apsvarstykite, ar turite LC filtrą, kuriam norite išbandyti savo išėjimo dažnio atsaką, tai galite lengvai padaryti naudodamiesi funkcijų generatoriumi. Viskas, ką jums reikia padaryti, yra nustatyti norimą išėjimo dažnį ir bangos formą, tada galėsite jį pasukti žemyn arba aukštyn, kad išbandytumėte atsaką. Tai buvo tik vienas pavyzdys. Su juo galite atlikti daugiau dalykų.
DDS reiškia tiesioginę skaitmeninę sintezę. Tai yra bangos formos generatorius, kuris naudoja skaitmeninius į analoginius keitiklius (DAC), kad sukurtų signalą iš pagrindų. Šis metodas specialiai naudojamas sinuso bangai generuoti. Tačiau mūsų naudojamas IC gali gaminti kvadratinius arba trikampius bangų signalus. DDS lusto viduje įvykusios operacijos yra skaitmeninės, todėl jis gali labai greitai pakeisti dažnį arba labai greitai pereiti iš vieno signalo į kitą. Šis prietaisas turi puikią dažnio skiriamąją gebą su plačiu dažnių spektru.
Supraskite AD9833 funkcijų generatoriaus IC veikimą
Mūsų projekto esmė yra AD9833 programuojamas bangos formos generatoriaus IC, kurį suprojektavo ir sukūrė analoginiai prietaisai. Tai mažos galios programuojamas bangos formos generatorius, galintis generuoti sinusinę, trikampę ir kvadratinę bangas, kurių maksimalus dažnis yra 12 MHz. Tai labai unikalus IC, galintis pakeisti išvesties dažnį ir fazę tik programine įranga. Jis turi 3 laidų SPI sąsają, todėl bendravimas su šiuo IC tampa labai paprastas ir lengvas. Šios IC funkcinė blokinė schema parodyta žemiau.
Šio IC veikimas yra labai paprastas. Pažvelgę į aukščiau pateiktą funkcinę blokinę schemą, pastebėsime, kad turime fazių akumuliatorių, kurio užduotis yra išsaugoti visas galimas sinusinės bangos skaitmenines vertes, pradedant nuo 0 iki 2π. Tada mes turime SIN ROM, kurio užduotis yra konvertuoti fazės informaciją, kurią vėliau galima tiesiogiai susieti, į amplitudę. SIN ROM naudoja skaitmeninės fazės informaciją kaip adresą paieškos lentelei ir konvertuoja fazės informaciją į amplitudę. Galiausiai, mes turime 10 bitų skaitmeninį į analoginį keitiklį, kurio užduotis yra priimti skaitmeninius duomenis iš SIN ROM ir paversti juos atitinkamomis analoginėmis įtampomis, būtent tai gauname iš išvesties. Išvestyje mes taip pat turime jungiklį, kurį galime įjungti arba išjungti tik su nedideliu programinės įrangos kodu. Apie tai pakalbėsime vėliau straipsnyje.Išsami informacija, kurią matote aukščiau, yra labai nuimta versija, kas vyksta IC viduje, ir dauguma anksčiau matytų detalių yra paimtos iš AD9833 duomenų lapo, taip pat galite tai patikrinti, jei norite gauti daugiau informacijos.
Komponentai, reikalingi norint sukurti AD9833 pagrįstą funkcijų generatorių
Komponentai, reikalingi sukurti AD9833 pagrįstą funkcijų generatorių, išvardyti žemiau, mes suprojektavome šią grandinę su labai bendrais komponentais, o tai labai palengvina replikacijos procesą.
- „Arduino Nano“ - 1
- AD9833 DDS funkcijų generatorius - 1
- 128 X 64 OLED ekranas - 1
- Bendrasis sukamasis kodavimo įrenginys - 1
- „DC Barrel Jack“ - 1
- LM7809 įtampos reguliatorius - 1
- 470uF kondensatorius - 1
- 220uF kondensatorius - 1
- 104pF kondensatorius - 1
- 10K rezistorius - 6
- Lytėjimo jungikliai - 4
- Sraigtinis gnybtas 5,04 mm - 1
- Moters antraštė - 1
- 12 V maitinimo šaltinis - 1
AD9833 pagrįstas funkcijų generatorius - scheminė schema
Visa AD9833 ir „Arduino“ pagrindu sukurtų funkcijų generatoriaus schema parodyta žemiau.
Norint sukurti norimą dažnį, mes naudosime AD9833 su „Arduino“. Ir šiame skyriuje mes paaiškinsime visas detales schemos pagalba; leiskite trumpai apžvelgti, kas vyksta su grandine. Pradėkime nuo modulio AD9833. AD9833 modulis yra funkcijų generatoriaus modulis ir jis sujungtas su „Arduino“ pagal schemą. Norėdami įjungti grandinę, mes naudojame LM7809 įtampos reguliatorių IC su tinkamu atsiejimo kondensatoriumi, tai yra būtina, nes maitinimo triukšmas gali trukdyti išvesties signalui ir sukelti nepageidaujamą išėjimą. Kaip visada, „Arduino“ yra šio projekto smegenys. Norėdami parodyti nustatytą dažnį ir kitą vertingą informaciją, mes prijungėme 128 X 64 OLED ekrano modulį. Norėdami pakeisti dažnių diapazoną, mes naudojame tris jungiklius. Pirmasis nustato dažnį į Hz, antrasis - išėjimo dažnį į KHz, o trečiasis - į dažnį MHz, mes taip pat turime dar vieną mygtuką, kurį galima naudoti įjungiant arba išjungiant išvestį. Galiausiai turime sukamąjį kodavimo įrenginį,ir mes turime su juo pritvirtinti tam tikrą traukimo rezistorių, kitaip šie jungikliai neveiks, nes mes tikriname mygtuko paspaudimo įvykį sujungimo metodu. Sukamasis koderis naudojamas dažnio keitimui, o taktilinis jungiklis rotacinio kodavimo įrenginio viduje naudojamas nustatytai bangos formai pasirinkti.
AD9833 pagrįstas funkcijų generatorius - „Arduino“ kodas
Visą šiame projekte naudojamą kodą galite rasti šio puslapio apačioje. Pridėję reikiamus antraštės failus ir šaltinio failus, turėtumėte galėti tiesiogiai kompiliuoti „Arduino“ failą. Galite atsisiųsti „ ad9833 Arduino“ biblioteką ir kitas bibliotekas iš toliau pateiktos nuorodos, kitaip galite naudoti lentos tvarkyklės metodą bibliotekai įdiegti.
- Atsisiųskite Billo Williamso AD9833 biblioteką
- Atsisiųskite „Adafruit“ SSD1306 OLED biblioteką
- Atsisiųskite „Adafruit GFX“ biblioteką
Kodo paaiškinimas ino. failas yra toks. Pirmiausia mes įtraukiame visas reikalingas bibliotekas. Pirmiausia po AD9833 DDS modulio biblioteka seka OLED biblioteka, o kai kuriems mūsų skaičiavimams reikalinga matematikos biblioteka.
#include // AD9833 modulio #include biblioteka
Tada mes apibrėžiame visus reikalingus mygtukų, jungiklių, sukamųjų koduočių ir OLED įvesties ir išvesties kaiščius.
#define SCREEN_WIDATA_PINH 128 // OLED ekrano plotis pikseliais #define SCREEN_HEIGHT 64 // OLED ekrano aukštis, pikseliais #define SET_FREQUENCY_HZ A2 // Mygtukas Norėdami nustatyti dažnį Hz A6 // Mygtukas Mhz dažniui nustatyti #define ENABLE_DISABLE_OUTPUT_PIN A7 // Mygtukas įgalinti / išjungti išvestį #define FNC_PIN 4 // Fsync reikalingas AD9833 modulio #define CLK_PIN 8 // Laikrodžio PIN kodo kodas / Koduotojo duomenų PIN kodas #define BTN_PIN 9 // Koduotojo vidinis mygtukas
Po to mes apibrėžiame visus reikalingus kintamuosius, kurių reikia šiame kode. Pirmiausia mes apibrėžiame sveiko skaičiaus kintamųjų skaitiklį, kuriame bus saugoma sukamojo kodavimo įrenginio vertė. Kiti du kintamieji „ clockPin“ ir „ clockPinState“ saugo smeigtuko statulą, reikalingą koduotojo krypčiai suprasti. Mes turime laiko kintamąjį, kuriame laikomos dabartinės laikmačio skaitiklio vertės, šis kintamasis naudojamas mygtukams atšaukti. Toliau mes turime nepasirašytą ilgą kintamąjį modulįFrequency, kuris turi apskaičiuotą dažnį, kuris bus taikomas. Tada mes turime atidėjimo vėlavimą. Šį vėlavimą galima koreguoti pagal poreikį. Tada turime tris loginius kintamuosius set_frequency_hz,set_frequency_Khz ir set_frequency_Mhz šie trys kintamieji naudojami nustatant dabartinį modulio nustatymą. Apie tai išsamiau pakalbėsime vėliau straipsnyje. Tada mes turime kintamąjį, kuriame saugoma išėjimo bangos forma, numatytoji išėjimo bangos forma yra sinusinė banga. Galiausiai, mes turime kintamąjį encoder_btn_count, kuris turi kodavimo mygtukų skaičių, kuris naudojamas išvesties bangos formai nustatyti.
int skaitiklis = 1; // Ši skaitiklio reikšmė padidės arba sumažės, jei sukamąjį kodavimo įrenginį pasuks int clockPin; // Vietos žymeklis smeigtuko būsenai, kurį naudoja rotacinis koderis int clockPinState; // Vietinio žymeklio būsenos, kurią naudoja rotacinis koderis, nepasirašytas ilgas laikas = 0; // Naudojamas nepasirašytam ilgam moduliuiFrequency; // naudojamas nustatyti išėjimo dažnį ilgas atšokimas = 220; // Debounce delay bool btn_state; // naudojamas įjungti AD98333 modulio išvesties išvesties išjungimą. set_frequency_hz = 1; // AD9833 modulio „Bool“ numatytojo dažnio rinkinys „set_frequency_khz“; Bool set_frequency_mhz; String waveSelect = "SIN"; // Modulio paleidimo bangos forma int encoder_btn_count = 0; // naudojamas patikrinti kodavimo mygtuko paspaudimą Kitas, mes turime du objektus, vienas skirtas OLED ekranui, kitas - AD9833 moduliui.„Adafruit_SSD1306“ ekranas (SCREEN_WIDATA_PINH, SCREEN_HEIGHT ir viela, -1); AD9833 gen (FNC_PIN);
Tada turime savo sąrankos () funkciją, toje sąrankos funkcijoje pradedame įgalindami „Serial“ derinimą. AD9833 modulį inicializuojame pradžios () metodo pagalba. Toliau visus priskirtus sukamojo kodavimo kaiščius nustatome kaip įvestį. Laikrodžio kaiščio vertę mes saugome kintamajame „ clockPinState“, tai yra būtinas sukamojo kodavimo veiksmas.
Tada nustatome visus mygtukų kaiščius kaip įvestį ir įgaliname OLED ekraną display.begin () metodo pagalba, taip pat patikriname, ar nėra klaidų su teiginiu if . Kai tai bus padaryta, mes išvalysime ekraną ir atspausdinsime paleidimo paleidimo ekraną, pridedame 2 sekundžių vėlavimą, kuris taip pat yra uždelsimo ekrano vėlavimas, ir galiausiai mes vadiname funkciją update_display (), kuri išvalo ekraną ir atnaujina dar kartą. Metodo update_display () išsami informacija bus aptarta vėliau straipsnyje.
negaliojanti sąranka () {Serial.begin (9600); // Įjungti Serial @ 9600 baud gen.Begin (); // Tai PRIVALO būti pirmoji komanda paskelbus AD9833 objekto pinMode (CLK_PIN, INPUT); // Kaiščių nustatymas kaip įvesties pinMode (DATA_PIN, INPUT); „pinMode“ (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Kaiščių nustatymas kaip įvesties pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); „pinMode“ (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adresas 0x3D, skirtas 128x64 Serial.println (F ("SSD1306 paskirstymas nepavyko")); dėl (;;); } display.clearDisplay (); // Išvalykite ekraną display.setTextSize (2); // Nustatyti teksto dydį display.setTextColor (BALTAS); // nustatyti LCD spalvotą ekraną.setCursor (30, 0); // Nustatyti žymeklio padėties rodymą.println ("AD9833"); // Spausdinkite šį teksto ekraną.setCursor (17, 20); // Nustatyti žymeklio padėties rodymą.println ("Funkcija"); // Atsispausdinkite šį tekstą display.setCursor (13, 40); // Nustatyti žymeklio padėties rodymą.println ("Generatorius"); // Spausdinti šį tekstą display.display (); // Atnaujinti ekrano delsą (2000); // 2 SEC atnaujinimo atidėjimas_display () atidėjimas; // Skambučio atnaujinimo_display funkcija}
Tada mes turime savo ciklo () funkciją, visos pagrindinės funkcijos yra parašytos ciklo skyriuje.
Pirmiausia, mes perskaitėme „Rotary“ kodavimo įrenginio laikrodžio kaištį ir laikome jį anksčiau deklaruotame „clockPin“ kintamajame. Tada sakinyje „ if“ patikriname, ar ankstesnė kaiščio ir dabartinės kaiščio vertė yra panaši, ar ne, taip pat patikriname dabartinę kaiščio vertę. Jei viskas teisinga, patikriname, ar nėra duomenų kaiščio, jei tiesa, tai reiškia, kad koduotojas sukasi prieš laikrodžio rodyklę ir mažiname skaitiklio vertę naudodami komandą counter--. Kitu atveju mes padidiname skaitiklio vertę naudodami komandą counter ++. Galiausiai, mes įdėjome kitą if teiginį, kad nustatytume mažiausią vertę į 1. Tada mes atnaujiname „ clockPinState “ dabartiniu „ clockPin“vertė būsimam naudojimui.
void loop () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {skaitiklis -; } else {counter ++; // Koduotojas sukasi CW taip didindamas} if (skaitiklis <1) skaitiklis = 1; Serial.println (skaitiklis); update_display (); }
Tada mes turime savo kodą, kad aptiktume mygtuko paspaudimą. Šiame skyriuje aptikome kodavimo priemonės mygtuką naudodami kai kuriuos įdėtus if teiginius, jei (digitalRead (BTN_PIN) == LOW && millis () - laikas> denonsuoti) šiame sakinyje pirmiausia patikriname, ar mygtukas kaištis yra žemas, ar ne, jei jis yra žemas, tada jis paspaudžiamas. Tada dar kartą patikriname laikmačio reikšmę su atšaukimo vėlavimu, jei abu teiginiai yra teisingi, mes paskelbiame, kad tai sėkmingas mygtuko paspaudimo veiksmas, jei taip padidiname kodavimo_btn_skaitymo vertę. Tada mes paskelbiame kitą if teiginį, kad nustatytume didžiausią skaitiklio vertę iki 2, mums to reikia, nes mes naudojame jį išvesties bangos formai nustatyti.Trys nuoseklūs sakiniai, jei teiginiai tai daro, jei reikšmė lygi nuliui, pasirenkama sinuso bangos forma, jei ji yra viena, tai yra kvadratinė, o jei reikšmė yra 2, tai yra trikampė banga. Visuose trijuose šiuose „if“ sakiniuose atnaujiname ekraną naudodami „ update_display ()“ funkciją. Galiausiai, mes atnaujiname laiko kintamąjį pagal dabartinę laikmačio skaitiklio vertę.
// Jei aptiksime LOW signalą, mygtukas paspaudžiamas, jei (digitalRead (BTN_PIN) == LOW && millis () - laikas> debounce) {encoder_btn_count ++; // Padidinkite reikšmes if (kodavimo_btn_skaičius> 2) //, jei reikšmė didesnė nei 2, atstatykite ją į 0 {kodavimo_btn_skaičius = 0; } if (encoder_btn_count == 0) {// jei reikšmė yra 0, pasirinkta sinusinė banga waveSelect = "SIN"; // atnaujinti eilutės kintamąjį su sin reikšme update_display (); // atnaujinti ekraną} if (encoder_btn_count == 1) {// jei reikšmė yra 1 kvadratinė banga, pasirinkta waveSelect = "SQR"; // atnaujinti eilutės kintamąjį su SQR reikšme update_display (); // atnaujinti ekraną} if (encoder_btn_count == 2) {// jei reikšmė yra 1 Pasirinkta trikampė banga waveSelect = "TRI"; // atnaujinti eilutės kintamąjį su TRI reikšme update_display ();// atnaujinti ekraną} laikas = milis (); // atnaujinti laiko kintamąjį}
Tada mes apibrėžiame visą reikiamą kodą, kurio reikia norint nustatyti visus mygtukus su atšaukimo vėlavimu. Kadangi mygtukai yra prijungti prie „Arduino“ analoginių kaiščių, mes naudojame analoginio skaitymo komandą, kad nustatytume mygtuko paspaudimą, jei analoginio nuskaitymo vertė pasiekia mažesnę nei 30, tada mes nustatome sėkmingą jo paspaudimą ir laukiame 200 ms patikrinkite, ar tai tikrasis mygtuko paspaudimas, ar tik triukšmas. Jei šis teiginys teisingas, loginius kintamuosius priskiriame reikšmėms, kurios naudojamos nustatyti funkcijų generatoriaus Hz, Khz ir Mhz reikšmes. Tada mes atnaujiname ekraną ir atnaujiname laiko kintamąjį. Mes tai darome visiems keturiems mygtukams, susijusiems su „Arduino“.
if (analogRead (SET_FREQUENCY_HZ) <30 && millis () - laikas> debounce) {set_frequency_hz = 1; // atnaujinti logines reikšmes set_frequency_khz = 0; nustatyti_frequency_mhz = 0; update_display (); // atnaujinti rodymo laiką = milis (); // atnaujinti laiko kintamąjį} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - laikas> debounce) {set_frequency_hz = 0; // atnaujinti logines reikšmes set_frequency_khz = 1; nustatyti_frequency_mhz = 0; moduleFrequency = skaitiklis * 1000; update_display (); // atnaujinti rodymo laiką = milis (); // atnaujinti laiko kintamąjį} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - laikas> atšaukti) {// patikrinti analoginį kaištį su atšaukimo vėlavimu 0; // atnaujinti logines reikšmes set_frequency_khz = 0; nustatyti_frequency_mhz = 1; moduleFrequency = skaitiklis * 1000000; update_display ();// atnaujinti rodymo laiką = milis (); // atnaujinti laiko kintamąjį} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - laikas> atšaukti) {// patikrinkite analoginį kaištį su atšaukimo vėlavimu btn_state =! btn_state; // Apverskite mygtuko būseną gen.EnableOutput (btn_state); // Įjungti / išjungti funkcijų generatoriaus išvestį, atsižvelgiant į mygtuko būseną update_display (); // atnaujinti rodymo laiką = milis (); // atnaujinti laiko kintamąjį}}// atnaujinti laiko kintamąjį}}// atnaujinti laiko kintamąjį}}
Galiausiai turime savo funkciją „update_display ()“. Šioje funkcijoje mes padarėme daug daugiau nei tik atnaujinę šį ekraną, nes tam tikros ekrano dalies negalima atnaujinti OLED. Norėdami jį atnaujinti, turite perdažyti naujomis reikšmėmis. Tai žymiai apsunkina kodavimo procesą.
Šios funkcijos viduje mes pradedame nuo ekrano išvalymo. Tada nustatome reikiamą teksto dydį. Po to mes nustatome žymeklį ir atspausdintą funkcijų generatorių su display.println („Funkcijos funkcija“); komandą. Funkcijos display.setCursor (0, 20) pagalba vėl nustatėme teksto dydį į 2, o žymeklį į (0,20).
Čia mes atspausdiname informaciją, kokia tai banga.
display.clearDisplay (); // FIrst išvalykite ekrano display.setTextSize (1); // nustatyti teksto dydį display.setCursor (10, 0); // Nustatyti žymeklio padėties rodymą.println ("Funkcijų generatorius"); // išspausdinti teksto display.setTextSize (2); // nustatyti teksto dydį display.setCursor (0, 20); // nustatyti žymeklio padėtį
Tada mes patikrinsime loginius kintamuosius, kad gautume išsamią informaciją apie dažnį, ir atnaujiname reikšmę „ moduleFrequency“ kintamajame. Tai darome Hz, kHz ir MHz reikšmėms. Tada patikrinsime kintamąjį „ waveSelect“ ir nustatysime, kuri banga yra pasirinkta. Dabar mes turime vertes nustatyti bangos tipą ir dažnį.
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// patikrinkite, ar paspaudžiamas dažnio nustatymo Hz dažniu mygtukas moduleFrequency = counter; // atnaujinti „moduleFrequency“ kintamąjį su dabartine skaitiklio verte} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// patikrinkite, ar paspaudžiamas dažnio nustatymo KHz mygtukas moduleFrequency = counter * 1000; // atnaujinti „moduleFrequency“ kintamąjį su dabartine skaitiklio verte, bet mes padauginsime 1000, kad jį nustatytume į KHZ} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// patikrinkite, ar paspaustas dažnio nustatymo mygtukas = skaitiklis * 1000000; if (modulioDažnis> 12000000) {modulisDažnis = 12000000;// neleiskite dažniui sutraukti, kad 12Mhz skaitiklis = 12; }} if (waveSelect == "SIN") {// Pasirinkta sinusinė banga display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Pasirinkta Sqr banga display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Pasirinkta Tri banga display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // atnaujinti modulį AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Pasirinkta Sqr banga display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Pasirinkta Tri banga display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // atnaujinti modulį AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Pasirinkta Sqr banga display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Pasirinkta Tri banga display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // atnaujinti modulį AD9833. Serial.println (moduleFrequency); }
Vėl nustatome žymeklį ir atnaujiname skaitiklio reikšmes. Vėlgi mes patikriname loginę reikšmę, kad atnaujintume ekrano dažnių diapazoną, mes turime tai padaryti, nes OLED veikimo principas yra labai keistas.
display.setCursor (45, 20); display.println (skaitiklis); // ekrane atspausdinkite skaitiklio informaciją. if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // spausdinti Hz ekrano ekrane.display (); // kai visi rinkiniai atnaujina ekraną} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // kai visi rinkiniai atnaujina ekraną} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println („Mhz“); display.display (); // kai visi rinkiniai atnaujina ekraną}
Tada patikriname mygtuko paspaudimo kintamąjį, kad spausdintumėte išvestį / išvestį į OLED. Vėlgi tai reikia padaryti dėl OLED modulio.
if (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print („Output ON“); // spausdinti išvestį į ekrano ekraną.display (); display.setTextSize (2); } else {display.setTextSize (1); display.setCursor (65, 45); display.print („Output OFF“); // spausdinti išvestį į ekrano ekraną.display (); display.setTextSize (2); }
Tai žymi mūsų kodavimo proceso pabaigą. Jei šiuo metu esate sutrikęs, galite sužinoti komentarus kode, kad suprastumėte.
„AD9833“ pagrindu sukurtų funkcijų generatoriaus testavimas
Norėdami patikrinti grandinę, naudojama aukščiau nustatyta sąranka. Kaip matote, mes prijungėme 12 V nuolatinės srovės maitinimo adapterį prie nuolatinės srovės vamzdžio lizdo ir „Hantek“ osciloskopą prie grandinės išvesties. Mes taip pat prijungėme osciloskopą prie nešiojamojo kompiuterio, kad galėtume vizualizuoti ir išmatuoti išėjimo dažnį.
Tai padarius, sukamojo kodavimo priemonės pagalba nustatome išėjimo dažnį į 5Khz ir išbandome išėjimo sinusinę bangą ir tikrai 5 kHz sinuso banga išėjime.
Tada mes pakeitėme išėjimo bangos formą į trikampę bangą, tačiau dažnis liko tas pats, išėjimo bangos forma parodyta žemiau.
Tada mes pakeitėme išėjimą į kvadratinę bangą ir stebėjome išvestį, ir tai buvo puiki kvadratinė banga.
Mes taip pat pakeitėme dažnių diapazonus ir išbandėme išvestį, ir tai veikė gerai.
Kiti patobulinimai
Ši grandinė yra tik koncepcijos įrodymas ir ją reikia dar patobulinti. Pirma, mums reikia geros kokybės PCB ir geros kokybės BNC jungties išėjimui, kitaip negalime gauti didesnio dažnio. Modulio amplitudė yra labai maža, todėl norint tai sustiprinti, mums reikia kai kurių op-amp grandinių, kad sustiprintume išėjimo įtampą. Norint pakeisti išėjimo amplitudę, galima prijungti potenciometrą. Gali būti prijungtas jungiklis signalo kompensavimui; tai taip pat turi turėti funkciją. Be to, kodą reikia daug patobulinti, nes jis šiek tiek klaidingas. Galiausiai reikia pakeisti OLED ekranus, kitaip neįmanoma parašyti lengvai suprantamo kodo.
Tai žymi šios pamokos pabaigą, tikiuosi, kad jums patiko straipsnis ir sužinojote kažką naujo. Jei turite klausimų dėl straipsnio, galite juos palikti komentarų skyriuje žemiau arba galite naudoti mūsų elektronikos forumą.