Schema schematică a unui generator dds pe un microcontroler atmel. Generator dds funcțional pe plc. Testarea modurilor de funcționare a generatorului după asamblare

Schema schematică a unui generator dds pe un microcontroler atmel.  Generator dds funcțional pe plc.  Testarea modurilor de funcționare a generatorului după asamblare
Schema schematică a unui generator dds pe un microcontroler atmel. Generator dds funcțional pe plc. Testarea modurilor de funcționare a generatorului după asamblare

Frecvența maximă - 65534 Hz ​​(și până la 8 MHz de ieșire HS cu undă pătrată). Și apoi m-am gândit că un generator este o sarcină excelentă în care FPGA se poate arăta cel mai bine. Din punct de vedere sportiv, am decis să repet proiectul pe FPGA, respectând în același timp termenele în două weekenduri, și obținând parametrii nu strict definiți, dar maxim posibil. Puteți afla ce a ieșit din asta sub tăietură.

Ziua zero

Înainte să sosească weekendul, am avut timp să mă gândesc la implementare. Pentru a-mi simplifica sarcina, am decis să fac generatorul nu ca un dispozitiv separat cu butoane și un ecran LCD, ci ca un dispozitiv care se conectează la un PC prin USB. Pentru asta am o placă USB2RS232. Placa nu necesită drivere (CDC), prin urmare, cred că va funcționa sub Linux (pentru unii acest lucru este important). De asemenea, nu voi ascunde că am lucrat deja cu primirea mesajelor prin RS232. Voi lua module gata făcute pentru a lucra cu RS232 de la opencores.com.

Pentru a genera un semnal sinusoid, veți avea nevoie de un DAC. Am ales tipul DAC, ca în proiectul original - R2R 8-bit. Vă va permite să operați la frecvențe înalte, de ordinul megaherților. Sunt convins că FPGA ar trebui să facă față acestui lucru

Mă gândeam cum să scriu un program pentru transmiterea datelor printr-un port COM. Pe de o parte, puteți scrie în Delphi7, aveți deja experiență în scrierea unui astfel de program și, în plus, dimensiunea fișierului executabil nu va fi mare. De asemenea, am încercat să schițez ceva pentru a lucra cu Serial sub forma unui script java într-o pagină html, dar a funcționat mai mult sau mai puțin doar prin API-ul serial Chrome, dar pentru asta trebuie să instalați un plugin... în general , este de asemenea exclus. Am încercat PyQt5 ca o inovație pentru mine, dar atunci când distribuiți un astfel de proiect, trebuie să trageți o grămadă de biblioteci. După ce am încercat să compilați un proiect PyQt într-un fișier exe, s-a dovedit a avea mai mult de 10 MB. Adică, nu va fi mai bună decât o aplicație scrisă în C++\Qt5. De asemenea, merită să luăm în considerare faptul că nu am experiență în dezvoltarea în python, dar am experiență în Qt5. Prin urmare, alegerea a căzut pe Qt5. De la a cincea versiune, a apărut un modul pentru lucrul cu seriale și am lucrat deja cu el. Iar o aplicație bazată pe Qt5 poate fi transferată pe Linux și Mac (pentru unii acest lucru este important), iar din versiunea 5.2, aplicațiile bazate pe QWidgets pot fi transferate chiar și pe un smartphone!

Ce altceva este nevoie? Desigur, placa are un FPGA. Am două dintre ele (ciclonul iv EP4CE10E22C8N pentru 10 mii de celule și ciclonul ii EP2C5 pentru 5 mii de celule). Îl voi alege pe cel din stânga doar datorită conectorului mai convenabil. Din punct de vedere al volumului, proiectul nu intenționează să fie de amploare, așa că se va încadra în oricare dintre cele două. Nu diferă în ceea ce privește viteza de funcționare. Ambele plăci au la bord oscilatoare de 50 MHz, iar în interiorul FPGA există un PLL, cu care pot crește frecvența până la 200 MHz planificați.

Prima zi

Datorită faptului că deja făcusem modulul DDS în proiectul meu de sintetizator, am luat imediat fierul de lipit și am început să lipim DAC-ul cu rezistențe. Am luat o placă prototip. Instalarea s-a făcut folosind împachetare. Singura schimbare care a afectat tehnologia a fost că am abandonat acidul F38N pentru cositorizarea suporturilor în favoarea gelului de flux indicator TT. Esența tehnologiei este simplă: lipim rafturile într-o placă de circuit imprimat și lipim rezistențele pe ele din partea plăcii de circuit imprimat. Fac conexiunile lipsă prin răsucire. De asemenea, rafturile sunt convenabile pentru că le pot introduce direct în placa FPGA.

Din păcate, acasă nu erau disponibile rezistențe de 1 și 2 kilo-ohmi. Nu era timp să merg la magazin. A trebuit să renunț la una dintre regulile mele și să scot rezistențele de pe vechea placă inutilă. Acolo au fost folosite rezistențe de 15K și 30K. Rezultatul este acest Frankenstein:


După crearea proiectului, trebuie să setați dispozitivul țintă: Meniu Atribuții -> Dispozitiv


În proiect, am codificat modulul DDS principal incontrolabil la o frecvență fixă.

Modul generator de 1000 Hz

modul generator_semnal(clk50M, semnal_out); fir de intrare clk50M; ieșire fir signal_out; fir clk200M; osc osc_200M reg acumulator; atribui semnal_out = acumulator; //încercați să generați 1000 Hz //50.000.000 Hz - frecvența de ceas a generatorului extern //2^32 = 4.294.967.296 - adâncimea de biți DDS - 32 de biți //împărțirea 1000Hz / 50.000.000 Hz / 6 42 / 6 9 4 * 6 mereu @ (posege clk50M) start acumulator<= accumulator + 32"d42949; end endmodule


După aceea, am făcut clic pe „Start Compilation” pentru ca mediul de dezvoltare să întrebe ce linii de intrare/ieșire avem în modulul principal al proiectului și la ce PIN-uri fizice sunt conectate la aproape oricine atribuiți liniile care apar la PIN-urile reale ale cipului FPGA:

Element de meniu Atribuții -> Planificator de pin

Vă rugăm să ignorați liniile HS_OUT, key0 și key1 pentru moment, ele apar în proiect mai târziu, dar nu am avut timp să fac o captură de ecran de la început.

În principiu, este suficient să „înregistrați” doar PIN_nn în coloana Locație, iar parametrii rămași (standard I/O, Current Strench și Slew Rate) pot fi lăsați implicit, sau îi puteți selecta pe aceiași care sunt oferiți de implicit (implicit), astfel încât să nu existe avertisment „ov.

Cum pot afla ce PIN corespunde numărului conectorului de pe placă?

Numerele pinului conectorului sunt marcate pe placă


Iar pinii FPGA la care sunt conectate contactele conectorului sunt descriși în documentația care vine cu placa FPGA.




După ce pinii sunt alocați, compilez proiectul din nou și îl flash folosind un programator USB. Dacă nu aveți drivere instalate pentru programatorul USB Byte Blaster, atunci spuneți Windows că acestea se află în folderul în care aveți instalat Quartus. Atunci o va găsi ea însăși.

Programatorul trebuie să fie conectat la conectorul JTAG. Și elementul de meniu pentru programare este „Instrumente -> Programator” (sau faceți clic pe pictograma din bara de instrumente). Butonul „Start”, veselul „Succes” și firmware-ul sunt deja în interiorul FPGA și funcționează deja. Doar nu opriți FPGA, altfel va uita totul.

Instrumente -> Programator


DAC-ul este conectat la conectorul plăcii FPGA. Conectez osciloscopul S1-112A la ieșirea DAC. Rezultatul ar trebui să fie un „ferăstrău” deoarece partea superioară a cuvântului DDS al acumulatorului de fază este scoasă la ieșirea pe 8 biți. Și crește mereu până se revarsă.

Aproximativ 1,5 ore și pentru o frecvență de 1000 Hz văd următoarea oscilogramă:

Aș dori să remarc că „fierăstrăul” are o mică fractură în mijloc. Se datorează faptului că rezistențele au o gamă de valori.

Un alt punct important care trebuia clarificat este frecvența maximă posibilă cu care va funcționa generatorul DDS. Cu parametrii TimeQuest configurați corect, după compilare în „Raportul de compilare” puteți vedea că viteza circuitului este peste 200 MHz cu o marjă. Aceasta înseamnă că voi înmulți frecvența generatorului de 50 MHz cu 4 folosind PLL Voi crește valoarea acumulatorului de fază DDS cu o frecvență de 200 MHz. Gama finală de frecvență care poate fi obținută în condițiile noastre este 0 - 100 MHz. Precizia setarii frecventei:

200.000.000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Adică este mai bun decât ~0,05 Hz. Consider că precizia unei fracțiuni de hertz este suficientă pentru un generator cu o astfel de gamă de frecvențe de funcționare (0...100 MHz). Dacă cineva trebuie să mărească acuratețea, atunci pentru a face acest lucru, puteți crește adâncimea de biți DDS (nu uitați să verificați TimeQuest Timing Analyzer că viteza de operare a circuitului logic a fost în CLK = 200 MHz, deoarece acesta este un sumator), sau pur și simplu reduceți frecvența ceasului, dacă nu este necesară o gamă atât de largă de frecvență.

Analizor de sincronizare TimeQuest


După ce am văzut „saw” pe ecran, problemele de familie m-au forțat să plec la țară (era ziua mea liberă). Acolo am cosit, gătit, făcut grătar și habar nu aveam de surpriza care mă aștepta seara. Mai aproape de noapte, înainte de a merge la culcare, am decis să mă uit la forma semnalului pentru alte frecvențe.

Pentru frecventa 100 kHz

Pentru frecventa 250 kHz

Pentru frecventa 500 kHz

Pentru frecventa de 1 MHz

A doua zi

Datorită faptului că era interesant cum ar funcționa DAC-ul pe rezistențele de 100 și 200 ohmi, am luat imediat fierul de lipit. De data aceasta, DAC-ul s-a dovedit a fi mai precis și a durat mai puțin timp pentru a-l instala.

Punem DAC-ul pe placa FPGA și îl conectăm la osciloscop

Se verifică 1 MHz - VO! Este cu totul alta chestiune!

Am văzut 10 MHz

Am văzut 25 MHz


Forma fierăstrăului de 10 MHz este încă similară cu cea corectă. Dar la 25 MHz nu mai este deloc „drăguț”. Cu toate acestea, C1-112a are o lățime de bandă de 10 MHz, așa că în acest caz motivul poate fi deja în osciloscop.

În principiu, această problemă cu DAC poate fi considerată închisă. Acum să luăm forme de undă ale ieșirii de mare viteză. Pentru a face acest lucru, vom scoate cel mai semnificativ bit într-un PIN separat al FPGA. Vom lua datele pentru această linie din bitul cel mai semnificativ al acumulatorului DDS.

Atribuiți hs_out = acumulator;

Undă pătrată 1 MHz

Undă pătrată 5 MHz

Undă pătrată 25 MHz

Unda pătrată de 50 MHz este aproape invizibilă acum


Dar cred că ieșirea FPGA ar trebui să fie încărcată cu rezistență. Poate că fronturile ar fi fost mai abrupte.

Sinusul se face conform tabelului. Dimensiunea tabelului este de 256 de valori de 8 biți. Ar fi fost posibil să iau mai multe, dar aveam deja un fișier mif gata făcut. Folosind expertul, creăm un element ROM cu date din tabelul sinus din fișierul mif.

Crearea unui ROM - Instrumente -> Manager de plugin Mega Wizard


Selectați 1 port ROM și dați un nume modulului

Suntem de acord

Suntem de acord și aici

Folosind browse, găsim fișierul nostru mif cu tabelul sinus

Nici aici nu schimbam nimic.

Debifați modulul sine_rom_bb.v - nu este necesar. Următorul finisaj. Quartus va cere să adauge un modul la proiect - suntem de acord. După aceasta, modulul poate fi utilizat la fel ca orice alt modul din Verilog.


Cei 8 biți superiori ai cuvântului acumulator DDS vor fi folosiți ca adresă ROM, iar datele de ieșire vor fi valoarea sinusului.

Cod

//sine rom wire sine_out; sine_rom sine1(.clock(clk200M), .address(acumulator), .q(sine_out));


Oscilograma unei unde sinusoidale la frecvențe diferite arată... la fel.

Dacă doriți, puteți lua în considerare problemele DAC asociate cu răspândirea rezistenței:

Ei bine, acesta este sfârșitul weekendului. Dar software-ul pentru controlul de pe un PC nu a fost încă scris. Sunt nevoit să recunosc faptul că nu am respectat termenele planificate.

Ziua trei

Este foarte puțin timp, așa că scriem programul în grabă (în cele mai bune tradiții). În unele locuri, pentru a reduce numărul de litere și pentru a ușura introducerea informațiilor de la tastatură, se folosește un filtru de evenimente după numele widgetului. Vă rog să înțelegeți și să iertați.

Interfață

Legături cu analogi

Nu este o listă completă
Generator DDS funcțional. Creat pe baza AVR. Frecvențe 0... 65534 Hz.
Revizuirea generatorului DDS GK101. Creat folosind Altera MAX240 FPGA. Frecvențe de până la 10 MHz.
Generator multifuncțional pe PIC16F870. Gama de frecvente: 11 Hz - 60 kHz.
generatoare Adăugați etichete

Frecvența maximă - 65534 Hz ​​(și până la 8 MHz de ieșire HS cu undă pătrată). Și apoi m-am gândit că un generator este o sarcină excelentă în care FPGA se poate arăta cel mai bine. Din punct de vedere sportiv, am decis să repet proiectul pe FPGA, respectând în același timp termenele în două weekenduri, și obținând parametrii nu strict definiți, dar maxim posibil. Puteți afla ce a ieșit din asta sub tăietură.

Ziua zero

Înainte să sosească weekendul, am avut timp să mă gândesc la implementare. Pentru a-mi simplifica sarcina, am decis să fac generatorul nu ca un dispozitiv separat cu butoane și un ecran LCD, ci ca un dispozitiv care se conectează la un PC prin USB. Pentru asta am o placă USB2RS232. Placa nu necesită drivere (CDC), prin urmare, cred că va funcționa sub Linux (pentru unii acest lucru este important). De asemenea, nu voi ascunde că am lucrat deja cu primirea mesajelor prin RS232. Voi lua module gata făcute pentru a lucra cu RS232 de la opencores.com.

Pentru a genera un semnal sinusoid, veți avea nevoie de un DAC. Am ales tipul DAC, ca în proiectul original - R2R 8-bit. Vă va permite să operați la frecvențe înalte, de ordinul megaherților. Sunt convins că FPGA ar trebui să facă față acestui lucru

Mă gândeam cum să scriu un program pentru transmiterea datelor printr-un port COM. Pe de o parte, puteți scrie în Delphi7, aveți deja experiență în scrierea unui astfel de program și, în plus, dimensiunea fișierului executabil nu va fi mare. De asemenea, am încercat să schițez ceva pentru a lucra cu Serial sub forma unui script java într-o pagină html, dar a funcționat mai mult sau mai puțin doar prin API-ul serial Chrome, dar pentru asta trebuie să instalați un plugin... în general , este de asemenea exclus. Am încercat PyQt5 ca o inovație pentru mine, dar atunci când distribuiți un astfel de proiect, trebuie să trageți o grămadă de biblioteci. După ce am încercat să compilați un proiect PyQt într-un fișier exe, s-a dovedit a avea mai mult de 10 MB. Adică, nu va fi mai bună decât o aplicație scrisă în C++\Qt5. De asemenea, merită să luăm în considerare faptul că nu am experiență în dezvoltarea în python, dar am experiență în Qt5. Prin urmare, alegerea a căzut pe Qt5. De la a cincea versiune, a apărut un modul pentru lucrul cu seriale și am lucrat deja cu el. Iar o aplicație bazată pe Qt5 poate fi transferată pe Linux și Mac (pentru unii acest lucru este important), iar din versiunea 5.2, aplicațiile bazate pe QWidgets pot fi transferate chiar și pe un smartphone!

Ce altceva este nevoie? Desigur, placa are un FPGA. Am două dintre ele (ciclonul iv EP4CE10E22C8N pentru 10 mii de celule și ciclonul ii EP2C5 pentru 5 mii de celule). Îl voi alege pe cel din stânga doar datorită conectorului mai convenabil. Din punct de vedere al volumului, proiectul nu intenționează să fie de amploare, așa că se va încadra în oricare dintre cele două. Nu diferă în ceea ce privește viteza de funcționare. Ambele plăci au la bord oscilatoare de 50 MHz, iar în interiorul FPGA există un PLL, cu care pot crește frecvența până la 200 MHz planificați.

Prima zi

Datorită faptului că deja făcusem modulul DDS în proiectul meu de sintetizator, am luat imediat fierul de lipit și am început să lipim DAC-ul cu rezistențe. Am luat o placă prototip. Instalarea s-a făcut folosind . Singura schimbare care a afectat tehnologia a fost că am abandonat acidul F38N pentru cositorirea suporturilor în favoarea gelului de flux indicator TT. Esența tehnologiei este simplă: lipim rafturile într-o placă de circuit imprimat și lipim rezistențele pe ele din partea plăcii de circuit imprimat. Fac conexiunile lipsă prin răsucire. De asemenea, rafturile sunt convenabile pentru că le pot introduce direct în placa FPGA.

Din păcate, acasă nu erau disponibile rezistențe de 1 și 2 kilo-ohmi. Nu era timp să merg la magazin. A trebuit să renunț la una dintre regulile mele și să scot rezistențele de pe vechea placă inutilă. Acolo au fost folosite rezistențe de 15K și 30K. Rezultatul este acest Frankenstein:


După crearea proiectului, trebuie să setați dispozitivul țintă: Meniu Atribuții -> Dispozitiv


În proiect, am codificat modulul DDS principal incontrolabil la o frecvență fixă.

Modul generator de 1000 Hz

modul generator_semnal(clk50M, semnal_out); fir de intrare clk50M; ieșire fir signal_out; fir clk200M; osc osc_200M reg acumulator; atribui semnal_out = acumulator; //încercați să generați 1000 Hz //50.000.000 Hz - frecvența de ceas a generatorului extern //2^32 = 4.294.967.296 - adâncimea de biți DDS - 32 de biți //împărțirea 1000Hz / 50.000.000 Hz / 6 42 / 6 9 4 * 6 mereu @ (posege clk50M) start acumulator<= accumulator + 32"d42949; end endmodule


După aceea, am făcut clic pe „Start Compilation” pentru ca mediul de dezvoltare să întrebe ce linii de intrare/ieșire avem în modulul principal al proiectului și la ce PIN-uri fizice sunt conectate la aproape oricine atribuiți liniile care apar la PIN-urile reale ale cipului FPGA:

Element de meniu Atribuții -> Planificator de pin

Vă rugăm să ignorați liniile HS_OUT, key0 și key1 pentru moment, ele apar în proiect mai târziu, dar nu am avut timp să fac o captură de ecran de la început.

În principiu, este suficient să „înregistrați” doar PIN_nn în coloana Locație, iar parametrii rămași (standard I/O, Current Strench și Slew Rate) pot fi lăsați implicit, sau îi puteți selecta pe aceiași care sunt oferiți de implicit (implicit), astfel încât să nu existe avertisment „ov.

Cum pot afla ce PIN corespunde numărului conectorului de pe placă?

Numerele pinului conectorului sunt marcate pe placă


Iar pinii FPGA la care sunt conectate contactele conectorului sunt descriși în documentația care vine cu placa FPGA.




După ce pinii sunt alocați, compilez proiectul din nou și îl flash folosind un programator USB. Dacă nu aveți drivere instalate pentru programatorul USB Byte Blaster, atunci spuneți Windows că acestea se află în folderul în care aveți instalat Quartus. Atunci o va găsi ea însăși.

Programatorul trebuie să fie conectat la conectorul JTAG. Și elementul de meniu pentru programare este „Instrumente -> Programator” (sau faceți clic pe pictograma din bara de instrumente). Butonul „Start”, veselul „Succes” și firmware-ul sunt deja în interiorul FPGA și funcționează deja. Doar nu opriți FPGA, altfel va uita totul.

Instrumente -> Programator


DAC-ul este conectat la conectorul plăcii FPGA. Conectez osciloscopul S1-112A la ieșirea DAC. Rezultatul ar trebui să fie un „ferăstrău” deoarece partea superioară a cuvântului DDS al acumulatorului de fază este scoasă la ieșirea pe 8 biți. Și crește mereu până se revarsă.

Aproximativ 1,5 ore și pentru o frecvență de 1000 Hz văd următoarea oscilogramă:

Aș dori să remarc că „fierăstrăul” are o mică fractură în mijloc. Se datorează faptului că rezistențele au o gamă de valori.

Un alt punct important care trebuia clarificat este frecvența maximă posibilă cu care va funcționa generatorul DDS. Cu parametrii TimeQuest configurați corect, după compilare în „Raportul de compilare” puteți vedea că viteza circuitului este peste 200 MHz cu o marjă. Aceasta înseamnă că voi înmulți frecvența generatorului de 50 MHz cu 4 folosind PLL Voi crește valoarea acumulatorului de fază DDS cu o frecvență de 200 MHz. Gama finală de frecvență care poate fi obținută în condițiile noastre este 0 - 100 MHz. Precizia setarii frecventei:

200.000.000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Adică este mai bun decât ~0,05 Hz. Consider că precizia unei fracțiuni de hertz este suficientă pentru un generator cu o astfel de gamă de frecvențe de funcționare (0...100 MHz). Dacă cineva trebuie să mărească acuratețea, atunci pentru a face acest lucru, puteți crește adâncimea de biți DDS (nu uitați să verificați TimeQuest Timing Analyzer că viteza de operare a circuitului logic a fost în CLK = 200 MHz, deoarece acesta este un sumator), sau pur și simplu reduceți frecvența ceasului, dacă nu este necesară o gamă atât de largă de frecvență.

Analizor de sincronizare TimeQuest


După ce am văzut „saw” pe ecran, problemele de familie m-au forțat să plec la țară (era ziua mea liberă). Acolo am cosit, gătit, făcut grătar și habar nu aveam de surpriza care mă aștepta seara. Mai aproape de noapte, înainte de a merge la culcare, am decis să mă uit la forma semnalului pentru alte frecvențe.

Pentru frecventa 100 kHz

Pentru frecventa 250 kHz

Pentru frecventa 500 kHz

Pentru frecventa de 1 MHz

A doua zi

Datorită faptului că era interesant cum ar funcționa DAC-ul pe rezistențele de 100 și 200 ohmi, am luat imediat fierul de lipit. De data aceasta, DAC-ul s-a dovedit a fi mai precis și a durat mai puțin timp pentru a-l instala.

Punem DAC-ul pe placa FPGA și îl conectăm la osciloscop

Se verifică 1 MHz - VO! Este cu totul alta chestiune!

Am văzut 10 MHz

Am văzut 25 MHz


Forma fierăstrăului de 10 MHz este încă similară cu cea corectă. Dar la 25 MHz nu mai este deloc „drăguț”. Cu toate acestea, C1-112a are o lățime de bandă de 10 MHz, așa că în acest caz motivul poate fi deja în osciloscop.

În principiu, această problemă cu DAC poate fi considerată închisă. Acum să luăm forme de undă ale ieșirii de mare viteză. Pentru a face acest lucru, vom scoate cel mai semnificativ bit într-un PIN separat al FPGA. Vom lua datele pentru această linie din bitul cel mai semnificativ al acumulatorului DDS.

Atribuiți hs_out = acumulator;

Undă pătrată 1 MHz

Undă pătrată 5 MHz

Undă pătrată 25 MHz

Unda pătrată de 50 MHz este aproape invizibilă acum


Dar cred că ieșirea FPGA ar trebui să fie încărcată cu rezistență. Poate că fronturile ar fi fost mai abrupte.

Sinusul se face conform tabelului. Dimensiunea tabelului este de 256 de valori de 8 biți. Ar fi fost posibil să iau mai multe, dar aveam deja un fișier mif gata făcut. Folosind expertul, creăm un element ROM cu date din tabelul sinus din fișierul mif.

Crearea unui ROM - Instrumente -> Manager de plugin Mega Wizard


Selectați 1 port ROM și dați un nume modulului

Suntem de acord

Suntem de acord și aici

Folosind browse, găsim fișierul nostru mif cu tabelul sinus

Nici aici nu schimbam nimic.

Debifați modulul sine_rom_bb.v - nu este necesar. Următorul finisaj. Quartus va cere să adauge un modul la proiect - suntem de acord. După aceasta, modulul poate fi utilizat la fel ca orice alt modul din Verilog.


Cei 8 biți superiori ai cuvântului acumulator DDS vor fi folosiți ca adresă ROM, iar datele de ieșire vor fi valoarea sinusului.

Cod

//sine rom wire sine_out; sine_rom sine1(.clock(clk200M), .address(acumulator), .q(sine_out));


Oscilograma unei unde sinusoidale la frecvențe diferite arată... la fel.

Dacă doriți, puteți lua în considerare problemele DAC asociate cu răspândirea rezistenței:

Ei bine, acesta este sfârșitul weekendului. Dar software-ul pentru controlul de pe un PC nu a fost încă scris. Sunt nevoit să recunosc faptul că nu am respectat termenele planificate.

Ziua trei

Este foarte puțin timp, așa că scriem programul în grabă (în cele mai bune tradiții). În unele locuri, pentru a reduce numărul de litere și pentru a ușura introducerea informațiilor de la tastatură, se folosește un filtru de evenimente după numele widgetului. Vă rog să înțelegeți și să iertați.

Interfață

Legături cu analogi

Nu este o listă completă
Generator DDS funcțional. Creat pe baza AVR. Frecvențe 0... 65534 Hz.
Revizuirea generatorului DDS GK101. Creat folosind Altera MAX240 FPGA. Frecvențe de până la 10 MHz.
Generator multifuncțional pe PIC16F870. Gama de frecvente: 11 Hz - 60 kHz.
generatoare
  • Qt5
  • Adaugă etichete

    Orice atelier de acasă ar trebui să aibă setul necesar de instrumente și instrumente de măsură. Pentru persoanele implicate în radioamatori ca hobby, costurile bănești mari ale achiziționării echipamentelor necesare sunt adesea inacceptabile.

    Deci, în cazul meu, lista acestor echipamente a fost departe de a fi completă și lipsită generator de semnal.

    Generator de semnal S-a dovedit a fi ușor să te faci din elementele radio disponibile și nu scump până la urmă. Așa că, după ce am scotocit pe Internet, am găsit un număr mare de circuite pentru diverse generatoare, inclusiv modele mai avansate cu DAC, dar deja scumpe de fabricat. Pentru început, m-am oprit la un simplu Generator de semnal DDS pe microcontrolerul ATMEGA8 de la Atmel. Acesta, nu am îmbunătățit sau schimbat nimic - am lăsat totul așa cum este, am creat doar o copie și, în plus, nu pretind dreptul de autor al acestui dispozitiv.

    Asa de, generator de semnal are caracteristici bune și este potrivit pentru rezolvarea unor probleme simple.

    Afișarea informațiilor în generator de semnal produs pe un afișaj LCD de 16x2 caractere cu un controler HD44780. Este de remarcat faptul că pentru a salva porturile microcontrolerului, afișajul LCD este controlat prin doar trei fire, acest lucru a fost realizat prin utilizarea unui registru de deplasare - citiți despre cum să conectați un afișaj prin trei fire.

    Este necesară salvarea porturilor, 8 porturi sunt folosite pentru un DAC rezistiv, 7 porturi pentru butoane. În articolul original, autorul a promis că va folosi modularea PWM, dar se pare că nu a terminat-o, deoarece a început să dezvolte o versiune mai avansată pe ATMEGA16.

    Schema schematică a unui generator de semnal DDSși placa de circuit imprimat.

    Circuitul și plăcile sunt prezentate în original, ele conțin și butoane pentru controlul PWM neutilizate de autor.

    Pentru DAC, am cumpărat în mod special rezistențe de precizie cu o eroare de ± 0,05%, dar după cum s-a dovedit, cele simple cu o eroare de ± 5% sunt destul de suficiente. Forma semnalului a fost destul de acceptabilă pentru toate tipurile de semnale.

    Când generator asamblat și programul încărcat în microcontroler, nu sunt necesare setări, cu excepția cazului în care reglați contrastul afișajului.

    Lucrul cu dispozitivul este simplu - selectați forma semnalului, setați frecvența necesară și puteți modifica treapta de setare a frecvenței cu limite de 1 - 10 - 100 - 1000 Hz pe pas. Apoi faceți clic pe Start și generatorul începe să funcționeze. Trebuie remarcat faptul că atunci când generatorul este pornit, frecvența și forma semnalului nu pot fi modificate, acest lucru se datorează faptului că programul intră într-o buclă nesfârșită și pentru a crește frecvența maximă de generare, procedura de sondare a butonului trebuia îndepărtat. Pentru a opri generarea, faceți clic pe stop/reset, acest lucru repornește programul și revine la meniul de setări. Iată nuanța.

    Separat, aș vrea să vorbesc despre realizarea unei carcase pentru generator. Puteți achiziționa o carcasă gata făcută într-un magazin sau puteți utiliza una potrivită de la alt dispozitiv, dar am decis să o fac în totalitate. O bucată de fibră de sticlă cu două fețe a rămas inactiv, pe care am donat-o corpului.

    În primul rând, trebuie să luați toate măsurătorile, dimensiunile afișajului LCD și ale plăcii generatoare de semnal, sursa de alimentare, conectorii și butoanele, apoi așezați-o pe o coală de hârtie așa cum va fi în interiorul carcasei. Pe baza dimensiunilor obținute, puteți începe producția.

    Acest proiect este un generator de funcții universal și de înaltă calitate, care, în ciuda unei anumite complexități a circuitului, cel puțin în comparație cu cele mai simple, are o funcționalitate foarte largă, ceea ce justifică costul asamblarii acestuia. Este capabil să producă 9 forme de undă diferite și, de asemenea, funcționează cu sincronizarea impulsurilor.

    Schema schematică a generatorului de pe MK

    Setări dispozitiv

    • Gama de frecvente: 10 Hz - 60 kHz
    • Reglarea digitală a frecvenței în 3 pași diferiți
    • Forme de undă: sinusoidală, triunghiulară, pătrat, ferăstrău, impuls H, impuls L, rafală, măturare, zgomot
    • Interval de ieșire: 15V pentru sinus și triunghi, 0-5V pentru alte moduri
    • Există o ieșire pentru sincronizarea impulsurilor

    Dispozitivul este alimentat de la 12 volți AC, ceea ce asigură o tensiune DC suficient de mare (peste 18 V) necesară pentru funcționarea normală a 78L15 și 79L15, care formează un circuit bipolar de 15 V. Acest lucru se face astfel încât microcircuitul LF353 să poată ieși gamă completă de semnale la sarcină 1 kOhm.

    Controler de nivel folosit ALPS SRBM1L0800. Circuitul ar trebui să utilizeze rezistențe cu o toleranță de ± 1% sau mai bună. Limitatoare de curent LED - rezistențe seria 4306R. Luminozitatea poate fi mărită în funcție de preferința interpretului. Generatorul este asamblat într-o carcasă de plastic 178x154x36 mm cu panouri frontale și posterioare din aluminiu.

    Multe componente de contact sunt montate pe panourile din față și din spate (butoane, butoane, conectori RCA, ansambluri LED, conector de alimentare). Plăcile cu circuite imprimate sunt atașate la carcasă cu șuruburi cu distanțiere din plastic. Toate celelalte elemente ale generatorului sunt montate pe plăci de circuite imprimate - sursa de alimentare este separată. Butonul din stânga din mijloc este pentru a schimba modul, cel din dreapta este pentru a selecta frecvența modului.

    Generatorul produce diverse semnale și funcționează în trei moduri, care sunt selectate cu ajutorul tastei „Selectare” și indicate de cele trei LED-uri superioare (în diagramă). Controlul rotativ modifică parametrii semnalului conform următorului tabel:

    Imediat după setarea în modul 1, are loc generarea sinusului. Cu toate acestea, frecvența de pornire este destul de scăzută și este nevoie de cel puțin un clic al codificatorului pentru ao crește. Placa are un contact pentru conectarea dispozitivului pentru programare, ceea ce vă permite să schimbați rapid funcționalitatea generatorului de semnal, dacă este necesar. Toate fișierele de proiect - firmware-ul PIC16F870, desenele de pe placă sunt localizate

    Acest generator de funcții DDS (versiunea 2.0) de semnale este asamblat pe un microcontroler AVR, are o funcționalitate bună, are control de amplitudine și este, de asemenea, asamblat pe o placă de circuit imprimat cu o singură față.

    Acest generator se bazează pe algoritmul generator Jesper DDS, programul a fost modernizat pentru AVR-GCC C cu inserții de cod de asamblare. Generatorul are două semnale de ieșire: primul este semnale DDS, al doilea este o ieșire „dreptunghiulară” de mare viteză (1..8 MHz), care poate fi folosită pentru a revigora MK cu fuzze incorecte și în alte scopuri.
    Semnalul HS (High Speed) de mare viteză este preluat direct de la microcontrolerul Atmega16 OC1A (PD5).
    Semnalele DDS sunt generate de la alte ieșiri MC printr-o matrice rezistivă R2R și prin cipul LM358N, care permite ajustarea amplitudinii și offset-ului semnalului. Offset-ul și amplitudinea sunt reglate folosind două potențiometre. Offset-ul poate fi ajustat în intervalul +5V..-5V, iar amplitudinea este de 0...10V. Frecvența semnalelor DDS poate fi ajustată în intervalul 0... 65534 Hz, acest lucru este mai mult decât suficient pentru testarea circuitelor audio și a altor sarcini radio amatori.

    Principalele caracteristici ale generatorului DDS V2.0:
    - un circuit simplu cu radioelemente comune și ieftine;
    - placa de circuit imprimat pe o singura fata;
    - sursa de alimentare incorporata;
    - ieșire separată de mare viteză (HS) până la 8 MHz;
    - semnale DDS cu amplitudine si offset variabile;
    - Semnale DDS: sinus, dreptunghi, ferăstrău și ferăstrău invers, triunghi, semnal ECG și semnal de zgomot;
    - Ecran LCD 2×16;
    - tastatură intuitivă cu 5 butoane;
    - trepte pentru reglarea frecventei: 1, 10, 100, 1000, 10000 Hz;
    - amintirea ultimei stări după pornirea alimentării.

    Diagrama bloc de mai jos arată structura logică a unui generator de funcții:

    După cum puteți vedea, dispozitivul necesită mai multe tensiuni de alimentare: +5V, -12V, +12V. Tensiunile +12V și -12V sunt utilizate pentru a regla amplitudinea și offset-ul semnalului. Sursa de alimentare este proiectată folosind un transformator și mai multe cipuri stabilizatoare de tensiune:

    Sursa de alimentare este asamblată pe o placă separată:

    Dacă nu doriți să asamblați singur sursa de alimentare, puteți utiliza o sursă de alimentare ATX obișnuită de la un computer, unde sunt deja prezente toate tensiunile necesare. Dispunerea conectorului ATX.

    ecran LCD

    Toate acțiunile sunt afișate pe un ecran LCD. Generatorul este controlat de cinci taste

    Tastele sus/jos sunt folosite pentru a vă deplasa prin meniu, tastele stânga/dreapta sunt folosite pentru a modifica valoarea frecvenței. Când tasta centrală este apăsată, semnalul selectat începe să fie generat. Apăsarea din nou a tastei oprește generatorul.

    Este furnizată o valoare separată pentru a seta treapta de schimbare a frecvenței. Acest lucru este convenabil dacă trebuie să schimbați frecvența pe o gamă largă.

    Generatorul de zgomot nu are nicio setare. Utilizează funcția obișnuită rand(), care este alimentată continuu la ieșirea generatorului DDS.

    Ieșirea HS de mare viteză are 4 moduri de frecvență: 1, 2, 4 și 8 MHz.

    Diagramă schematică

    Circuitul generator de funcții este simplu și conține elemente ușor accesibile:
    - microcontroler AVR Atmega16, cu quartz extern la 16 MHz;
    - ecran LCD standard de tip HD44780 2×16;
    - Matrice R2R DAC realizată din rezistențe obișnuite;
    - amplificator operațional LM358N (analog domestic KR1040UD1);
    - două potențiometre;
    - cinci chei;
    - mai multi conectori.

    A plati:

    Generatorul funcțional este asamblat într-o cutie de plastic:


    Software

    După cum am spus mai sus, mi-am bazat programul pe algoritmul generatorului Jesper DDS. Am adăugat câteva linii de cod de asamblare pentru a implementa oprirea generației. Acum algoritmul conține 10 cicluri CPU, în loc de 9.

    void static inline Signal_OUT(const uint8_t *semnal, uint8_t ad2, uint8_t ad1, uint8_t ad0)(
    asm volatile("eor r18, r18 ;r18<-0″ "\n\t"
    „eor r19, r19 ;r19<-0″ "\n\t"
    "1:" "\n\t"
    „adăugați r18, %0 ;1 ciclu” „\n\t”
    „adc r19, %1 ;1 ciclu” „\n\t”
    „adc %A3, %2 ;1 ciclu” „\n\t”
    „lpm ;3 cicluri” „\n\t”
    „out %4, __tmp_reg__ ;1 ciclu” „\n\t”
    „sbis %5, 2 ;1 ciclu dacă nu se omite” „\n\t”
    "rjmp 1b ;2 cicluri. Total 10 cicluri" "\n\t"
    :
    :"r" (ad0),,"r" (ad1),,"r" (ad2),,"e" (semnal),,"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR) ))
    : „r18″, „r19″
    );}

    Tabelul cu forme de semnal DDS se află în memoria flash a MK, a cărei adresă începe la 0xXX00. Aceste secțiuni sunt definite în fișierul make, în locațiile de memorie corespunzătoare:
    #Definiți secțiuni în care să stocați tabelele de semnal
    LDFLAGS += -Wl,-section-start=.MySection1=0x3A00
    LDFLAGS += -Wl,-section-start=.MySection2=0x3B00
    LDFLAGS += -Wl,-section-start=.MySection3=0x3C00
    LDFLAGS += -Wl,-section-start=.MySection4=0x3D00
    LDFLAGS += -Wl,-section-start=.MySection5=0x3E00
    LDFLAGS += -Wl,-section-start=.MySection6=0x3F00