- Kaj je generator funkcij DDS?
- Razumevanje delovanja IC-ja funkcijskega generatorja AD9833
- Komponente, potrebne za izdelavo generatorja funkcij, ki temelji na AD9833
- Generator funkcij na osnovi AD9833 - shematski diagram
- Generator funkcij na osnovi AD9833 - koda Arduino
- Testiranje generatorja funkcij, ki temelji na AD9833
- Nadaljnje izboljšave
Če ste navdušenec nad elektroniko, kot sem jaz, ki se želi poigrati z različnimi elektronskimi vezji, postane dostojan funkcijski generator včasih obvezen. A lastništvo enega je težava, saj lahko takšna osnovna oprema stane celo bogastvo. Izdelava lastne testne opreme ni samo cenejša, ampak tudi odličen način za izboljšanje vašega znanja.
Torej, v tem članku bomo zgradili preprost generator signalov z modulom generatorja funkcij Arduino in AD9833 DDS, ki lahko na izhodu proizvaja sinusne, kvadratne in trikotne valove z največjo frekvenco 12 MHz. In na koncu bomo s pomočjo osciloskopa preizkusili izhodno frekvenco.
Pred tem smo s pomočjo osnovnih analognih vezij zgradili preprost generator sinusnih valov, generator kvadratnih valov in generator trikotnih valov. Te lahko preverite, če iščete nekatera osnovna vezja generatorja valov. Če želite zgraditi cenejši generator funkcije Arduino, ne da bi uporabili modul AD9833, si lahko ogledate projekt DIY Arduino Waveform Generator.
Kaj je generator funkcij DDS?
Kot že ime pove, je funkcijski generator naprava, ki lahko ob nastavitvi odda posebno valovno obliko s posebno frekvenco. Na primer, če imate LC filter, za katerega želite preizkusiti svoj odziv izhodne frekvence, lahko to enostavno storite s pomočjo funkcijskega generatorja. Vse, kar morate storiti, je, da nastavite želeno izhodno frekvenco in valovno obliko, nato pa jo lahko potisnete navzdol ali navzgor, da preizkusite odziv. To je bil le en primer, saj lahko s tem naredite več stvari, ko se seznam nadaljuje.
DDS pomeni Direct Digital Synthesis. To je vrsta generatorja valov, ki uporablja digitalno analogne pretvornike (DAC) za ustvarjanje signala od tal. Ta metoda se posebej uporablja za ustvarjanje sinusnega vala. Toda IC, ki ga uporabljamo, lahko proizvaja kvadratne ali trikotne valovne signale. Operacije znotraj čipa DDS so digitalne, zato lahko zelo hitro preklopi frekvenco ali pa zelo hitro preklopi z enega signala na drugega. Ta naprava ima fino frekvenčno ločljivost s širokim frekvenčnim spektrom.
Razumevanje delovanja IC-ja funkcijskega generatorja AD9833
V središču našega projekta je IC9898 programabilni generator valov, ki ga oblikujejo in razvijajo analogne naprave. Je nizkoenergijski, programabilni generator valovnih oblik, ki lahko proizvaja sinusni, trikotni in kvadratni val z največjo frekvenco 12 MHz. To je zelo edinstven IC, ki lahko s samo programskim programom spremeni izhodno frekvenco in fazo. Ima 3-žični vmesnik SPI, zato komunikacija s tem IC postane zelo preprosta in enostavna. Diagram funkcionalnega bloka tega IC je prikazan spodaj.
Delo s tem IC je zelo preprosto. Če si ogledamo zgornji funkcionalni blokovni diagram, bomo opazili, da imamo fazni akumulator, katerega naloga je shranjevanje vseh možnih digitalnih vrednosti sinusnega vala, začenši od 0 do 2π. Nato imamo SIN ROM, katerega naloga je pretvoriti fazne informacije, ki jih je mogoče kasneje neposredno preslikati v amplitudo. SIN ROM digitalne informacije o fazi uporablja kot naslov v iskalni tabeli in pretvori informacije o fazi v amplitudo. In nazadnje imamo še 10-bitni digitalno-analogni pretvornik, katerega naloga je sprejemati digitalne podatke iz SIN ROM-a in jih pretvarjati v ustrezne analogne napetosti, to je tisto, kar dobimo iz izhoda. Na izhodu imamo tudi stikalo, ki ga lahko vklopimo ali izklopimo le z malo programske kode. O tem bomo govorili kasneje v članku.Podrobnosti, ki jih vidite zgoraj, so zelo odstranjena različica dogajanja znotraj IC in večina podrobnosti, ki jih vidite zgoraj, je povzetih iz podatkovnega lista AD9833, lahko pa si ga ogledate tudi za dodatne informacije.
Komponente, potrebne za izdelavo generatorja funkcij, ki temelji na AD9833
Komponente, potrebne za izdelavo generatorja funkcij na osnovi AD9833, so navedene spodaj, to vezje smo zasnovali z zelo splošnimi komponentami, kar olajša postopek replikacije.
- Arduino Nano - 1
- AD9833 Generator funkcij DDS - 1
- 128 X 64 OLED zaslon - 1
- Generični rotacijski dajalnik - 1
- DC Barrel Jack - 1
- LM7809 Regulator napetosti - 1
- Kondenzator 470uF - 1
- Kondenzator 220uF - 1
- Kondenzator 104pF - 1
- 10K upor - 6
- Taktilna stikala - 4
- Vijačni priključek 5,04 mm - 1
- Ženska glava - 1
- 12V vir energije - 1
Generator funkcij na osnovi AD9833 - shematski diagram
Popoln diagram vezja za AD9833 in generator funkcij na osnovi Arduino je prikazan spodaj.
Za ustvarjanje želene frekvence bomo uporabili AD9833 z Arduinom. V tem poglavju bomo s pomočjo sheme razložili vse podrobnosti; Naj vam dam kratek pregled dogajanja z vezjem. Začnimo z modulom AD9833. Modul AD9833 je modul funkcijskega generatorja in je v skladu s shemo povezan z Arduinom. Za napajanje vezja uporabljamo IC napetosti LM7809 z dostojnim ločilnim kondenzatorjem, kar je potrebno, ker lahko napajalni šum moti izhodni signal in povzroči neželen izhod. Kot vedno Arduino deluje kot možgani za ta projekt. Za prikaz nastavljene frekvence in drugih dragocenih informacij smo priklopili 128 X 64 OLED prikazovalni modul. Za spreminjanje frekvenčnega območja uporabljamo tri stikala. Prvi nastavi frekvenco na Hz, drugi izhodno frekvenco nastavi na KHz, tretji pa frekvenco na MHz, imamo še en gumb, s katerim lahko omogočimo ali onemogočimo izhod. Na koncu imamo še rotacijski dajalnik,in moramo z njim pritrditi nekaj vlečnega upora, sicer ta stikala ne bodo delovala, ker preverjamo dogodek pritiska gumba pri metodi združevanja. Z vrtljivim dajalnikom se spreminja frekvenca, s tipalnim stikalom znotraj vrtljivega dajalnika pa se izbere nastavljena valovna oblika.
Generator funkcij na osnovi AD9833 - koda Arduino
Popolno kodo, uporabljeno v tem projektu, najdete na dnu te strani. Po dodajanju zahtevanih datotek glave in izvornih datotek bi morali imeti možnost neposrednega prevajanja datoteke Arduino. Knjižnico ad9833 Arduino in druge knjižnice lahko prenesete s spodnje povezave ali pa za namestitev knjižnice uporabite metodo upravitelja plošč.
- Prenesite knjižnico AD9833 avtorja Bill Williams
- Prenesite knjižnico OLD SSD1306 OLD avtorja Adafruit
- Prenesite knjižnico Adafruit GFX
Razlaga kode v ino. datoteka je naslednja. Najprej začnemo z vključitvijo vseh potrebnih knjižnic. Knjižnici za modul AD9833 DDS najprej sledi knjižnica za OLED, za nekatere naše izračune pa je potrebna matematična knjižnica.
#include // LIbrary za modul AD9833 #include
Nato določimo vse potrebne vhodne in izhodne nožice za gumbe, stikalo, vrtljivi dajalnik in OLED.
#define SCREEN_WIDATA_PINH 128 // OLED zaslon Širina v slikovnih #define SCREEN_HEIGHT 64 // OLED zaslon višina, piksli #define SET_FREQUENCY_HZ A2 // Pushbutton Za nastavitev frekvence v Hz #define SET_FREQUENCY_KHZ A3 // Pushbutton Za nastavitev frekvence v kHz #define SET_FREQUENCY_MHZ A6 // Gumb za nastavitev frekvence v MHz #define ENABLE_DISABLE_OUTPUT_PIN A7 // Gumb za omogočanje / onemogočanje izhoda #define FNC_PIN 4 // Fsync, ki ga zahteva modul AD9833 #define CLK_PIN 8 // Clock Pin of the Encoder #Din 7 / Podatkovni zatič dajalnika #define BTN_PIN 9 // Notranji gumb na dajalniku
Nato določimo vse potrebne spremenljivke, ki jih zahteva ta koda. Najprej določimo števec spremenljivk celo število, ki bo shranil vrednost rotacijskega dajalnika. Naslednji dve spremenljivki clockPin in clockPinState shranita kip pin, ki je potreben za razumevanje smeri dajalnika. Imamo časovno spremenljivko, ki vsebuje trenutne vrednosti števca časovnika, ta spremenljivka se uporablja za odklop gumba. Nato imamo nepodpisani long variable moduleFrequency, ki vsebuje izračunano frekvenco, ki bo uporabljena. Nato imamo zamudo pri prekinitvi. To zamudo lahko po potrebi prilagodite. Nato imamo tri logične spremenljivke set_frequency_hz,set_frequency_Khz in set_frequency_Mhz te tri spremenljivke uporabljajo za določanje trenutne nastavitve modula. O tem bomo podrobneje govorili kasneje v članku. Nato imamo spremenljivko, ki shranjuje stanje izhodne valovne oblike, privzeta izhodna valovna oblika je sinusni val. In končno, imamo spremenljivko encoder_btn_count, ki vsebuje število gumbov dajalnika, ki se uporablja za nastavitev izhodne valovne oblike.
int števec = 1; // Ta vrednost števca se bo povečala ali zmanjšala, če bo rotacijski dajalnik obrnjen znotraj clockPin; // Omejitev statusa zatiča, ki ga uporablja rotacijski dajalnik int clockPinState; // Nadomestni znak za status zatiča, ki ga uporablja rotacijski kodirnik, ki ni podpisan dolgo časa = 0; // Uporablja se za odpravo nepodpisanega dolgega moduleFrequency; // uporablja se za nastavitev izhodne frekvence long debounce = 220; // zakasnitev prekinitve bool btn_state; // uporablja se za omogočanje onemogočanja izhoda modula AD98333 bool set_frequency_hz = 1; // frekvenca napake modula AD9833 bool set_frequency_khz; bool set_frequency_mhz; String waveSelect = "SIN"; // Začetna valovna oblika modula int encoder_btn_count = 0; // uporabljamo za preverjanje gumba dajalnika. Nato imamo dva predmeta, eden je za zaslon OLED, drugi pa za modul AD9833.Zaslon Adafruit_SSD1306 (SCREEN_WIDATA_PINH, SCREEN_HEIGHT in & Wire, -1); Gen AD9833 (FNC_PIN);
Nato imamo svojo funkcijo setup (), v tej nastavitveni funkciji pa začnemo z omogočanjem programa Serial za odpravljanje napak. Modul AD9833 inicializiramo s pomočjo metode begin (). Nato nastavimo vse dodeljene zatiče vrtljivega dajalnika kot vhod. In vrednost zatiča ure shranimo v spremenljivko clockPinState, to je nujen korak za rotacijski dajalnik.
Nato nastavimo vse zatiče gumbov kot vhod in omogočimo zaslon OLED s pomočjo metode display.begin () , prav tako pa z morebitnimi napakami preverimo z stavkom if . Ko to naredimo, počistimo zaslon in natisnemo začetni začetni zaslon, dodamo zakasnitev 2 sekundi, ki je hkrati tudi zamuda začetnega zaslona, in na koncu pokličemo funkcijo update_display (), ki počisti zaslon in posodobi zaslon še enkrat. Podrobnosti metode update_display () bodo obravnavane v nadaljevanju članka.
void setup () {Serial.begin (9600); // Omogoči Serial @ 9600 baud gen.Begin (); // To MORA biti prvi ukaz po razglasitvi pinMode predmeta AD9833 (CLK_PIN, INPUT); // Nastavitev zatičev kot vhodnega pinMode (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Nastavitev zatičev kot vhodnega pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Naslov 0x3D za 128x64 Serial.println (F ("SSD1306 dodelitev ni uspela")); za (;;); } display.clearDisplay (); // počistite zaslon.setTextSize (2); // Nastavitev velikosti besedila display.setTextColor (BELA); // nastavitev barvnega LCD zaslona.setCursor (30, 0); // Nastavitev prikaza kurzorja display.println ("AD9833"); // Natisnite prikaz tega besedila.setCursor (17, 20); // Nastavitev prikaza kurzorja display.println ("Funkcija"); // natisnemo to besedilo display.setCursor (13, 40); // Nastavitev prikaza kurzorja display.println ("Generator"); // Natisni to besedilo display.display (); // Posodobitev zakasnitve zaslona (2000); // Zamuda pri 2 SEC update_display (); // Pokliči funkcijo update_display}
Nato imamo funkcijo loop (), vse glavne funkcije so zapisane v odseku zanke.
Najprej preberemo zatič Clock rotacijskega dajalnika in ga shranimo v spremenljivko clockPin, ki smo jo že navedli. Nato v stavku if preverimo, ali sta prejšnja vrednost zatiča in trenutna vrednost zatiča podobni ali ne, in preverimo tudi trenutno vrednost zatiča. Če je vse res, da preverimo, za podatkovni pin, če je res, da sredstva kodirnik se vrti v nasprotni in smo pojemanje protivrednosti s pomočjo counter-- ukaza. V nasprotnem primeru povečamo vrednost števca z ukazom counter ++. Na koncu postavimo še en stavek if, da nastavimo najmanjšo vrednost na 1. Nato posodobimo clockPinState s trenutnim clockPinvrednost za prihodnjo uporabo.
void loop () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {counter -; } else {counter ++; // Dajalnik se vrti CW, tako da prirastek} if (counter <1) counter = 1; Serial.println (števec); update_display (); }
Nato imamo kodo za zaznavanje pritiska gumba. V tem razdelku smo zaznali gumb znotraj dajalnika s pomočjo nekaterih ugnezdenih stavkov if, če (digitalRead (BTN_PIN) == LOW && millis () - time> denounce), v tem stavku najprej preverimo, ali je gumb čep je nizek ali ne, če je nizek, potem je pritisnjen. Nato še enkrat preverimo vrednost časovnika z zamudo pri prekinitvi, če sta oba stavka resnična, jo razglasimo za uspešno dejanje pritiska na gumb, če tako povečamo vrednost encoder_btn_count. Nato razglasimo še en stavek if, da nastavimo največjo vrednost števca na 2, potrebujemo ga, ker ga uporabljamo za nastavitev izhodne valovne oblike.Tri zaporedne izjave if to počnejo, če je vrednost nič, je izbrana oblika sinusnega valovanja, če je ena, je kvadratni val, če je vrednost 2, pa trikotni val. V vseh treh stavkih if posodobimo zaslon s funkcijo update_display () . In na koncu posodobimo časovno spremenljivko s trenutno vrednostjo števca časovnika.
// Če zaznamo signal LOW, pritisnemo gumb if (digitalRead (BTN_PIN) == LOW && millis () - time> debounce) {encoder_btn_count ++; // Povečamo vrednosti if (encoder_btn_count> 2) // če je vrednost večja od 2, jo ponastavimo na 0 {encoder_btn_count = 0; } if (encoder_btn_count == 0) {// če je vrednost 0, je izbran sinusni val waveSelect = "SIN"; // spremenimo niz spremenljivke z vrednostjo greha update_display (); // posodobimo prikaz} if (encoder_btn_count == 1) {// če je vrednost 1 kvadratni val, je izbran waveSelect = "SQR"; // spremenimo niz spremenljivke z vrednostjo SQR update_display (); // posodobimo prikaz} if (encoder_btn_count == 2) {// če je vrednost 1 Izbran je trikotni val waveSelect = "TRI"; // spremenimo nizovno spremenljivko z vrednostjo TRI update_display ();// posodobimo prikaz} time = milis (); // posodobimo časovno spremenljivko}
Nato določimo vso potrebno kodo, ki je potrebna za nastavitev vseh gumbov z zamudo pri prekinitvi. Ko so gumbi povezani z analognimi nožicami Arduina, z ukazom analognega branja prepoznamo pritisk gumba, če vrednost analognega branja doseže pod 30, nato zaznamo njegov uspešen pritisk gumba in čakamo 200 ms, da preverite, ali gre za dejanski pritisk na gumb ali samo za šum. Če je ta izjava resnična, dodelimo logične spremenljivke z vrednostmi, ki se uporabljajo za nastavitev vrednosti Hz, Khz in Mhz generatorja funkcij. Nato posodobimo prikaz in posodobimo časovno spremenljivko. To naredimo za vse štiri gumbe, povezane z Arduinom.
if (analogRead (SET_FREQUENCY_HZ) <30 && millis () - time> debounce) {set_frequency_hz = 1; // posodobitev logičnih vrednosti set_frequency_khz = 0; nastavljena_frekvenca_mhz = 0; update_display (); // posodobimo čas prikaza = milis (); // posodobimo časovno spremenljivko} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - time> debounce) {set_frequency_hz = 0; // posodobitev logičnih vrednosti set_frequency_khz = 1; nastavljena_frekvenca_mhz = 0; moduleFrequency = števec * 1000; update_display (); // posodobi čas prikaza = milis (); // posodobi časovno spremenljivko} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - time> debounce) {// preveri analogni pin z zakasnitvijo debounce set_frequency_hz = 0; // posodobitev logičnih vrednosti set_frequency_khz = 0; nastavljena_frekvenca_mhz = 1; moduleFrequency = števec * 1000000; update_display ();// posodobimo čas prikaza = millis (); // posodobimo časovno spremenljivko} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - time> debounce) {// preverimo analogni pin z zamudo debounce btn_state =! btn_state; // Pretvori stanje gumba gen.EnableOutput (btn_state); // Omogoči / onemogoči izhod generatorja funkcij, odvisno od stanja gumba update_display (); // posodobi čas prikaza = milis (); // posodobi časovno spremenljivko}}// posodobimo časovno spremenljivko}}// posodobimo časovno spremenljivko}}
Na koncu imamo še funkcijo update_display (). Pri tej funkciji smo naredili veliko več kot le posodabljanje tega zaslona, ker določenega dela zaslona ni mogoče posodobiti v OLED. Če ga želite posodobiti, ga morate prebarvati z novimi vrednostmi. To zelo otežuje postopek kodiranja.
Znotraj te funkcije začnemo s čiščenjem zaslona. Nato nastavimo zahtevano velikost besedila. Nato smo nastavili kazalec in natisnili Generator funkcij z display.println ("Funkcija Funkcija"); ukaz. Velikost besedila smo ponovno nastavili na 2, kurzor pa na (0,20) s pomočjo funkcije display.setCursor (0, 20).
Tukaj natisnemo podatke za kakšen val gre.
display.clearDisplay (); // Najprej počistite zaslon display.setTextSize (1); // nastavimo Velikost besedila display.setCursor (10, 0); // Nastavitev položaja kurzorja display.println ("Generator funkcij"); // natisnemo besedilo display.setTextSize (2); // nastavimo velikost besedila display.setCursor (0, 20); // nastavimo položaj kurzorja
Nato preverimo logične spremenljivke za podrobnosti o frekvenci in posodobimo vrednost v spremenljivki moduleFrequency. To naredimo za vrednosti Hz, kHz in MHz. Nato preverimo spremenljivko waveSelect in določimo, kateri val je izbran. Zdaj imamo vrednosti za nastavitev vrste in frekvence valovanja.
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// preverite, če je pritisnjen gumb za nastavitev frekvence v Hz moduleFrequency = counter; // posodobimo spremenljivko moduleFrequency s trenutno vrednostjo števca} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// preverimo, če je pritisnjen gumb za nastavitev frekvence v KHz moduleFrequency = counter * 1000; // posodobite spremenljivko moduleFrequency s trenutno vrednostjo števca, vendar pomnožimo 1000, da jo nastavimo na KHZ}, če (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// preverimo, če je pritisnjen gumb za nastavitev frekvence v MHz moduleFrequency = števec * 1000000; if (moduleFrequency> 12000000) {moduleFrequency = 12000000;// naj frekvenca ne bo večja od števila 12 MHz = 12; }} if (waveSelect == "SIN") {// izbran je sinusni val display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Sqr val je izbran display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri val je izbran display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // posodobimo modul AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Sqr val je izbran display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri val je izbran display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // posodobimo modul AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Sqr val je izbran display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri val je izbran display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // posodobimo modul AD9833. Serial.println (moduleFrequency); }
Ponovno nastavimo kurzor in posodobimo vrednosti števca. Ponovno preverimo logično vrednost, da posodobimo frekvenčno območje na zaslonu, to moramo storiti, ker je načelo delovanja OLED-a zelo čudno.
display.setCursor (45, 20); display.println (števec); // natisnemo podatke o števcu na zaslon. if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // natisnemo Hz na zaslon display.display (); // ko vsi kompleti posodobijo prikaz} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // ko vsi kompleti posodobijo prikaz} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // ko vsi nastavljeni posodobijo prikaz}
Nato preverimo spremenljivko za pritisk gumba za tiskanje izhoda na / izhod na OLED. Tudi to je treba storiti zaradi modula OLED.
če (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output ON"); // izpis izhoda naprej na zaslon display.display (); display.setTextSize (2); } else {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output OFF"); // izpis izpisa izključen na zaslon display.display (); display.setTextSize (2); }
To pomeni konec našega kodiranja. Če ste v tem trenutku zmedeni, lahko za nadaljnje razumevanje preverite komentarje v kodi.
Testiranje generatorja funkcij, ki temelji na AD9833
Za preizkus vezja se uporablja zgornja nastavitev. Kot lahko vidite, smo na enosmerni priključek na cev priklopili 12V enosmerni napajalnik, na izhod vezja pa Hantek osciloskop. Na prenosnik smo priklopili tudi osciloskop za vizualizacijo in merjenje izhodne frekvence.
Ko je bilo to narejeno, s pomočjo vrtljivega dajalnika nastavimo izhodno frekvenco na 5Khz in preizkusimo izhodni sinusni val in zagotovo je na izhodu sinusni val 5Khz.
Nato smo izhodno valovno obliko spremenili v trikotni val, vendar je frekvenca ostala enaka, izhodna valovna oblika je prikazana spodaj.
Nato smo izhod spremenili v kvadratni val in opazovali izhod in bil je popoln kvadratni val.
Spremenili smo tudi frekvenčna območja in preizkusili izhod in je dobro deloval.
Nadaljnje izboljšave
To vezje je samo dokaz koncepta in ga je treba še izboljšati. Najprej za izhod potrebujemo kakovostno tiskano vezje in nekaj kakovostnega BNC priključka, sicer ne moremo pridobiti višje frekvence. Amplituda modula je zelo nizka, zato potrebujemo nekaj op-amp vezij za ojačanje izhodne napetosti. Za spreminjanje izhodne amplitude lahko priključite potenciometer. Lahko se priključi stikalo za odmik signala; to je tudi nujna lastnost. Poleg tega je treba kodo precej izboljšati, saj je malo napačna. Končno je treba OLED zaslone spremeniti, sicer je nemogoče napisati lahko razumljivo kodo.
To je konec te vaje, upam, da vam je bil članek všeč in ste se naučili nekaj novega. Če imate kakršna koli vprašanja v zvezi s člankom, jih lahko pustite v spodnjem oddelku za komentarje ali pa uporabite naš forum za elektroniko.