- Što je generator DDS funkcija?
- Razumijevanje rada IC-a generatora funkcija AD9833
- Komponente potrebne za izgradnju generatora funkcija koji se temelji na AD9833
- Generator funkcija na temelju AD9833 - shematski dijagram
- Generator funkcija temeljen na AD9833 - Arduino kod
- Ispitivanje generatora funkcija temeljenog na AD9833
- Daljnja poboljšanja
Ako ste ljubitelj elektronike poput mene i želite se prilagoditi različitim elektroničkim sklopovima, posjedovanje pristojnog generatora funkcija ponekad postaje obavezno. Ali posjedovanje jednog problema predstavlja problem jer takva osnovna oprema može koštati bogatstvo. Izgradnja vlastite opreme za testiranje ne samo da je jeftinija, već je i sjajan način da poboljšate svoje znanje.
Dakle, u ovom ćemo članku izgraditi jednostavan generator signala s Arduinom i AD9833 DDS funkcijskim modulom generatora koji mogu stvarati sinusne, kvadratne i trokutaste valove s maksimalnom frekvencijom od 12 MHz na izlazu. I na kraju, ispitat ćemo izlaznu frekvenciju uz pomoć našeg osciloskopa.
Prethodno smo izgradili jednostavni generator sinusnih valova, generator kvadratnih valova i generator valova trokuta uz pomoć osnovnih analognih sklopova. Možete ih provjeriti ako tražite neke osnovne krugove generatora valnih oblika. Također, ako želite izraditi jeftiniji generator funkcije Arduino bez upotrebe modula AD9833, možete provjeriti projekt DIY Arduino Waveform Generator.
Što je generator DDS funkcija?
Kao što naziv govori, generator funkcija je uređaj koji može postaviti određeni valni oblik s određenom frekvencijom nakon postavljanja. Na primjer, uzmite u obzir da imate LC filtar za koji želite testirati svoj izlazni frekvencijski odziv, to možete lako učiniti uz pomoć generatora funkcija. Sve što trebate je postaviti željenu izlaznu frekvenciju i valni oblik, a zatim ga možete okretati prema dolje ili gore kako biste testirali odgovor. Ovo je bio samo jedan primjer, s tim možete raditi više stvari kako se popis nastavlja.
DDS je kratica za Direct Digital Synthesis. To je vrsta generatora valnih oblika koji koristi digitalno-analogne pretvarače (DAC) za izgradnju signala od temelja. Ova se metoda posebno koristi za generiranje sinusnog vala. Ali IC koji koristimo može proizvesti kvadratne ili trokutaste valne signale. Operacije koje su se dogodile unutar DDS čipa su digitalne, tako da može vrlo brzo prebaciti frekvenciju ili se vrlo brzo prebaciti s jednog signala na drugi. Ovaj uređaj ima finu frekvencijsku razlučivost sa širokim frekvencijskim spektrom.
Razumijevanje rada IC-a generatora funkcija AD9833
U središtu našeg projekta je IC9898 programabilni IC generator generatora valova koji su dizajnirani i razvijeni od analognih uređaja. To je programirljivi generator valnog oblika male snage koji može proizvesti sinusni, trokutasti i kvadratni val s maksimalnom frekvencijom od 12 MHz. To je vrlo jedinstveni IC koji je sposoban promijeniti izlaznu frekvenciju i fazu pomoću samo softverskog programa. Ima 3-žično SPI sučelje zbog čega komunikacija s ovim IC postaje vrlo jednostavna i lagana. Dijagram funkcionalnog bloka ovog IC prikazan je u nastavku.

Rad ove IC vrlo je jednostavan. Ako pogledamo gornji funkcionalni blok dijagram, primijetit ćemo da imamo fazni akumulator čiji je posao pohraniti sve moguće digitalne vrijednosti sinusnog vala, počevši od 0 do 2π. Dalje, imamo SIN ROM čiji je zadatak pretvoriti podatke o fazi koji se kasnije mogu izravno preslikati u amplitudu. SIN ROM koristi podatke digitalne faze kao adresu tablice pretraživanja i pretvara podatke o fazi u amplitudu. I na kraju, imamo 10-bitni digitalni u analogni pretvarač čiji je zadatak primati digitalne podatke sa SIN ROM-a i pretvarati ih u odgovarajuće analogne napone, to je ono što dobivamo iz izlaza. Na izlazu imamo i prekidač koji možemo uključiti ili isključiti uz samo malo softverskog koda. O tome ćemo kasnije u članku.Pojedinosti koje vidite gore vrlo su ogoljena verzija onoga što se događa unutar IC-a, a većina pojedinosti koje vidite gore preuzete su iz podatkovne tablice AD9833, a možete je potražiti i za daljnje informacije.
Komponente potrebne za izgradnju generatora funkcija koji se temelji na AD9833
Komponente potrebne za izgradnju generatora funkcija temeljenog na AD9833 navedene su u nastavku, ovaj smo sklop dizajnirali s vrlo generičkim komponentama, što postupak replikacije čini vrlo jednostavnim.
- Arduino Nano - 1
- AD9833 DDS generator funkcija - 1
- 128 X 64 OLED zaslon - 1
- Generički rotacijski koder - 1
- DC bačva Jack - 1
- LM7809 Regulator napona - 1
- Kondenzator 470uF - 1
- Kondenzator 220uF - 1
- Kondenzator 104pF - 1
- Otpornik 10K - 6
- Taktilni prekidači - 4
- Vijčana stezaljka 5,04 mm - 1
- Žensko zaglavlje - 1
- Izvor napajanja od 12 V - 1
Generator funkcija na temelju AD9833 - shematski dijagram
Kompletna shema sklopa za AD9833 i generator funkcija zasnovanih na Arduinu prikazana je u nastavku.

Upotrijebit ćemo AD9833 s Arduinom za generiranje željene frekvencije. I u ovom ćemo odjeljku objasniti sve detalje uz pomoć sheme; dopustite mi da vam dam kratki pregled onoga što se događa s krugom. Počnimo s modulom AD9833. Modul AD9833 modul je generatora funkcija i povezan je s Arduinom prema shemi. Za napajanje kruga koristimo IC napona LM7809 s pristojnim kondenzatorom za odvajanje, što je neophodno jer opskrbni šum može ometati izlazni signal što rezultira neželjenim izlazom. Kao i uvijek, Arduino radi kao mozak za ovaj projekt. Da bismo prikazali postavljenu frekvenciju i ostale vrijedne informacije, spojili smo 128 X 64 OLED modul zaslona. Za promjenu frekvencijskog područja koristimo tri prekidača. Prvi postavlja frekvenciju na Hz, drugi postavlja izlaznu frekvenciju na KHz, a treći postavlja frekvenciju na MHz, imamo i drugi gumb koji se može koristiti za omogućavanje ili onemogućavanje izlaza. Konačno, imamo rotacijski koder,i moramo na njega priključiti neki otpornik na izvlačenje, inače ti prekidači neće raditi jer provjeravamo događaj pritiska gumba na metodi udruživanja. Rotacijski davač koristi se za promjenu frekvencije, a taktilni prekidač unutar rotacijskog kodera koristi se za odabir postavljenog valnog oblika.

Generator funkcija temeljen na AD9833 - Arduino kod
Kompletni kod korišten u ovom projektu nalazi se na dnu ove stranice. Nakon dodavanja potrebnih datoteka zaglavlja i izvornih datoteka, trebali biste biti u mogućnosti izravno prevesti Arduino datoteku. Knjižnicu ad9833 Arduino i druge knjižnice možete preuzeti s donje veze ili možete koristiti metodu upravitelja ploče za instalaciju knjižnice.
- Preuzmi biblioteku AD9833, Bill Williams
- Preuzmite SSD1306 OLED knjižnicu tvrtke Adafruit
- Preuzmite knjižnicu Adafruit GFX
Objašnjenje koda u ino. datoteka je kako slijedi. Prvo započinjemo uključivanjem svih potrebnih knjižnica. Nakon knjižnice za AD9833 DDS modul slijedi knjižnica za OLED, a za neke od naših izračuna potrebna je matematička knjižnica.
#include // LIbrary za AD9833 modul #include
Dalje, definiramo sve potrebne ulazne i izlazne igle za tipke, prekidač, okretni koder i OLED-ove.
#define SCREEN_WIDATA_PINH 128 // OLED Širina zaslona u pikselima #define SCREEN_HEIGHT 64 // OLED visina zaslona, u pikselima #define SET_FREQUENCY_HZ A2 // Tipkalo za podešavanje frekvencije u Hz #define SET_FREQUENCY_KHZ AH // SET gumb F_HZF_HZF_HZF_HZF_HZF_HZF_HZF_HZF_HZF_HZF_HZF_HZF_HZF_HZF_HZF_HZF_HZF_HZF_HZF_KVZF_KVZF_KVZF.ZA KV.Z.Z.Z.Z.Z.Z.V.Z.Z.Z.Z.Z.Z.Z.Z.Z.V.Z.Z.V.Z.Z. KV.Z. ZV.Č.Z._K.Z._V.Z._Z.Č.V.Z. A6 // Tipkalo za podešavanje frekvencije u MHz #define ENABLE_DISABLE_OUTPUT_PIN A7 // Tipkalo za omogućavanje / onemogućavanje izlaza #define FNC_PIN 4 // Fsync zahtijeva AD9833 modul #define CLK_PIN 8 // Clock Pin of the Encoder #Din 7 / Podaci za kodiranje #define BTN_PIN 9 // Unutarnji gumb na koderu
Nakon toga definiramo sve potrebne varijable koje su potrebne u ovom kodu. Prvo definiramo brojač varijabli s cijelim brojem koji će pohraniti vrijednost rotacijskog kodera. Sljedeće dvije varijable clockPin i clockPinState spremaju statuu pin-a koja je potrebna za razumijevanje smjera kodera. Imamo vremensku varijablu koja sadrži trenutne vrijednosti brojača vremena, ta se varijabla koristi za otkazivanje tipki. Dalje, imamo nepotpisani dugački varijabilni moduleFrequency koji sadrži izračunatu frekvenciju koja će se primijeniti. Dalje, imamo odgodu otkazivanja. Ovo se kašnjenje može prilagoditi prema potrebi. Dalje, imamo tri logičke varijable set_frequency_hz,set_frequency_Khz i set_frequency_Mhz ove tri varijable koriste se za određivanje trenutne postavke modula. O tome ćemo detaljnije govoriti kasnije u članku. Dalje, imamo varijablu koja pohranjuje status izlaznog valnog oblika, zadani izlazni valni oblik je sinusni val. I na kraju, imamo varijablu encoder_btn_count koja sadrži broj gumba enkodera koji se koristi za postavljanje izlaznog valnog oblika.
int brojač = 1; // Ova vrijednost brojača povećat će se ili smanjiti ako se okretajući koder okrene int clockPin; // Placeholder za status pina koji koristi rotacijski koder int clockPinState; // Placeholder za status pina koji koristi okretni koder nepotpisano dugo = 0; // Koristi se za uklanjanje nepotpisanih dugih moduleFrequency; // koristi se za postavljanje izlazne frekvencije long debounce = 220; // Odgoda odbijanja bool btn_state; // koristi se za omogućavanje onemogućavanja izlaza modula AD98333 bool set_frequency_hz = 1; // Učestalost smetnji modula AD9833 bool set_frequency_khz; bool set_frequency_mhz; String waveSelect = "SIN"; // Startni valni oblik modula int encoder_btn_count = 0; // koristi se za provjeru pritiska gumba kodera. Dalje, imamo naša dva objekta jedan je za OLED zaslon, a drugi za AD9833 modul.Zaslon Adafruit_SSD1306 (SCREEN_WIDATA_PINH, SCREEN_HEIGHT i žica, -1); AD9833 gen (FNC_PIN);
Dalje, imamo našu funkciju setup (), u toj funkciji postavljanja započinjemo s omogućavanjem Serijala za otklanjanje pogrešaka. Modul AD9833 inicijaliziramo uz pomoć metode begin (). Zatim smo postavili sve dodijeljene klinove rotacijskog kodera kao ulazne. A vrijednost pin-a sata pohranjujemo u varijablu clockPinState, ovo je neophodan korak za rotacijski koder.
Dalje, postavljamo sve pribadače gumba kao ulaz i omogućujemo OLED zaslon uz pomoć display.begin () metode, a također provjeravamo ima li pogrešaka iskazom if . Kad je to gotovo, obrišemo zaslon i ispisujemo početni početni zaslon, dodajemo odgodu od 2 sekunde, što je ujedno i kašnjenje za početni zaslon, i na kraju pozivamo funkciju update_display () koja briše zaslon i ažurira prikaz još jednom. Pojedinosti metode update_display () bit će razmotrene kasnije u članku.
void setup () {Serial.begin (9600); // Omogući Serial @ 9600 baud gen.Begin (); // Ovo MORA biti prva naredba nakon deklariranja pinMode objekta AD9833 (CLK_PIN, INPUT); // Postavljanje pinova kao ulaznog pinMode (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Postavljanje pinova kao ulaznog pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adresa 0x3D za 128x64 Serial.println (F ("SSD1306 dodjela nije uspjela")); za (;;); } display.clearDisplay (); // Obrišite prikaz zaslona.setTextSize (2); // Postavljanje veličine teksta display.setTextColor (BIJELO); // postavlja LCD zaslon u boji.setCursor (30, 0); // Postavljanje prikaza položaja kursora.println ("AD9833"); // Ispis ovog tekstualnog prikaza.setCursor (17, 20); // Postavljanje prikaza kursora.println ("Funkcija"); // ispis ovog tekstualnog zaslona.setCursor (13, 40); // Postavljanje prikaza kursora.println ("Generator"); // ispis ovog teksta Text.display (); // Ažuriranje kašnjenja prikaza (2000); // Kašnjenje 2 SEC update_display (); // Poziv update_display funkcija}
Dalje, imamo svoju funkciju loop (), sve glavne funkcionalnosti napisane su u odjeljku petlje.
Prvo čitamo Clock pin rotacijskog kodera i pohranjujemo ga u varijablu clockPin koju smo ranije deklarirali. Dalje, u naredbi if provjeravamo je li prethodna vrijednost pin-a i trenutna vrijednost pin-a slična ili ne, a provjeravamo i trenutnu vrijednost pin-a. Ako je sve točno, provjeravamo postoji li podatkovni pin, ako je točno, to znači da se koder okreće u smjeru suprotnom od kazaljke na satu i vrijednost brojača smanjujemo uz pomoć naredbe counter--. Inače povećavamo vrijednost brojača pomoću naredbe counter ++. Konačno, stavljamo još jedan izraz if da postavimo minimalnu vrijednost na 1. Dalje, ažuriramo clockPinState s trenutnim clockPinvrijednost za buduću upotrebu.
void loop () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {counter -; } else {brojač ++; // Koder rotira CW tako da se povećava} if (brojač <1) brojač = 1; Serial.println (brojač); update_display (); }
Dalje, imamo svoj kod za otkrivanje pritiska gumba. U ovom smo odjeljku otkrili gumb unutar kodera uz pomoć nekih ugniježđenih if naredbi, ako (digitalRead (BTN_PIN) == LOW && millis () - time> denounce), u ovoj izjavi prvo provjeravamo je li gumb pin je nizak ili nije, ako je nizak, onda je pritisnut. Zatim opet provjeravamo vrijednost timera s odgodom odbijanja, ako su obje izjave istinite, proglašavamo je uspješnom akcijom pritiska gumba, ako tako povećavamo vrijednost encoder_btn_count. Dalje, deklariramo još jedan if izraz za postavljanje maksimalne vrijednosti brojača na 2, potreban nam je jer ga koristimo za postavljanje izlaznog valnog oblika.Uzastopne tri naredbe if to rade, ako je vrijednost nula, odabire se sinusni val, ako je jedan, kvadratni je val, a ako je vrijednost 2, to je trokutasti val. U sve tri ove naredbe if ažuriramo zaslon funkcijom update_display () . I na kraju, ažuriramo vremensku varijablu trenutnom vrijednosti brojača vremena.
// Ako otkrijemo LOW signal, pritisne se gumb if (digitalRead (BTN_PIN) == LOW && millis () - time> debounce) {encoder_btn_count ++; // Povećavamo vrijednosti if (encoder_btn_count> 2) // ako je vrijednost veća od 2, vratite je na 0 {encoder_btn_count = 0; } if (encoder_btn_count == 0) {// ako je vrijednost 0 odabran je sinusni val waveSelect = "SIN"; // ažuriranje varijable niza vrijednošću grijeha update_display (); // ažuriranje prikaza} if (encoder_btn_count == 1) {// ako je vrijednost 1 kvadratni val odabran je waveSelect = "SQR"; // ažuriranje varijable niza sa SQR vrijednošću update_display (); // ažuriranje prikaza} if (encoder_btn_count == 2) {// ako je vrijednost 1 Odabran je trokutni val waveSelect = "TRI"; // ažuriranje varijable niza TRI vrijednošću update_display ();// ažuriranje prikaza} vrijeme = milis (); // ažuriranje vremenske varijable}
Zatim definiramo sav potreban kod koji je potreban za postavljanje svih gumba s odgodom prekida. Kako su tipke povezane s analognim pinovima Arduina, pomoću naredbe analognog čitanja prepoznajemo pritisak gumba ako vrijednost analognog očitanja dosegne ispod 30, tada otkrivamo njegov uspješan pritisak gumba i čekamo 200 ms da provjerite radi li se stvarno o pritisku tipke ili samo o zvuku. Ako je ova izjava istinita, dodjeljujemo logičke varijable s vrijednostima koje se koriste za postavljanje vrijednosti Hz, Khz i Mhz generatora funkcija. Dalje, ažuriramo prikaz i ažuriramo vremensku varijablu. To radimo za sve četiri tipke povezane s Arduinom.
if (analogRead (SET_FREQUENCY_HZ) <30 && millis () - time> debounce) {set_frequency_hz = 1; // ažuriranje logičkih vrijednosti set_frequency_khz = 0; postavljena_frekvencija_mhz = 0; update_display (); // ažuriraj vrijeme prikaza = milis (); // ažuriraj vremensku varijablu} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - time> debounce) {set_frequency_hz = 0; // ažuriranje logičkih vrijednosti set_frequency_khz = 1; postavljena_frekvencija_mhz = 0; moduleFrequency = brojač * 1000; update_display (); // ažuriraj vrijeme prikaza = milis (); // ažuriraj vremensku varijablu} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - time> debounce) {// provjeri analogni pin sa zakašnjenjem debounce set_frequency_hz = 0; // ažuriranje logičkih vrijednosti set_frequency_khz = 0; postavljena_frekvencija_mhz = 1; moduleFrequency = brojač * 1000000; update_display ();// ažuriranje vremena prikaza = milis (); // ažuriranje vremenske varijable} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - time> debounce) {// provjera analognog pin-a sa kašnjenjem debounce-a btn_state =! btn_state; // Obrni stanje gumba gen.EnableOutput (btn_state); // Omogući / onemogući izlaz generatora funkcija ovisno o stanju gumba update_display (); // ažuriraj vrijeme prikaza = milis (); // ažuriraj vremensku varijablu}}// ažuriranje vremenske varijable}}// ažuriranje vremenske varijable}}
Konačno, imamo našu funkciju update_display (). U ovoj smo funkciji učinili puno više od pukog ažuriranja ovog zaslona jer se određeni dio zaslona ne može ažurirati u OLED-u. Da biste ga ažurirali, morate ga prebojati novim vrijednostima. To puno otežava postupak kodiranja.
Unutar ove funkcije započinjemo s čišćenjem zaslona. Dalje, postavili smo potrebnu veličinu teksta. Nakon toga postavili smo kursor i ispisali Generator funkcija s display.println ("Funkcija Funkcija"); naredba. Ponovo smo postavili veličinu teksta na 2, a kursor na (0,20) uz pomoć funkcije display.setCursor (0, 20).
Ovdje ispisujemo informacije za koji je val.
display.clearDisplay (); // Prvo očistite zaslon display.setTextSize (1); // postavljanje veličine teksta display.setCursor (10, 0); // Postavljanje prikaza kursora display.println ("Generator funkcija"); // ispis teksta display.setTextSize (2); // postavljanje veličine teksta display.setCursor (0, 20); // postavljanje položaja kursora
Dalje, provjeravamo logičke varijable za detalje o frekvenciji i ažuriramo vrijednost u varijabli moduleFrequency. To radimo za vrijednosti Hz, kHz i MHz. Zatim provjeravamo varijablu waveSelect i identificiramo koji je val odabran. Sada imamo vrijednosti za postavljanje vrste i frekvencije vala.
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// provjeri je li pritisnut gumb za podešavanje frekvencije u Hz moduleFrequency = counter; // ažuriraj varijablu moduleFrequency s trenutnom vrijednosti brojača} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// provjeri je li pritisnuta tipka za podešavanje frekvencije u KHz moduleFrequency = counter * 1000; // ažuriraj varijablu moduleFrequency s trenutnom vrijednosti brojača, ali množimo 1000 da bismo je postavili na KHZ} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// provjeri je li pritisnuta tipka za podešavanje frekvencije u MHz moduleFrequency = brojač * 1000000; if (moduleFrequency> 12000000) {moduleFrequency = 12000000;// ne dopustite da frekvencija bude veća od brojača od 12 MHz = 12; }} if (waveSelect == "SIN") {// Odabran je sinusni val display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, frekvencija modula); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Odabran je val sqr display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri val je odabran display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // ažuriranje modula AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Odabran je val sqr display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri val je odabran display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // ažuriranje modula AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Odabran je val sqr display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri val je odabran display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // ažuriranje modula AD9833. Serial.println (moduleFrequency); }
Ponovno postavljamo kursor i ažuriramo vrijednosti brojača. Ponovno provjeravamo logičku vrijednost kako bismo ažurirali frekvencijski raspon na zaslonu, to moramo učiniti jer je princip rada OLED-a vrlo čudan.
display.setCursor (45, 20); display.println (brojač); // ispis informacija o brojaču na zaslon. if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // ispis Hz na zaslonu zaslona.display (); // kada svi skupovi ažuriraju prikaz} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // kada svi skupovi ažuriraju prikaz} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // kada svi postavljeni ažuriraju prikaz}
Zatim provjeravamo varijablu pritiska gumba za ispis izlaza na / izlaz na OLED. To opet treba učiniti zbog OLED modula.
if (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output ON"); // ispis izlaza na zaslon zaslona.display (); display.setTextSize (2); } else {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output OFF"); // ispis ispisa isključen na zaslon display.display (); display.setTextSize (2); }
Ovo označava kraj našeg postupka kodiranja. Ako ste u ovom trenutku zbunjeni, možete provjeriti komentare u kodu za daljnje razumijevanje.
Ispitivanje generatora funkcija temeljenog na AD9833
Za testiranje kruga koristi se gornja postavka. Kao što vidite, na priključak istosmjerne cijevi priključili smo adapter napona od 12 V istosmjerne struje, a na izlaz kruga spojili smo osciloskop Hantek. Osciloskop smo također povezali s prijenosnim računalom kako bismo vizualizirali i izmjerili izlaznu frekvenciju.
Nakon što je to učinjeno, pomoću rotacijskog kodera postavimo izlaznu frekvenciju na 5Khz i testiramo izlazni sinusni val i sigurno je da je to 5Khz sinusni val na izlazu.

Dalje, promijenili smo izlazni valni oblik u trokutasti val, ali frekvencija je ostala ista, izlazni valni oblik prikazan je u nastavku.

Tada smo promijenili izlaz u kvadratni val i promatrali izlaz, i to je bio savršeni kvadratni val.

Također smo promijenili frekvencijski raspon i testirali izlaz, i to je radilo dobro.
Daljnja poboljšanja
Ovaj je krug samo dokaz koncepta i treba ga dodatno poboljšati. Prvo, trebaju nam kvalitetni PCB i neki kvalitetni BNC konektor za izlaz, inače ne možemo dobiti veću frekvenciju. Amplituda modula je vrlo niska, pa da bismo to poboljšali, trebaju nam neki op-amp krugovi za pojačanje izlaznog napona. Za promjenu izlazne amplitude može se povezati potenciometar. Može se spojiti prekidač za offset signala; ovo je također obavezna značajka. I dalje, kod treba puno poboljšanja jer je malo prisutan. Konačno, OLED zaslone treba promijeniti, inače je nemoguće napisati lako razumljiv kod.
Ovo je kraj ovog vodiča, nadam se da vam se svidio članak i naučili ste nešto novo. Ako imate pitanja u vezi s člankom, možete ih ostaviti u odjeljku za komentare u nastavku ili možete koristiti naš forum za elektroniku.
