- Čo je generátor funkcií DDS?
- Pochopte fungovanie integrovaného obvodu generátora funkcií AD9833
- Komponenty požadované na zostavenie funkčného generátora založeného na AD9833
- Generátor funkcií založený na AD9833 - schematický diagram
- Generátor funkcií na báze AD9833 - Arduino kód
- Testovanie funkčného generátora založeného na AD9833
- Ďalšie vylepšenia
Ak ste elektronický nadšenec ako ja, ktorý sa chce doladiť rôznymi elektronickými obvodmi, mať slušný generátor funkcií sa niekedy stáva povinným. Ale vlastniť jeden je problém, pretože také základné vybavenie môže stáť majland. Budovanie vlastného testovacieho zariadenia je nielen lacnejšie, ale aj vynikajúci spôsob, ako vylepšiť svoje vedomosti.
V tomto článku teda budeme budovať jednoduchý generátor signálu s modulmi generátora funkcií Arduino a AD9833 DDS, ktorý dokáže vytvárať sínusové, štvorcové a trojuholníkové vlny s maximálnou frekvenciou 12 MHz na výstupe. A nakoniec budeme testovať výstupnú frekvenciu pomocou nášho osciloskopu.
Predtým sme pomocou základných analógových obvodov vytvorili jednoduchý generátor sínusových vĺn, generátor štvorcových vĺn a trojuholníkový generátor. Môžete ich skontrolovať, ak hľadáte základné obvody generátora kriviek. Ak chcete vytvoriť lacnejší generátor funkcií Arduino bez použitia modulu AD9833, môžete si pozrieť projekt DIY Arduino Waveform Generator.
Čo je generátor funkcií DDS?
Ako už z názvu vyplýva, funkčný generátor je zariadenie, ktoré dokáže po nastavení vydať konkrétny tvar vlny so špecifickou frekvenciou. Napríklad vezmime do úvahy, že máte LC filter, pre ktorý chcete otestovať svoju výstupnú frekvenčnú odozvu, čo môžete ľahko urobiť pomocou generátora funkcií. Všetko, čo musíte urobiť, je nastaviť požadovanú výstupnú frekvenciu a priebeh, potom ich môžete pretočiť smerom dole alebo hore, aby ste otestovali odozvu. Bol to iba jeden príklad, môžete s ním robiť viac vecí, ako bude zoznam pokračovať.
DDS je skratka pre Direct Digital Synthesis. Je to typ generátora kriviek, ktorý používa digitálne analógové prevodníky (DAC) na vytvorenie signálu od základu. Táto metóda sa špeciálne používa na generovanie sínusovej vlny. Ale IC, ktorý používame, môže produkovať signály štvorcových alebo trojuholníkových vĺn. Operácie, ktoré sa stali vo vnútri DDS čipu, sú digitálne, takže dokáže veľmi rýchlo prepínať frekvenciu alebo veľmi rýchlo prepínať z jedného signálu na druhý. Toto zariadenie má jemné frekvenčné rozlíšenie so širokým frekvenčným spektrom.
Pochopte fungovanie integrovaného obvodu generátora funkcií AD9833
Srdcom nášho projektu je programovateľný generátor vlnových tvarov AD9833, ktorý je navrhnutý a vyvinutý analógovými zariadeniami. Jedná sa o programovateľný generátor vĺn s nízkou spotrebou energie, ktorý je schopný vytvárať sínusové, trojuholníkové a štvorcové vlny s maximálnou frekvenciou 12 MHz. Je to veľmi jedinečný integrovaný obvod, ktorý je schopný meniť výstupnú frekvenciu a fázu iba pomocou softvérového programu. Má 3-vodičové rozhranie SPI, a preto je komunikácia s týmto IC veľmi jednoduchá a ľahká. Ďalej je uvedený funkčný blokový diagram tohto integrovaného obvodu.
Fungovanie tohto integrovaného obvodu je veľmi jednoduché. Ak sa pozrieme na funkčný blokový diagram vyššie, zistíme, že máme fázový akumulátor, ktorého úlohou je ukladať všetky možné digitálne hodnoty sínusovej vlny začínajúce od 0 do 2π. Ďalej tu máme SIN ROM, ktorého úlohou je prevádzať fázové informácie, ktoré je možné neskôr priamo namapovať na amplitúdu. SIN ROM používa informácie o digitálnej fáze ako adresu vyhľadávacej tabuľky a prevádza informácie o fáze na amplitúdu. A nakoniec máme 10-bitový digitálny na analógový prevodník, ktorého úlohou je prijímať digitálne údaje zo SIN ROM a prevádzať ich na zodpovedajúce analógové napätia, to je to, čo dostávame z výstupu. Na výstupe máme tiež prepínač, ktorý môžeme zapnúť alebo vypnúť iba pomocou malého softvérového kódu. O tom si povieme neskôr v článku.Podrobnosti, ktoré vidíte vyššie, sú veľmi zbavenou verziou toho, čo sa deje vo vnútri IC. Väčšina podrobností, ktoré vidíte vyššie, je prevzatých z údajového listu AD9833. Môžete si tiež pozrieť ďalšie informácie.
Komponenty požadované na zostavenie funkčného generátora založeného na AD9833
Komponenty potrebné na zostavenie funkčného generátora založeného na AD9833 sú uvedené nižšie. Tento obvod sme navrhli s veľmi všeobecnými komponentmi, čo veľmi uľahčuje proces replikácie.
- Arduino Nano - 1
- AD9833 Generátor funkcií DDS - 1
- 128 X 64 OLED displej - 1
- Generický rotačný kódovač - 1
- DC hlaveň Jack - 1
- Regulátor napätia LM7809 - 1
- 470uF kondenzátor - 1
- Kondenzátor 220uF - 1
- Kondenzátor 104pF - 1
- 10K rezistor - 6
- Hmatové spínače - 4
- Skrutkovacia svorka 5,04 mm - 1
- Ženská hlavička - 1
- 12V zdroj energie - 1
Generátor funkcií založený na AD9833 - schematický diagram
Kompletná schéma zapojenia pre generátor funkcií AD9833 a Arduino je uvedená nižšie.
Na generovanie požadovanej frekvencie použijeme AD9833 s Arduinom. A v tejto časti vysvetlíme všetky podrobnosti pomocou schémy; dovoľte mi, aby som vám dal stručný prehľad o tom, čo sa deje s obvodom. Začnime s modulom AD9833. Modul AD9833 je modul generátora funkcií a je pripojený k Arduinu podľa schémy. Na napájanie obvodu používame IC regulátora napätia LM7809 so slušným oddeľovacím kondenzátorom, čo je nevyhnutné, pretože napájací šum môže interferovať s výstupným signálom a viesť k nežiaducemu výstupu. Ako vždy, Arduino pracuje ako mozog pre tento projekt. Pre zobrazenie nastavenej frekvencie a ďalších cenných informácií sme pripojili 128 X 64 OLED zobrazovací modul. Na zmenu frekvenčného rozsahu používame tri prepínače. Prvý nastavuje frekvenciu na Hz, druhý nastavuje výstupnú frekvenciu na KHz a tretí nastavuje frekvenciu na MHz. Máme tiež ďalšie tlačidlo, pomocou ktorého je možné výstup povoliť alebo zakázať. Nakoniec máme rotačný kódovač,a musíme s ním pripojiť nejaký pull-up rezistor, inak tieto prepínače nebudú fungovať, pretože kontrolujeme udalosť stlačenia tlačidla na združenej metóde. Rotačný kódovač sa používa na zmenu frekvencie a dotykový spínač vo vnútri rotačného kódovacieho zariadenia sa používa na výber nastaveného priebehu.
Generátor funkcií na báze AD9833 - Arduino kód
Celý kód použitý v tomto projekte nájdete v spodnej časti tejto stránky. Po pridaní požadovaných súborov hlavičiek a zdrojových súborov by ste mali byť schopní priamo zostaviť súbor Arduino. Knižnicu ad9833 Arduino a ďalšie knižnice si môžete stiahnuť z odkazu uvedeného nižšie, inak môžete knižnicu nainštalovať pomocou metódy správcu dosiek.
- Stiahnite si knižnicu AD9833 od Billa Williamsa
- Stiahnite si SSD1306 OLED Library od spoločnosti Adafruit
- Stiahnite si knižnicu Adafruit GFX
Vysvetlenie kódu v ino. súbor je nasledovný. Najskôr začneme zahrnutím všetkých požadovaných knižníc. Po knižnici pre modul AD9833 DDS nasleduje knižnica pre OLED a pre niektoré naše výpočty sa vyžaduje matematická knižnica.
#include // Knižnica pre modul AD9833 #include
Ďalej definujeme všetky potrebné vstupné a výstupné piny pre tlačidlá, prepínač, rotačný kódovač a OLED.
#define SCREEN_WIDATA_PINH 128 // OLED šírka displeja v pixeloch #define SCREEN_HEIGHT 64 // výška OLED displeja, v pixeloch #define SET_FREQUENCY_HZ A2 // tlačidlo na nastavenie frekvencie v Hz #define SET_FREQUENCY_KHZ A3 // tlačidlo na nastavenie frekvencie v khz # HZF A6 // Tlačidlo na nastavenie frekvencie v Mhz #define ENABLE_DISABLE_OUTPUT_PIN A7 // Tlačidlo na zapnutie / vypnutie výstupu #define FNC_PIN 4 // Fsync vyžadované modulom AD9833 #define CLK_PIN 8 // Pin hodín enkodéra #define DATA_PIN 7 / / Dátový kolík kódovacieho zariadenia #define BTN_PIN 9 // Interné tlačidlo na kódovacom zariadení
Potom definujeme všetky potrebné premenné, ktoré sú požadované v tomto kóde. Najskôr definujeme celočíselné premenné počítadlo, ktoré uloží hodnotu rotačného kódovacieho zariadenia. Nasledujúce dve premenné clockPin a clockPinState ukladajú sochu kolíka, ktorá je potrebná na pochopenie smeru kódovacieho zariadenia. Máme časovú premennú, ktorá obsahuje aktuálne hodnoty časovača a počítadla, táto premenná sa používa na odblokovanie tlačidla. Ďalej máme nepodpísanú dlhú premennú moduleFrequency, ktorá drží vypočítanú frekvenciu, ktorá sa má použiť. Ďalej tu máme oneskorenie debounce. Toto oneskorenie je možné upraviť podľa potreby. Ďalej máme tri boolovské premenné set_frequency_hz,set_frequency_Khz a set_frequency_Mhz tieto tri premenné slúžia na určenie aktuálneho nastavenia modulu. O tom si podrobnejšie povieme neskôr v článku. Ďalej máme premennú, ktorá ukladá stav výstupného priebehu, predvolený výstupný priebeh je sínusový. A nakoniec máme premennú encoder_btn_count, ktorá drží počet tlačidiel enkodéra, ktorý sa používa na nastavenie výstupného priebehu.
int counter = 1; // Táto hodnota počítadla sa zvýši alebo zníži, ak sa otočí rotačný kódovač do clockPin; // Zástupný symbol stavu pinov používaný rotačným kódovačom int clockPinState; // Zástupný symbol stavu pinov používaný rotačným kódovačom nepodpísaný dlho = 0; // Používa sa na odblokovanie nepodpísaného dlhého moduluFrequency; // slúži na nastavenie výstupnej frekvencie long debounce = 220; // oneskorenie odskoku bool btn_state; // slúži na povolenie deaktivácie výstupu modulu AD98333 bool set_frequency_hz = 1; // Frekvencia poruchy modulu AD9833 bool set_frequency_khz; bool set_frequency_mhz; String waveSelect = "SIN"; // Startup waveform of the module int encoder_btn_count = 0; // slúži na kontrolu stlačenia tlačidla enkodéra Ďalej máme dva objekty, jeden je určený pre OLED displej a ďalší je určený pre modul AD9833.Displej Adafruit_SSD1306 (SCREEN_WIDATA_PINH, SCREEN_HEIGHT, & Wire, -1); AD9833 gen (FNC_PIN);
Ďalej máme našu funkciu setup (), v tejto funkcii nastavenia začneme povolením sériového rozhrania na ladenie. Modul AD9833 inicializujeme pomocou metódy start (). Ďalej nastavíme všetky priradené kolíky rotačného kódovacieho zariadenia ako Vstup. Hodnotu kolíka hodín uložíme do premennej clockPinState, čo je nevyhnutný krok pre rotačný kódovač.
Ďalej nastavíme všetky piny tlačidiel ako vstupné a pomocou metódy display.begin () povolíme OLED displej a taktiež skontrolujeme prípadné chyby príkazom if . Keď je to hotové, vyčistíme displej a vytlačíme úvodnú úvodnú obrazovku, pridáme oneskorenie 2 sekundy, čo je tiež oneskorenie úvodnej obrazovky, a nakoniec zavoláme funkciu update_display (), ktorá vymaže obrazovku a aktualizuje ešte raz. Podrobnosti o metóde update_display () si rozoberieme ďalej v článku.
void setup () {Serial.begin (9600); // Povoliť Serial @ 9600 baud gen.Begin (); // MUSÍ to byť prvý príkaz po vyhlásení objektu AD9833 pinMode (CLK_PIN, INPUT); // Nastavenie pinov ako vstupných pinMode (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Nastavenie pinov ako vstupných pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adresa 0x3D pre 128x64 Serial.println (F ("alokácia SSD1306 zlyhala")); pre (;;); } display.clearDisplay (); // Vymazanie obrazovky display.setTextSize (2); // Nastaviť veľkosť textu display.setTextColor (BIELA); // nastavenie farebného LCD displeja.setCursor (30, 0); // Nastaviť pozíciu kurzora display.println ("AD9833"); // Vytlačí tento textový displej.setCursor (17, 20); // Nastaviť pozíciu kurzora display.println ("Funkcia"); // Vytlačte tento text display.setCursor (13, 40); // Nastaviť pozíciu kurzora display.println ("Generátor"); // Vytlačte tento text display.display (); // Aktualizácia oneskorenia zobrazenia (2000); // Oneskorenie 2 SEK update_display (); // Volať update_display Function}
Ďalej tu máme našu funkciu loop (), všetky hlavné funkcie sú napísané v sekcii loop.
Najskôr si prečítame pin hodín rotačného kódovacieho zariadenia a uložíme ho do premennej clockPin, ktorú sme už deklarovali. Ďalej v ak vyhlásení, skontrolujeme, či predchádzajúca hodnota čapu a aktuálna hodnota čapu je podobná alebo nie, a my tiež skontrolovať aktuálnu hodnotu čapu. Ak je to všetko pravda, skontrolujeme údajový kolík, ak je to pravda, znamená to, že sa kódovač otáča proti smeru hodinových ručičiek, a pomocou príkazu counter-- znížime hodnotu počítadla. Inak zvýšime hodnotu počítadla príkazom counter ++. Nakoniec sme dať ďalšie , ak vyhlásenie nastaviť minimálnu hodnotu 1. Ďalšie aktualizujeme na clockPinState s aktuálnym clockPinhodnota pre budúce použitie.
void loop () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {counter -; } else {counter ++; // Kodér otáča CW tak, aby sa zvyšoval} if (counter <1) counter = 1; Serial.println (počítadlo); update_display (); }
Ďalej máme náš kód na detekciu stlačenia tlačidla. V tejto časti sme detekovali tlačidlo vo vnútri kódovacieho zariadenia pomocou niektorých vnorených príkazov if, if (digitalRead (BTN_PIN) == LOW && millis () - time> denounce), v tomto vyhlásení najskôr skontrolujeme, či je tlačidlo pin je nízky alebo nie, ak je nízky, potom je stlačený. Potom znova skontrolujeme hodnotu časovača so oneskorením debounce, ak sú oba výroky pravdivé, potom ho vyhlásime za úspešnú akciu stlačenia tlačidla, ak áno, zvýšime hodnotu encoder_btn_count. Ďalej deklarujeme ďalší príkaz if na nastavenie maximálnej hodnoty počítadla na 2, potrebujeme ho, pretože ho používame na nastavenie výstupného priebehu.Nasledujúce tri výroky if to robia, ak je hodnota nula, vyberie sa sínusový priebeh, ak je jeden, je to obdĺžniková vlna a ak je hodnota 2, je to trojuholníková vlna. Vo všetkých troch z týchto príkazov if aktualizujeme zobrazenie pomocou funkcie update_display () . A nakoniec aktualizujeme časovú premennú o aktuálnu hodnotu počítadla časovača.
// Ak zistíme NÍZKY signál, stlačí sa tlačidlo, ak (digitalRead (BTN_PIN) == LOW && millis () - čas> debounce) {encoder_btn_count ++; // Zvýšte hodnoty if (encoder_btn_count> 2) // ak je hodnota väčšia ako 2 vynulujte ju na 0 {encoder_btn_count = 0; } if (encoder_btn_count == 0) {// ak je hodnota 0 sínusoida je vybraná waveSelect = "SIN"; // aktualizácia premennej reťazca hodnotou hriechu update_display (); // aktualizovať zobrazenie} if (encoder_btn_count == 1) {// ak je vybratá hodnota 1 štvorcová vlna je vybraný waveSelect = "SQR"; // aktualizácia premennej reťazca hodnotou SQR update_display (); // aktualizovať zobrazenie} if (encoder_btn_count == 2) {// ak je hodnota 1 Je vybraná trojuholníková vlna waveSelect = "TRI"; // aktualizácia premennej reťazca hodnotou TRI update_display ();// aktualizácia displeja} time = millis (); // aktualizácia časovej premennej}
Ďalej definujeme všetok potrebný kód, ktorý je potrebný na nastavenie všetkých tlačidiel so oneskorením odskoku. Pretože sú tlačidlá pripojené k analógovým kolíkom Arduina, pomocou príkazu na analógové čítanie identifikujeme stlačenie tlačidla, ak hodnota analógového čítania klesne pod 30, potom detekujeme jeho úspešné stlačenie tlačidla a počkáme 200 ms, aby skontrolujte, či sa jedná o skutočné stlačenie tlačidla alebo iba zvuk. Ak je toto tvrdenie pravdivé, priradíme boolovským premenným hodnoty, ktoré sa používajú na nastavenie hodnôt Hz, Khz a Mhz generátora funkcií. Ďalej aktualizujeme displej a aktualizujeme časovú premennú. Robíme to pre všetky štyri tlačidlá spojené s Arduinom.
if (analogRead (SET_FREQUENCY_HZ) <30 && millis () - čas> debounce) {set_frequency_hz = 1; // aktualizácia boolovských hodnôt set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // aktualizovať čas zobrazenia = millis (); // aktualizovať časovú premennú} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - čas> debounce) {set_frequency_hz = 0; // aktualizácia boolovských hodnôt set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = counter * 1000; update_display (); // aktualizovať čas zobrazenia = millis (); // aktualizovať časovú premennú} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - čas> debounce) {// skontrolovať analógový pin s oneskorením debounce set_frequency_hz = 0; // aktualizácia boolovských hodnôt set_frequency_khz = 0; set_frequency_mhz = 1; moduleFrequency = counter * 10 000 000; update_display ();// aktualizovať čas zobrazenia = millis (); // aktualizovať časovú premennú} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - čas> debounce) {// skontrolovať analógový pin s oneskorením debounce btn_state =! btn_state; // Invertuje stav tlačidla gen.EnableOutput (btn_state); // Povolenie / zakázanie výstupu generátora funkcií v závislosti na stave tlačidla update_display (); // aktualizácia času zobrazenia = millis (); // aktualizácia časovej premennej}}// aktualizácia časovej premennej}}// aktualizácia časovej premennej}}
Na záver tu máme našu funkciu update_display (). V tejto funkcii sme dokázali oveľa viac než len aktualizáciu tohto displeja, pretože určitú časť displeja nie je možné aktualizovať v OLED. Ak ho chcete aktualizovať, musíte ho znova vymaľovať novými hodnotami. To značne komplikuje proces kódovania.
Vo vnútri tejto funkcie začneme čistením displeja. Ďalej nastavíme požadovanú veľkosť textu. Potom sme nastavili náš kurzor a vytlačili sme Generátor funkcií pomocou display.println ("Funkčná funkcia"); príkaz. Pomocou funkcie display.setCursor (0, 20) sme opäť nastavili veľkosť textu na 2 a kurzor na (0,20).
Tu tlačíme informácie o tom, o akú vlnu ide.
display.clearDisplay (); // PRVÉ vyčistenie displeja display.setTextSize (1); // nastavenie textu Veľkosť display.setCursor (10, 0); // Nastaviť pozíciu kurzora display.println ("Generátor funkcií"); // vytlačiť text display.setTextSize (2); // nastaviť veľkosť textu display.setCursor (0, 20); // nastaviť pozíciu kurzora
Ďalej skontrolujeme boolovské premenné, či neobsahujú podrobnosti o frekvencii, a aktualizujeme hodnotu v premennej moduleFrequency. Robíme to pre hodnoty Hz, kHz a MHz. Ďalej skontrolujeme premennú waveSelect a identifikujeme, ktorá vlna je vybraná. Teraz máme hodnoty na nastavenie typu a frekvencie vĺn.
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// skontrolovať, či je stlačené tlačidlo pre nastavenie frekvencie v Hz moduleFrequency = counter; // aktualizujte premennú moduleFrequency o aktuálnu hodnotu počítadla} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// skontrolujte, či je stlačené tlačidlo pre nastavenie frekvencie v KHz moduleFrequency = counter * 1000; // aktualizovať premennú moduleFrequency o aktuálnu hodnotu počítadla, ale vynásobíme 1000, aby sme ju nastavili na KHZ} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// skontrolovať, či je stlačené tlačidlo pre nastavenie frekvencie v MHz = počítadlo * 10 000 000; if (moduleFrequency> 12000000) {moduleFrequency = 12000000;// nenechajte frekvenciu strúhať, že 12Mhz čítač = 12; }} if (waveSelect == "SIN") {// Je vybratá sínusová vlna display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Je vybraná vlna Sqr display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Je vybraná tri vlna display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // aktualizácia modulu AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Je vybraná vlna Sqr display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Je vybraná tri vlna display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // aktualizácia modulu AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Je vybraná vlna Sqr display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Je vybraná tri vlna display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // aktualizácia modulu AD9833. Serial.println (moduleFrequency); }
Znovu nastavíme kurzor a aktualizujeme hodnoty počítadla. Opäť skontrolujeme logickú hodnotu, aby sme aktualizovali frekvenčný rozsah na displeji, musíme to urobiť, pretože princíp fungovania OLED je veľmi zvláštny.
display.setCursor (45, 20); display.println (počítadlo); // vytlačí informácie o počítadle na displej. if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // tlač Hz na displej display.display (); // when all set update the display} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // when all set update the display} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // keď všetky nastavenia aktualizujú displej}
Ďalej skontrolujeme premennú stlačenia tlačidla, aby sme tlačili výstup na OLED. Toto je opäť potrebné urobiť kvôli modulu OLED.
if (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("Výstup ZAPNUTÝ"); // tlačový výstup na displej display.display (); display.setTextSize (2); } else {display.setTextSize (1); display.setCursor (65, 45); display.print ("Výstup VYPNUTÝ"); // tlačový výstup vypnutý na displej display.display (); display.setTextSize (2); }
Týmto sa končí náš proces kódovania. Ak ste v tejto chvíli zmätení, môžete si pre lepšie porozumenie prečítať komentáre v kóde.
Testovanie funkčného generátora založeného na AD9833
Na testovanie obvodu sa používa vyššie uvedené nastavenie. Ako vidíte, pripojili sme napájací adaptér 12V DC na konektor DC a na výstup obvodu sme pripojili osciloskop Hantek. Pripojili sme tiež osciloskop k notebooku na vizualizáciu a meranie výstupnej frekvencie.
Keď to bolo urobené, nastavili sme pomocou rotačného kódovacieho zariadenia výstupnú frekvenciu na 5 KHz a otestujeme výstupnú sínusovú vlnu a celkom iste, je to 5Khz sínusová vlna na výstupe.
Ďalej sme zmenili výstupný priebeh na trojuholníkový priebeh, ale frekvencia zostala rovnaká, výstupný priebeh je zobrazený nižšie.
Potom sme výstup zmenili na obdĺžnikovú vlnu a pozorovali sme výstup. Bola to dokonalá obdĺžniková vlna.
Tiež sme zmenili frekvenčné rozsahy a otestovali sme výstup, ktorý fungoval dobre.
Ďalšie vylepšenia
Tento obvod je iba dôkazom koncepcie a vyžaduje ďalšie vylepšenia. Najprv potrebujeme kvalitný PCB a nejaký kvalitný BNC konektor pre výstup, inak nemôžeme získať vyššiu frekvenciu. Amplitúda modulu je veľmi nízka, aby sme to vylepšili, potrebujeme na zosilnenie výstupného napätia nejaké obvody operačného zosilňovača. Na zmenu výstupnej amplitúdy je možné pripojiť potenciometer. Môže byť pripojený prepínač na vyrovnanie signálu; toto je tiež nevyhnutná vlastnosť. A ďalej, kód potrebuje veľa vylepšenia, pretože je trochu chybný. Nakoniec je potrebné zmeniť OLED displeje, inak nie je možné napísať ľahko pochopiteľný kód.
Týmto sa končí tento návod, dúfam, že sa vám článok páčil a dozvedeli ste sa niečo nové. Ak máte akékoľvek otázky týkajúce sa článku, môžete ich zanechať v sekcii komentárov nižšie alebo môžete použiť naše Fórum elektroniky.