- Ce este un Generator de funcții DDS?
- Înțelegeți funcționarea IC-ului generatorului de funcții AD9833
- Componente necesare pentru a construi generatorul de funcții bazat pe AD9833
- Generator de funcții bazate pe AD9833 - Diagramă schematică
- Generator de funcții bazate pe AD9833 - Cod Arduino
- Testarea generatorului de funcții bazate pe AD9833
- Îmbunătățiri suplimentare
Dacă sunteți un pasionat de electronice ca mine, care dorește să se adapteze cu diferite circuite electronice, a avea un Generator de funcții decent uneori devine obligatoriu. Dar deținerea unuia este o problemă, deoarece astfel de echipamente de bază pot costa o avere. Construirea propriilor echipamente de testare este nu numai mai ieftină, ci și o modalitate excelentă de a vă îmbunătăți cunoștințele.
Deci, în acest articol, vom construi un generator de semnal simplu cu Arduino și AD9833 DDS Function Generator Module care poate produce unde sinusoidale, pătrate și triunghiulare cu o frecvență maximă de 12 MHz la ieșire. Și, în cele din urmă, vom testa frecvența de ieșire cu ajutorul osciloscopului nostru.
Am construit anterior un generator de unde sinusoidale simple, un generator de unde pătrate și un generator de unde triunghiular cu ajutorul circuitelor analogice de bază. Le puteți verifica dacă sunteți în căutarea unor circuite de bază pentru generatoare de forme de undă. De asemenea, dacă doriți să construiți un generator de funcții Arduino mai ieftin fără a utiliza modulul AD9833, puteți verifica Proiectul DIY Arduino Waveform Generator.
Ce este un Generator de funcții DDS?
După cum sugerează și numele, un generator de funcții este un dispozitiv care poate emite o anumită formă de undă cu o frecvență specifică la setare. De exemplu, considerați că aveți un filtru LC pentru care doriți să testați răspunsul de frecvență de ieșire, puteți face acest lucru cu ușurință cu ajutorul unui generator de funcții. Tot ce trebuie să faceți este să setați frecvența de ieșire și forma de undă dorite, apoi o puteți roti în jos sau în sus pentru a testa răspunsul. Acesta a fost doar un exemplu, puteți face mai multe lucruri cu el pe măsură ce lista continuă.
DDS înseamnă Direct Digital Synthesis. Este un tip de generator de forme de undă care folosește convertoare digitale la analogice (DAC) pentru a construi un semnal de la bază. Această metodă este utilizată în mod specific pentru a genera o undă sinusoidală. Dar IC-ul pe care îl folosim poate produce semnale de undă pătrată sau triunghiulară. Operațiunile care au avut loc în interiorul unui cip DDS sunt digitale, astfel încât poate comuta frecvența foarte repede sau poate comuta de la un semnal la altul foarte rapid. Acest dispozitiv are o rezoluție de frecvență fină cu un spectru larg de frecvențe.
Înțelegeți funcționarea IC-ului generatorului de funcții AD9833
În centrul proiectului nostru se află AD9833 Programatorable Waveform Generator IC, care este proiectat și dezvoltat de dispozitive analogice. Este un generator de formă de undă programabil de mică putere, capabil să producă undă sinusoidală, triunghiulară și pătrată cu o frecvență maximă de 12 MHz. Este un IC foarte unic, capabil să modifice frecvența și faza de ieșire doar cu un program software. Are o interfață SPI cu 3 fire, motiv pentru care comunicarea cu acest IC devine foarte simplă și ușoară. Schema bloc funcțională a acestui IC este prezentată mai jos.
Funcționarea acestui CI este foarte simplă. Dacă aruncăm o privire la diagrama funcțională de mai sus, vom observa că avem un acumulator de fază a cărui sarcină este de a stoca toate valorile digitale posibile ale unei unde sinusoidale, începând de la 0 la 2π. Apoi, avem ROM-ul SIN a cărui sarcină este de a converti informațiile de fază care pot fi ulterior mapate direct în amplitudine. SIN ROM utilizează informațiile de fază digitale ca adresă într-un tabel de căutare și convertește informațiile de fază în amplitudine. Și, în sfârșit, avem un convertor digital în analogic de 10 biți, a cărui sarcină este de a primi datele digitale de la SIN ROM și de a le converti în tensiunile analogice corespunzătoare, ceea ce obținem din ieșire. La ieșire, avem și un comutator pe care îl putem activa sau dezactiva doar cu puțin cod software. Vom vorbi despre asta mai târziu în articol.Detaliile pe care le vedeți mai sus sunt o versiune foarte dezactivată a ceea ce se întâmplă în interiorul IC și majoritatea detaliilor pe care le vedeți mai sus sunt preluate din foaia de date AD9833, de asemenea, o puteți verifica pentru informații suplimentare.
Componente necesare pentru a construi generatorul de funcții bazat pe AD9833
Componentele necesare pentru a construi generatorul de funcții bazat pe AD9833 sunt enumerate mai jos, am proiectat acest circuit cu componente foarte generice, ceea ce face procesul de replicare foarte ușor.
- Arduino Nano - 1
- AD9833 Generator de funcții DDS - 1
- Afișaj OLED 128 X 64 - 1
- Codificator rotativ generic - 1
- DC Barrel Jack - 1
- LM7809 Regulator de tensiune - 1
- Condensator 470uF - 1
- Condensator 220uF - 1
- Condensator 104pF - 1
- Rezistor 10K - 6
- Comutatoare tactile - 4
- Terminal cu șurub 5,04 mm - 1
- Antet feminin - 1
- Sursă de alimentare de 12V - 1
Generator de funcții bazate pe AD9833 - Diagramă schematică
Schema completă a circuitului pentru AD9833 și Arduino Based Function Generator este prezentată mai jos.
Vom folosi AD9833 cu Arduino pentru a genera frecvența dorită. Și în această secțiune, vom explica toate detaliile cu ajutorul schemei; permiteți-mi să vă ofer o scurtă prezentare generală a ceea ce se întâmplă cu circuitul. Să începem cu modulul AD9833. Modulul AD9833 este modulul generator de funcții și este conectat cu Arduino conform schemei. Pentru a alimenta circuitul, folosim un regulator de tensiune LM7809 IC, cu un condensator decent de decuplare, acest lucru este necesar, deoarece zgomotul de alimentare poate interfera cu semnalul de ieșire, rezultând o ieșire nedorită. Ca întotdeauna, Arduino funcționează ca creier pentru acest proiect. Pentru a afișa frecvența setată și alte informații valoroase, am conectat un modul de afișare OLED 128 X 64. Pentru a schimba gama de frecvență, folosim trei comutatoare. Primul setează frecvența la Hz, al doilea setează frecvența de ieșire la KHz, iar al treilea setează frecvența la MHz, avem și un alt buton care poate fi utilizat pentru a activa sau dezactiva ieșirea. În cele din urmă, avem codificatorul rotativ,și trebuie să atașăm o rezistență pull-up cu ea, altfel aceste comutatoare nu vor funcționa, deoarece verificăm evenimentul de apăsare a butonului pe metoda de punere în comun. Codificatorul rotativ este utilizat pentru a schimba frecvența, iar comutatorul tactil din interiorul codificatorului rotativ este utilizat pentru a selecta forma de undă setată.
Generator de funcții bazate pe AD9833 - Cod Arduino
Codul complet utilizat în acest proiect poate fi găsit în partea de jos a acestei pagini. După adăugarea fișierelor antet necesare și a fișierelor sursă, ar trebui să puteți compila direct fișierul Arduino. Puteți descărca biblioteca ad9833 Arduino și alte biblioteci de pe linkul de mai jos sau puteți folosi metoda managerului de bord pentru a instala biblioteca.
- Descărcați Biblioteca AD9833 de Bill Williams
- Descărcați biblioteca OLED SSD1306 de Adafruit
- Descărcați biblioteca Adafruit GFX
Explicația codului din ino. fișierul este după cum urmează. În primul rând, începem prin a include toate bibliotecile necesare. Biblioteca pentru modulul AD9833 DDS este urmată mai întâi de biblioteca pentru OLED, iar biblioteca de matematică este necesară pentru unele dintre calculele noastre.
#include // LIbrary pentru modulul AD9833 #include
Apoi, definim toți pinii de intrare și ieșire necesari pentru butoane, comutator, codificator rotativ și OLED-uri.
#define SCREEN_WIDATA_PINH 128 // Lățimea afișajului OLED în pixeli #define SCREEN_HEIGHT 64 // Înălțimea afișajului OLED, în pixeli #define SET_FREQUENCY_HZ A2 // Buton pentru setarea frecvenței în Hz #define SET_FREQUENCY_KHZ A3 // Buton pentru setarea frecvenței_ KhZ A6 // Buton pentru a seta frecvența în Mhz #define ENABLE_DISABLE_OUTPUT_PIN A7 // Buton pentru a activa / dezactiva ieșirea #define FNC_PIN 4 // Fsync Cerut de modulul AD9833 #define CLK_PIN 8 // Clock Pin al codificatorului 7 / define DATA_P / Pinul de date al codificatorului #define BTN_PIN 9 // Buton intern de pe codificator
Ulterior, definim toate variabilele necesare care sunt necesare în acest cod. În primul rând, definim un contor de variabile întregi care va stoca valoarea codificatorului rotativ. Următoarele două variabile clockPin și clockPinState stochează statuia pin care este necesară pentru a înțelege direcția codificatorului. Avem o variabilă de timp care deține valorile curente ale contorului temporizator, această variabilă este utilizată pentru dezactivarea butoanelor. În continuare, avem o variabilă unsigned long moduleFrequency care deține frecvența calculată, care urmează să fie aplicat. Apoi, avem întârzierea dezabonării. Această întârziere poate fi ajustată după cum este necesar. Apoi, avem trei variabile booleene set_frequency_hz,set_frequency_Khz și set_frequency_Mhz aceste trei variabile sunt utilizate pentru a determina setarea curentă a modulului. Vom vorbi despre asta mai detaliat mai târziu în articol. Apoi, avem variabila care stochează starea formei de undă de ieșire, forma de undă de ieșire implicită este o undă sinusoidală. Și, în sfârșit, avem variabila encoder_btn_count care deține numărul de coduri -buton care este utilizat pentru a seta forma de undă de ieșire.
contor int = 1; // Această valoare a Contorului va crește sau va scădea dacă atunci când codorul rotativ este rotit în clockPin; // Substituent pentru starea pinului folosit de codificatorul rotativ int clockPinState; // Substituent pentru starea pinului utilizat de codificatorul rotativ nesemnat mult timp = 0; // Folosit pentru dezbaterea nesemnat lung moduleFrequency; // folosit pentru a seta frecvența de ieșire lung debounce = 220; // Întârziere debounce bool btn_state; // folosit pentru a activa dezactivarea ieșirii modulului AD98333 bool set_frequency_hz = 1; // Frecvența implicită a modulului AD9833 bool set_frequency_khz; bool set_frequency_mhz; String waveSelect = "SIN"; // Forma de undă de pornire a modulului int encoder_btn_count = 0; // folosit pentru a verifica butonul codificatorului apăsați pe Următorul, avem cele două obiecte ale noastre, unul este pentru afișajul OLED și altul este pentru modulul AD9833Afișaj Adafruit_SSD1306 (SCREEN_WIDATA_PINH, SCREEN_HEIGHT și Wire, -1); AD9833 gen (FNC_PIN);
Apoi, avem funcția noastră setup (), în acea funcție de configurare, începem cu activarea Serial pentru depanare. Inițializăm modulul AD9833 cu ajutorul metodei begin (). Apoi, setăm toți pinii codificatorului rotativ atribuiți ca intrare. Și stocăm valoarea pinului ceasului în variabila clockPinState, acesta este un pas necesar pentru codificatorul rotativ.
Apoi, setăm toți pinii butoanelor ca intrare și activăm afișajul OLED cu ajutorul metodei display.begin () și verificăm, de asemenea, dacă există erori cu o instrucțiune if . În cazul în care se face, vom șterge afișajul și a imprima un ecran de pornire splash, vom adăuga o întârziere de 2 secunde, care este, de asemenea, întârzierea pentru ecranul de pornire, și în cele din urmă, noi numim update_display () funcția care șterge ecranul și actualizează afișați încă o dată. Detaliile metodei update_display () vor fi discutate mai târziu în articol.
void setup () {Serial.begin (9600); // Activați Serial @ 9600 baud gen.Begin (); // Aceasta TREBUIE să fie prima comandă după declararea obiectului AD9833 pinMode (CLK_PIN, INPUT); // Setarea pinilor ca pin pinMode de intrare (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Setarea pinilor ca pinMode de intrare (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adresă 0x3D pentru 128x64 Serial.println (F ("Alocarea SSD1306 a eșuat")); pentru (;;); } display.clearDisplay (); // Ștergeți ecranul display.setTextSize (2); // Setați dimensiunea textului display.setTextColor (WHITE); // set LCD Color display.setCursor (30, 0); // Setați poziția cursorului display.println ("AD9833"); // Imprimați afișajul acestui text.setCursor (17, 20); // Setați poziția cursorului display.println ("Funcție"); // Imprimați acest text display.setCursor (13, 40); // Setați poziția cursorului display.println ("Generator"); // Imprimați acest text display.display (); // Actualizați întârzierea afișajului (2000); // Întârzierea a 2 SEC update_display (); // Apelează funcția update_display}
Apoi, avem funcția noastră loop (), toate funcționalitățile majore sunt scrise în secțiunea loop.
În primul rând, citim pinul de ceas al codificatorului rotativ și îl stocăm în variabila clockPin pe care am declarat-o mai devreme. Apoi, în declarația if , verificăm dacă valoarea anterioară a pinului și valoarea curentă a pinului sunt similare sau nu și verificăm și valoarea curentă a pinului. Dacă totul este adevărat, vom verifica PIN - ul de date, dacă este adevărat că mijloacele codificator se rotește în sens antiorar și noi decrementa valoarea contorului cu ajutorul counter-- de comandă. Altfel, incrementăm valoarea contorului cu comanda counter ++. În cele din urmă, punem o altă instrucțiune if pentru a seta valoarea minimă la 1. Apoi, actualizăm clockPinState cu clockPin curentvaloare pentru utilizare viitoare.
bucla void () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {counter -; } else {counter ++; // Codificatorul roteste CW deci increment} if (counter <1) counter = 1; Serial.println (contor); update_display (); }
Apoi, avem codul nostru pentru a detecta apăsarea unui buton. În această secțiune, am detectat butonul din interiorul codificatorului cu ajutorul unor instrucțiuni imbricate if, dacă (digitalRead (BTN_PIN) == LOW && millis () - time> denounce), în această afirmație, verificăm mai întâi dacă butonul pinul este scăzut sau nu, dacă este scăzut, atunci este apăsat. Apoi verificăm din nou valoarea temporizatorului cu întârzierea de retragere, dacă ambele afirmații sunt adevărate, atunci declarăm că este o acțiune de apăsare a butonului reușită dacă așa incrementăm valoarea encoder_btn_count În continuare, declarăm o altă instrucțiune if pentru a seta valoarea maximă a contorului la 2, avem nevoie de ea pentru că o folosim pentru a seta forma de undă de ieșire.Instrucțiunile consecutive trei dacă fac asta, dacă valoarea este zero, este selectată forma de undă sinusoidală, dacă este una, este o undă pătrată și dacă valoarea este 2, este o undă triunghiulară. În toate aceste trei instrucțiuni if, actualizăm afișajul cu funcția update_display () . Și, în cele din urmă, actualizăm variabila de timp cu valoarea curentă a contorului temporizatorului.
// Dacă detectăm un semnal LOW, butonul este apăsat dacă (digitalRead (BTN_PIN) == LOW && millis () - time> debounce) {encoder_btn_count ++; // Măriți valorile dacă (encoder_btn_count> 2) // dacă valoarea este mai mare de 2 resetați-o la 0 {encoder_btn_count = 0; } if (encoder_btn_count == 0) {// dacă valoarea este 0 sinusoidală este selectată waveSelect = "SIN"; // actualizați variabila șir cu valoarea sin actualizare_display (); // actualizați afișajul} if (encoder_btn_count == 1) {// dacă valoarea este 1 undă pătrată este selectată waveSelect = "SQR"; // actualizați variabila șir cu valoarea SQR update_display (); // actualizați afișajul} if (encoder_btn_count == 2) {// dacă valoarea este 1 Val triunghiular este selectat waveSelect = "TRI"; // actualizați variabila șir cu valoarea TRI update_display ();// actualizați afișajul} time = millis (); // actualizați variabila de timp}
Apoi, definim tot codul necesar, care este necesar pentru a configura toate butoanele cu o întârziere de retragere. Deoarece butoanele sunt conectate la pinii analogici ai Arduino, folosim comanda de citire analogică pentru a identifica o apăsare de buton dacă valoarea de citire analogică ajunge sub 30, apoi detectăm o apăsare de buton reușită și așteptăm 200 ms până la verificați dacă este doar o apăsare de buton sau doar un zgomot. Dacă această afirmație este adevărată, atribuim variabilele booleene cu valori care sunt utilizate pentru a seta valorile Hz, Khz și Mhz ale generatorului de funcții. Apoi, actualizăm afișajul și actualizăm variabila de timp. Facem asta pentru toate cele patru butoane conectate cu Arduino.
if (analogRead (SET_FREQUENCY_HZ) <30 && millis () - time> debounce) {set_frequency_hz = 1; // actualizați valorile booleene set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // update the display time = millis (); // update the time variable} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - time> debounce) {set_frequency_hz = 0; // actualizați valorile booleene set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = contor * 1000; update_display (); // actualizați timpul de afișare = millis (); // actualizați variabila de timp} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - time> debounce) {// verificați pinul analogic cu întârzierea de returnare set_frequency_hz = 0; // actualizați valorile booleene set_frequency_khz = 0; set_frequency_mhz = 1; moduleFrequency = contor * 1000000; update_display ();// actualizați timpul de afișare = millis (); // actualizați variabila de timp} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - time> debounce) {// verificați pinul analogic cu întârziere de returnare btn_state =! btn_state; // Inversați starea butonului gen.EnableOutput (btn_state); // Activează / Dezactivează ieșirea generatorului de funcții în funcție de starea butonului update_display (); // actualizează timpul de afișare = milis (); // actualizează variabila de timp}}// actualizați variabila de timp}}// actualizați variabila de timp}}
În cele din urmă, avem funcția noastră update_display (). În această funcție, am făcut mult mai mult decât actualizarea acestui afișaj, deoarece o anumită porțiune a afișajului nu poate fi actualizată într-un OLED. Pentru a-l actualiza, trebuie să-l revopsiți cu valori noi. Acest lucru face procesul de codificare mult mai dificil.
În interiorul acestei funcții, începem cu ștergerea afișajului. Apoi, setăm dimensiunea de text necesară. Ulterior, ne-am setat cursorul și am imprimat Generatorul de funcții cu display.println ("Funcția funcției"); comanda. Am setat din nou dimensiunea textului la 2, iar cursorul la (0,20) cu ajutorul funcției display.setCursor (0, 20).
Aici imprimăm informațiile pentru ce val este.
display.clearDisplay (); // În primul rând, ștergeți afișajul display.setTextSize (1); // setează dimensiunea textului display.setCursor (10, 0); // Setați poziția cursorului display.println ("Generator de funcții"); // tipărește text display.setTextSize (2); // set text Size display.setCursor (0, 20); // Setați poziția cursorului
Apoi, verificăm variabilele booleene pentru detalii de frecvență și actualizăm valoarea în variabila moduleFrequency. Facem acest lucru pentru valorile Hz, kHz și MHz. Apoi, verificăm variabila waveSelect și identificăm ce undă este selectată. Acum, avem valorile pentru a seta tipul de undă și frecvența.
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// verificați dacă este apăsat butonul pentru setarea frecvenței în Hz moduleFrequency = contor; // actualizați variabila moduleFrequency cu valoarea curentă a contorului} dacă (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// verificați dacă este apăsat butonul pentru setarea frecvenței în KHz moduleFrequency = contor * 1000; // actualizați variabila moduleFrequency cu valoarea curentă a contorului, dar înmulțim 1000 pentru ao seta pe KHZ} dacă (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// verificați dacă butonul pentru setarea frecvenței în MHz este apăsat moduleFrequency = contor * 1000000; if (moduleFrequency> 12000000) {moduleFrequency = 12000000;// nu lăsați frecvența să fie mai mare decât contorul 12Mhz = 12; }} if (waveSelect == "SIN") {// Wave sinusural este selectat display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Wave Sqr este selectată display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri wave este selectat display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // actualizați modulul AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Wave Sqr este selectată display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri wave este selectat display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // actualizați modulul AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Wave Sqr este selectată display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri wave este selectat display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // actualizați modulul AD9833. Serial.println (moduleFrequency); }
Setăm din nou cursorul și actualizăm valorile contorului. Din nou verificăm booleanul pentru a actualiza gama de frecvențe pe ecran, trebuie să facem acest lucru deoarece principiul de funcționare al OLED este foarte ciudat.
display.setCursor (45, 20); display.println (contor); // imprimați informațiile contorului pe afișaj. if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // imprima Hz pe display.display (); // când toate seturile actualizează afișajul} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // când toate seturile actualizează afișajul} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // când toate seturile actualizează afișajul}
Apoi, verificăm butonul de apăsare a variabilei pentru a imprima ieșirea activată / dezactivată pe OLED. Din nou, acest lucru trebuie făcut din cauza modulului OLED.
if (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output ON"); // imprimați ieșirea pe afișajul afișajului.display (); display.setTextSize (2); } else {display.setTextSize (1); display.setCursor (65, 45); display.print ("Output OFF"); // imprimați ieșirea pe afișajul afișajului.display (); display.setTextSize (2); }
Aceasta marchează sfârșitul procesului nostru de codificare. Dacă sunteți confuz în acest moment, puteți verifica comentariile din cod pentru o înțelegere suplimentară.
Testarea generatorului de funcții bazate pe AD9833
Pentru a testa circuitul, este utilizată configurarea de mai sus. După cum puteți vedea, am conectat un adaptor de alimentare de 12V DC la mufa cilindrică DC și am conectat osciloscopul Hantek la ieșirea circuitului. De asemenea, am conectat osciloscopul la laptop pentru a vizualiza și măsura frecvența de ieșire.
Odată ce acest lucru a fost făcut, am setat frecvența de ieșire la 5 KHz cu ajutorul codificatorului rotativ și testăm unde sinusoidale de ieșire și destul de sigur, este o undă sinusoidală de 5 KHz la ieșire.
Apoi, am schimbat forma de undă de ieșire într-o undă triunghiulară, dar frecvența a rămas aceeași, forma de undă de ieșire este prezentată mai jos.
Apoi am schimbat ieșirea într-o undă pătrată și am observat ieșirea și a fost o undă pătrată perfectă.
De asemenea, am modificat intervalele de frecvență și am testat ieșirea și a funcționat bine.
Îmbunătățiri suplimentare
Acest circuit este doar o dovadă a conceptului și are nevoie de îmbunătățiri suplimentare. În primul rând, avem nevoie de un PCB de bună calitate și de un conector BNC de bună calitate pentru ieșire, altfel nu putem obține o frecvență mai mare. Amplitudinea modulului este foarte scăzută, deci, pentru a îmbunătăți acest lucru, avem nevoie de câteva circuite op-amp pentru a amplifica tensiunea de ieșire. Un potențiometru poate fi conectat pentru a varia amplitudinea de ieșire. Se poate conecta un comutator pentru compensarea semnalului; aceasta este, de asemenea, o caracteristică obligatorie. Și, în plus, codul are nevoie de multe îmbunătățiri, deoarece este un mic buggy. În cele din urmă, afișajele OLED trebuie schimbate altfel este imposibil să scrieți cod ușor de înțeles.
Aceasta marchează sfârșitul acestui tutorial, sper că ți-a plăcut articolul și ai învățat ceva nou. Dacă aveți întrebări cu privire la articol, le puteți lăsa în secțiunea de comentarii de mai jos sau puteți utiliza Forumul nostru de electronice.