Atmel mikrokontrollera dds ģeneratora shematiska diagramma. Funkcionāls dds ģenerators plc. Ģeneratora darbības režīmu pārbaude pēc montāžas

Atmel mikrokontrollera dds ģeneratora shematiska diagramma.  Funkcionāls dds ģenerators plc.  Ģeneratora darbības režīmu pārbaude pēc montāžas
Atmel mikrokontrollera dds ģeneratora shematiska diagramma. Funkcionāls dds ģenerators plc. Ģeneratora darbības režīmu pārbaude pēc montāžas

Maksimālā frekvence - 65534 Hz ​​(un līdz 8 MHz HS izeja ar kvadrātviļņu). Un tad es domāju, ka ģenerators ir lielisks uzdevums, kur FPGA var parādīt sevi no labākās puses. Sportiski es nolēmu atkārtot projektu uz FPGA, vienlaikus ievērojot termiņus divu brīvdienu laikā un iegūstot parametrus, kas nav stingri noteikti, bet maksimāli iespējami. Jūs varat uzzināt, kas no tā iznāca zem griezuma.

Nulle diena

Pirms pienāca nedēļas nogale, man bija laiks padomāt par ieviešanu. Lai vienkāršotu savu uzdevumu, es nolēmu izveidot ģeneratoru nevis kā atsevišķu ierīci ar pogām un LCD ekrānu, bet gan kā ierīci, kas savienojas ar datoru, izmantojot USB. Šim nolūkam man ir USB2RS232 plate. Plāksnei nav nepieciešami draiveri (CDC), tāpēc es domāju, ka tā darbosies ar Linux (dažiem tas ir svarīgi). Tāpat neslēpšu, ka ar ziņu saņemšanu caur RS232 jau esmu strādājis. Paņemšu gatavus moduļus darbam ar RS232 no opencores.com.

Lai ģenerētu sinusoidālo viļņu signālu, jums būs nepieciešams DAC. Izvēlējos DAC tipu, kā oriģinālajā projektā - R2R 8-bit. Tas ļaus jums darboties augstās frekvencēs, apmēram megahercu kārtībā. Esmu pārliecināts, ka FPGA vajadzētu ar to tikt galā

Es domāju par to, kā uzrakstīt programmu datu pārsūtīšanai caur COM portu. No vienas puses, jūs varat rakstīt Delphi7, jums jau ir pieredze šādas programmas rakstīšanā, turklāt izpildāmā faila izmērs nebūs liels. Mēģināju arī html lapā ieskicēt kaut ko darbam ar Serial java skripta veidā, bet tas vairāk vai mazāk darbojās tikai caur Chrome seriālo API, bet šim ir jāinstalē spraudnis... vispār , par to arī nevar runāt. Izmēģināju PyQt5 kā inovāciju priekš sevis, bet izplatot šādu projektu, jāvelk kaudze bibliotēku. Mēģinot apkopot PyQt projektu exe failā, izrādījās, ka tas pārsniedz 10 MB. Tas ir, tas nebūs labāks par lietojumprogrammu, kas rakstīta valodā C++\Qt5. Ir arī vērts ņemt vērā, ka man nav pieredzes attīstīšanā python, bet man ir pieredze Qt5. Tāpēc izvēle krita uz Qt5. Kopš piektās versijas parādījās modulis darbam ar seriālu, un es jau ar to esmu strādājis. Un lietojumprogrammu, kuras pamatā ir Qt5, var pārsūtīt uz Linux un Mac (dažiem tas ir svarīgi), un no 5.2 versijas programmas, kuru pamatā ir QWidgets, var pat pārsūtīt uz viedtālruni!

Kas vēl vajadzīgs? Protams, platei ir FPGA. Man ir divi no tiem (Cyclone iv EP4CE10E22C8N 10 tūkstošiem šūnu un Cyclone ii EP2C5 5 tūkstošiem šūnu). Es izvēlēšos to, kas atrodas kreisajā pusē, tikai ērtāka savienotāja dēļ. Apjoma ziņā projekts nedomā būt liels, tāpēc iederēsies nevienā no abiem. Darbības ātrumā tie neatšķiras. Abām platēm uz borta ir 50 MHz oscilatori, un FPGA iekšpusē ir PLL, ar kuru varu palielināt frekvenci līdz plānotajiem 200 MHz.

Pirmā diena

Sakarā ar to, ka savā sintezatora projektā jau biju uztaisījis DDS moduli, uzreiz paņēmu lodāmuru un sāku lodēt DAC ar rezistoriem. Es paņēmu prototipa dēli. Uzstādīšana tika veikta, izmantojot iesaiņojumu. Vienīgās izmaiņas, kas ietekmēja tehnoloģiju, bija tādas, ka es atteicos no F38N skābes stendu alvošanai par labu TT indikatora plūsmas gēlam. Tehnoloģijas būtība ir vienkārša: es lodēju statīvus iespiedshēmas platē un lodēju uz tiem rezistorus no iespiedshēmas plates puses. Trūkstošos savienojumus veicu griežot. Arī statīvi ir ērti, jo tos varu ievietot tieši FPGA platē.

Diemžēl mājās nebija pieejami 1 un 2 kiloomu rezistori. Nebija laika iet uz veikalu. Man bija jāatsakās no viena no maniem noteikumiem un jānoņem rezistori no vecās nevajadzīgās plāksnes. Tur tika izmantoti 15K un 30K rezistori. Rezultāts ir šāds Frankenšteins:


Pēc projekta izveides ir jāiestata mērķa ierīce: Izvēlnes uzdevumi -> Ierīce


Projektā es iekodēju nevadāmo galveno DDS moduli uz fiksētu frekvenci.

1000 Hz ģeneratora modulis

modulis signal_generator(clk50M, sign_out); ievades vads clk50M; vadu izejas signāls_out; vads clk200M; osc osc_200M reg akumulators; piešķirt signāls_out = akumulators; //mēģiniet ģenerēt 1000 Hz //50 000 000 Hz - ārējā ģeneratora takts frekvence //2^32 = 4 294 967 296 - DDS bitu dziļums - 32 biti //dalīt 1000 Hz / 50 000 000 Hz / 6 = 9, 9, 2 vienmēr @ (posedge clk50M) sākuma akumulators<= accumulator + 32"d42949; end endmodule


Pēc tam nospiedu “Sākt kompilāciju”, lai izstrādes vide pajautātu, kādas ievades/izvades līnijas mums ir projekta galvenajā modulī un ar kādiem fiziskajiem PIN kodiem tie ir pieslēgti Pēc kompilācijas mēs varam pieslēgties piešķiriet rindas, kas parādās īstajiem mikroshēmas FPGA PIN kodiem:

Izvēlnes vienums Uzdevumi -> Piespraudes plānotājs

Lūdzu, pagaidām ignorējiet rindas HS_OUT, key0 un key1, tās parādās projektā vēlāk, bet man nebija laika uzņemt ekrānuzņēmumu pašā sākumā.

Principā ailē Location pietiek “reģistrēt” tikai PIN_nn, un atlikušos parametrus (I/O standarts, Current Strench un Slew Rate) var atstāt pēc noklusējuma vai izvēlēties tos pašus, kurus piedāvā noklusējuma (noklusējums), lai nebūtu brīdinājuma "ov.

Kā es varu uzzināt, kurš PIN atbilst savienotāja numuram uz tāfeles?

Savienotāju tapu numuri ir atzīmēti uz tāfeles


Un FPGA tapas, kurām ir pievienoti savienotāja kontakti, ir aprakstītas dokumentācijā, kas tiek piegādāta kopā ar FPGA plati.




Kad tapas ir piešķirtas, es vēlreiz apkopoju projektu un mirgoju, izmantojot USB programmētāju. Ja jums nav instalēti USB Byte Blaster programmētāja draiveri, pastāstiet sistēmai Windows, ka tie atrodas mapē, kurā esat instalējis Quartus. Tad viņa pati to atradīs.

Programmētājs ir jāpievieno JTAG savienotājam. Un programmēšanas izvēlnes vienums ir “Rīki -> Programmētājs” (vai noklikšķiniet uz ikonas rīkjoslā). Poga “Sākt”, priecīgais “Veiksme” un programmaparatūra jau atrodas FPGA un jau darbojas. Vienkārši neizslēdziet FPGA, pretējā gadījumā tas visu aizmirsīs.

Rīki -> Programmētājs


DAC ir pievienots FPGA plates savienotājam. Es pievienoju S1-112A osciloskopu DAC izejai. Rezultātam vajadzētu būt “zāģim”, jo fāzes akumulatora DDS vārda lielākā daļa tiek izvadīta uz 8 bitu izvadi. Un tas vienmēr palielinās, līdz pārplūst.

Apmēram 1,5 stundas un 1000 Hz frekvencei redzu šādu oscilogrammu:

Vēlos atzīmēt, ka “zāģim” ir neliels lūzums vidū. Tas ir saistīts ar faktu, ka rezistoriem ir virkne vērtību.

Vēl viens svarīgs jautājums, kas bija jāprecizē, ir maksimālā iespējamā frekvence, ar kādu darbosies DDS ģenerators. Ar pareizi konfigurētiem TimeQuest parametriem pēc kompilācijas “Kompilācijas atskaitē” var redzēt, ka ķēdes ātrums ir virs 200 MHz ar rezervi. Tas nozīmē, ka es reizināšu ģeneratora frekvenci 50 MHz ar 4, izmantojot PLL, es paaugstināšu DDS fāzes akumulatora vērtību ar frekvenci 200 MHz. Galīgais frekvenču diapazons, ko var iegūt mūsu apstākļos, ir 0 - 100 MHz. Frekvences iestatīšanas precizitāte:

200 000 000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Tas ir, tas ir labāks par ~ 0,05 Hz. Uzskatu, ka ģeneratoram ar šādu darbības frekvenču diapazonu (0...100 MHz) pietiek ar herca daļas precizitāti. Ja kādam ir jāpalielina precizitāte, tad, lai to izdarītu, varat palielināt DDS bitu dziļumu (neaizmirstiet pārbaudīt TimeQuest Timing Analyzer, vai loģiskās ķēdes darbības ātrums bija CLK = 200 MHz robežās, jo tas ir summators), vai vienkārši samazināt takts frekvenci, ja nav nepieciešams tik plašs frekvenču diapazons.

TimeQuest laika analizators


Pēc tam, kad ekrānā ieraudzīju vārdu “zāģis”, ģimenes lietas lika man doties uz laukiem (tā bija mana brīvdiena). Tur es pļāvu, gatavoju, grilu un nenojautu par pārsteigumu, kas mani sagaidīja vakarā. Tuvāk vakaram, pirms gulētiešanas, es nolēmu apskatīt signāla formu citām frekvencēm.

Par frekvenci 100 kHz

Par frekvenci 250 kHz

500 kHz frekvencei

1 MHz frekvencei

Otrā diena

Sakarā ar to, ka bija interesanti, kā DAC darbosies uz 100 un 200 omu rezistoriem, es nekavējoties paņēmu lodāmuru. Šoreiz DAC izrādījās precīzāks, un tā uzstādīšana prasīja mazāk laika.

Mēs uzliekam DAC uz FPGA plates un savienojam to ar osciloskopu

Pārbauda 1 MHz — VO! Tā ir pavisam cita lieta!

Redzēja 10 MHz

Redzēja 25 MHz


10 MHz zāģa forma joprojām ir līdzīga pareizajai. Bet pie 25 MHz tas vairs nav "smuks". Tomēr C1-112a joslas platums ir 10 MHz, tāpēc šajā gadījumā iemesls jau var būt osciloskopā.

Principā šo jautājumu ar DAC var uzskatīt par slēgtu. Tagad ņemsim ātrgaitas izejas viļņu formas. Lai to izdarītu, mēs izvadīsim nozīmīgāko bitu uz atsevišķu FPGA PIN. Mēs ņemsim šīs rindas datus no visnozīmīgākā DDS akumulatora bita.

Piešķirt hs_out = akumulators;

Kvadrātvilnis 1 MHz

Kvadrātvilnis 5 MHz

Kvadrātvilnis 25 MHz

50 MHz kvadrātveida vilnis tagad ir gandrīz neredzams


Bet es domāju, ka FPGA izeja ir jānoslogo ar pretestību. Varbūt frontes būtu bijušas stāvākas.

Sinuss tiek veikts saskaņā ar tabulu. Tabulas lielums ir 256 8 bitu vērtības. Varēja paņemt vairāk, bet man jau bija gatavs mif fails. Izmantojot vedni, mēs izveidojam ROM elementu ar sinusa tabulas datiem no mif faila.

ROM izveide - Rīki -> Mega Wizard spraudņu pārvaldnieks


Izvēlieties 1 porta ROM un piešķiriet modulim nosaukumu

Mēs piekrītam

Mēs arī šeit piekrītam

Izmantojot pārlūkošanu, mēs atrodam savu mif failu ar sinusa tabulu

Arī šeit mēs neko nemainām.

Noņemiet atzīmi no moduļa sine_rom_bb.v - tas nav nepieciešams. Nākamais finišs. Quartus lūgs projektam pievienot moduli - piekrītam. Pēc tam moduli var izmantot tāpat kā jebkuru citu Verilog moduli.


DDS akumulatora vārda augšējie 8 biti tiks izmantoti kā ROM adrese, un datu izvade būs sinusa vērtība.

Kods

//sine rom vads sine_out; sine_rom sine1(.clock(clk200M), .address(accumulator), .q(sine_out));


Sinusoidālā viļņa oscilogramma dažādās frekvencēs izskatās... vienādi.

Ja vēlaties, varat apsvērt DAC problēmas, kas saistītas ar rezistoru izplatību:

Nu, tas ir nedēļas nogales beigas. Bet programmatūra vadībai no datora vēl nav uzrakstīta. Esmu spiests atzīt faktu, ka neesmu ievērojis plānotos termiņus.

Trešā diena

Laika ir ļoti maz, tāpēc programmu rakstām steigā (pēc labākajām tradīcijām). Dažās vietās, lai samazinātu burtu skaitu un atvieglotu informācijas ievadīšanu no tastatūras, pēc logrīka nosaukuma tiek izmantots notikumu filtrs. Lūdzu, saprotiet un piedodiet.

Interfeiss

Saites ar analogiem

Nav pilnīgs saraksts
Funkcionāls DDS ģenerators. Izveidots, pamatojoties uz AVR. Frekvences 0... 65534 Hz.
Pārskats par DDS ģeneratoru GK101. Izveidots, izmantojot Altera MAX240 FPGA. Frekvences līdz 10 MHz.
Daudzfunkciju ģenerators uz PIC16F870. Frekvenču diapazons: 11 Hz - 60 kHz.
ģeneratori Pievienot tagus

Maksimālā frekvence - 65534 Hz ​​(un līdz 8 MHz HS izeja ar kvadrātviļņu). Un tad es domāju, ka ģenerators ir lielisks uzdevums, kur FPGA var parādīt sevi no labākās puses. Sportiski es nolēmu atkārtot projektu uz FPGA, vienlaikus ievērojot termiņus divu brīvdienu laikā un iegūstot parametrus, kas nav stingri noteikti, bet maksimāli iespējami. Jūs varat uzzināt, kas no tā iznāca zem griezuma.

Nulle diena

Pirms pienāca nedēļas nogale, man bija laiks padomāt par ieviešanu. Lai vienkāršotu savu uzdevumu, es nolēmu izveidot ģeneratoru nevis kā atsevišķu ierīci ar pogām un LCD ekrānu, bet gan kā ierīci, kas savienojas ar datoru, izmantojot USB. Šim nolūkam man ir USB2RS232 plate. Plāksnei nav nepieciešami draiveri (CDC), tāpēc es domāju, ka tā darbosies ar Linux (dažiem tas ir svarīgi). Tāpat neslēpšu, ka ar ziņu saņemšanu caur RS232 jau esmu strādājis. Paņemšu gatavus moduļus darbam ar RS232 no opencores.com.

Lai ģenerētu sinusoidālo viļņu signālu, jums būs nepieciešams DAC. Izvēlējos DAC tipu, kā oriģinālajā projektā - R2R 8-bit. Tas ļaus jums darboties augstās frekvencēs, apmēram megahercu kārtībā. Esmu pārliecināts, ka FPGA vajadzētu ar to tikt galā

Es domāju par to, kā uzrakstīt programmu datu pārsūtīšanai caur COM portu. No vienas puses, jūs varat rakstīt Delphi7, jums jau ir pieredze šādas programmas rakstīšanā, turklāt izpildāmā faila izmērs nebūs liels. Mēģināju arī html lapā ieskicēt kaut ko darbam ar Serial java skripta veidā, bet tas vairāk vai mazāk darbojās tikai caur Chrome seriālo API, bet šim ir jāinstalē spraudnis... vispār , par to arī nevar runāt. Izmēģināju PyQt5 kā inovāciju priekš sevis, bet izplatot šādu projektu, jāvelk kaudze bibliotēku. Mēģinot apkopot PyQt projektu exe failā, izrādījās, ka tas pārsniedz 10 MB. Tas ir, tas nebūs labāks par lietojumprogrammu, kas rakstīta valodā C++\Qt5. Ir arī vērts ņemt vērā, ka man nav pieredzes attīstīšanā python, bet man ir pieredze Qt5. Tāpēc izvēle krita uz Qt5. Kopš piektās versijas parādījās modulis darbam ar seriālu, un es jau ar to esmu strādājis. Un lietojumprogrammu, kuras pamatā ir Qt5, var pārsūtīt uz Linux un Mac (dažiem tas ir svarīgi), un no 5.2 versijas programmas, kuru pamatā ir QWidgets, var pat pārsūtīt uz viedtālruni!

Kas vēl vajadzīgs? Protams, platei ir FPGA. Man ir divi no tiem (Cyclone iv EP4CE10E22C8N 10 tūkstošiem šūnu un Cyclone ii EP2C5 5 tūkstošiem šūnu). Es izvēlēšos to, kas atrodas kreisajā pusē, tikai ērtāka savienotāja dēļ. Apjoma ziņā projekts nedomā būt liels, tāpēc iederēsies nevienā no abiem. Darbības ātrumā tie neatšķiras. Abām platēm uz borta ir 50 MHz oscilatori, un FPGA iekšpusē ir PLL, ar kuru varu palielināt frekvenci līdz plānotajiem 200 MHz.

Pirmā diena

Sakarā ar to, ka savā sintezatora projektā jau biju uztaisījis DDS moduli, uzreiz paņēmu lodāmuru un sāku lodēt DAC ar rezistoriem. Es paņēmu prototipa dēli. Uzstādīšana tika veikta, izmantojot. Vienīgās izmaiņas, kas ietekmēja tehnoloģiju, bija tādas, ka es atteicos no F38N skābes stendu alvošanai par labu TT indikatora plūsmas gēlam. Tehnoloģijas būtība ir vienkārša: es lodēju statīvus iespiedshēmas platē un lodēju uz tiem rezistorus no iespiedshēmas plates puses. Trūkstošos savienojumus veicu griežot. Arī statīvi ir ērti, jo tos varu ievietot tieši FPGA platē.

Diemžēl mājās nebija pieejami 1 un 2 kiloomu rezistori. Nebija laika iet uz veikalu. Man bija jāatsakās no viena no maniem noteikumiem un jānoņem rezistori no vecās nevajadzīgās plāksnes. Tur tika izmantoti 15K un 30K rezistori. Rezultāts ir šāds Frankenšteins:


Pēc projekta izveides ir jāiestata mērķa ierīce: Izvēlnes uzdevumi -> Ierīce


Projektā es iekodēju nevadāmo galveno DDS moduli uz fiksētu frekvenci.

1000 Hz ģeneratora modulis

modulis signal_generator(clk50M, sign_out); ievades vads clk50M; vadu izejas signāls_out; vads clk200M; osc osc_200M reg akumulators; piešķirt signāls_out = akumulators; //mēģiniet ģenerēt 1000 Hz //50 000 000 Hz - ārējā ģeneratora takts frekvence //2^32 = 4 294 967 296 - DDS bitu dziļums - 32 biti //dalīt 1000 Hz / 50 000 000 Hz / 6 = 9, 9, 2 vienmēr @ (posedge clk50M) sākuma akumulators<= accumulator + 32"d42949; end endmodule


Pēc tam nospiedu “Sākt kompilāciju”, lai izstrādes vide pajautātu, kādas ievades/izvades līnijas mums ir projekta galvenajā modulī un ar kādiem fiziskajiem PIN kodiem tie ir pieslēgti Pēc kompilācijas mēs varam pieslēgties piešķiriet rindas, kas parādās īstajiem mikroshēmas FPGA PIN kodiem:

Izvēlnes vienums Uzdevumi -> Piespraudes plānotājs

Lūdzu, pagaidām ignorējiet rindas HS_OUT, key0 un key1, tās parādās projektā vēlāk, bet man nebija laika uzņemt ekrānuzņēmumu pašā sākumā.

Principā ailē Location pietiek “reģistrēt” tikai PIN_nn, un atlikušos parametrus (I/O standarts, Current Strench un Slew Rate) var atstāt pēc noklusējuma vai izvēlēties tos pašus, kurus piedāvā noklusējuma (noklusējums), lai nebūtu brīdinājuma "ov.

Kā es varu uzzināt, kurš PIN atbilst savienotāja numuram uz tāfeles?

Savienotāju tapu numuri ir atzīmēti uz tāfeles


Un FPGA tapas, kurām ir pievienoti savienotāja kontakti, ir aprakstītas dokumentācijā, kas tiek piegādāta kopā ar FPGA plati.




Kad tapas ir piešķirtas, es vēlreiz apkopoju projektu un mirgoju, izmantojot USB programmētāju. Ja jums nav instalēti USB Byte Blaster programmētāja draiveri, pastāstiet sistēmai Windows, ka tie atrodas mapē, kurā esat instalējis Quartus. Tad viņa pati to atradīs.

Programmētājs ir jāpievieno JTAG savienotājam. Un programmēšanas izvēlnes vienums ir “Rīki -> Programmētājs” (vai noklikšķiniet uz ikonas rīkjoslā). Poga “Sākt”, priecīgais “Veiksme” un programmaparatūra jau atrodas FPGA un jau darbojas. Vienkārši neizslēdziet FPGA, pretējā gadījumā tas visu aizmirsīs.

Rīki -> Programmētājs


DAC ir pievienots FPGA plates savienotājam. Es pievienoju S1-112A osciloskopu DAC izejai. Rezultātam vajadzētu būt “zāģim”, jo fāzes akumulatora DDS vārda lielākā daļa tiek izvadīta uz 8 bitu izvadi. Un tas vienmēr palielinās, līdz pārplūst.

Apmēram 1,5 stundas un 1000 Hz frekvencei redzu šādu oscilogrammu:

Vēlos atzīmēt, ka “zāģim” ir neliels lūzums vidū. Tas ir saistīts ar faktu, ka rezistoriem ir virkne vērtību.

Vēl viens svarīgs jautājums, kas bija jāprecizē, ir maksimālā iespējamā frekvence, ar kādu darbosies DDS ģenerators. Ar pareizi konfigurētiem TimeQuest parametriem pēc kompilācijas “Kompilācijas atskaitē” var redzēt, ka ķēdes ātrums ir virs 200 MHz ar rezervi. Tas nozīmē, ka es reizināšu ģeneratora frekvenci 50 MHz ar 4, izmantojot PLL, es paaugstināšu DDS fāzes akumulatora vērtību ar frekvenci 200 MHz. Galīgais frekvenču diapazons, ko var iegūt mūsu apstākļos, ir 0 - 100 MHz. Frekvences iestatīšanas precizitāte:

200 000 000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Tas ir, tas ir labāks par ~ 0,05 Hz. Uzskatu, ka ģeneratoram ar šādu darbības frekvenču diapazonu (0...100 MHz) pietiek ar herca daļas precizitāti. Ja kādam ir jāpalielina precizitāte, tad, lai to izdarītu, varat palielināt DDS bitu dziļumu (neaizmirstiet pārbaudīt TimeQuest Timing Analyzer, vai loģiskās ķēdes darbības ātrums bija CLK = 200 MHz robežās, jo tas ir summators), vai vienkārši samazināt takts frekvenci, ja nav nepieciešams tik plašs frekvenču diapazons.

TimeQuest laika analizators


Pēc tam, kad ekrānā ieraudzīju vārdu “zāģis”, ģimenes lietas lika man doties uz laukiem (tā bija mana brīvdiena). Tur es pļāvu, gatavoju, grilu un nenojautu par pārsteigumu, kas mani sagaidīja vakarā. Tuvāk vakaram, pirms gulētiešanas, es nolēmu apskatīt signāla formu citām frekvencēm.

Par frekvenci 100 kHz

Par frekvenci 250 kHz

500 kHz frekvencei

1 MHz frekvencei

Otrā diena

Sakarā ar to, ka bija interesanti, kā DAC darbosies uz 100 un 200 omu rezistoriem, es nekavējoties paņēmu lodāmuru. Šoreiz DAC izrādījās precīzāks, un tā uzstādīšana prasīja mazāk laika.

Mēs uzliekam DAC uz FPGA plates un savienojam to ar osciloskopu

Pārbauda 1 MHz — VO! Tā ir pavisam cita lieta!

Redzēja 10 MHz

Redzēja 25 MHz


10 MHz zāģa forma joprojām ir līdzīga pareizajai. Bet pie 25 MHz tas vairs nav "smuks". Tomēr C1-112a joslas platums ir 10 MHz, tāpēc šajā gadījumā iemesls jau var būt osciloskopā.

Principā šo jautājumu ar DAC var uzskatīt par slēgtu. Tagad ņemsim ātrgaitas izejas viļņu formas. Lai to izdarītu, mēs izvadīsim nozīmīgāko bitu uz atsevišķu FPGA PIN. Mēs ņemsim šīs rindas datus no visnozīmīgākā DDS akumulatora bita.

Piešķirt hs_out = akumulators;

Kvadrātvilnis 1 MHz

Kvadrātvilnis 5 MHz

Kvadrātvilnis 25 MHz

50 MHz kvadrātveida vilnis tagad ir gandrīz neredzams


Bet es domāju, ka FPGA izeja ir jānoslogo ar pretestību. Varbūt frontes būtu bijušas stāvākas.

Sinuss tiek veikts saskaņā ar tabulu. Tabulas lielums ir 256 8 bitu vērtības. Varēja paņemt vairāk, bet man jau bija gatavs mif fails. Izmantojot vedni, mēs izveidojam ROM elementu ar sinusa tabulas datiem no mif faila.

ROM izveide - Rīki -> Mega Wizard spraudņu pārvaldnieks


Izvēlieties 1 porta ROM un piešķiriet modulim nosaukumu

Mēs piekrītam

Mēs arī šeit piekrītam

Izmantojot pārlūkošanu, mēs atrodam savu mif failu ar sinusa tabulu

Arī šeit mēs neko nemainām.

Noņemiet atzīmi no moduļa sine_rom_bb.v - tas nav nepieciešams. Nākamais finišs. Quartus lūgs projektam pievienot moduli - piekrītam. Pēc tam moduli var izmantot tāpat kā jebkuru citu Verilog moduli.


DDS akumulatora vārda augšējie 8 biti tiks izmantoti kā ROM adrese, un datu izvade būs sinusa vērtība.

Kods

//sine rom vads sine_out; sine_rom sine1(.clock(clk200M), .address(accumulator), .q(sine_out));


Sinusoidālā viļņa oscilogramma dažādās frekvencēs izskatās... vienādi.

Ja vēlaties, varat apsvērt DAC problēmas, kas saistītas ar rezistoru izplatību:

Nu, tas ir nedēļas nogales beigas. Bet programmatūra vadībai no datora vēl nav uzrakstīta. Esmu spiests atzīt faktu, ka neesmu ievērojis plānotos termiņus.

Trešā diena

Laika ir ļoti maz, tāpēc programmu rakstām steigā (pēc labākajām tradīcijām). Dažās vietās, lai samazinātu burtu skaitu un atvieglotu informācijas ievadīšanu no tastatūras, pēc logrīka nosaukuma tiek izmantots notikumu filtrs. Lūdzu, saprotiet un piedodiet.

Interfeiss

Saites ar analogiem

Nav pilnīgs saraksts
Funkcionāls DDS ģenerators. Izveidots, pamatojoties uz AVR. Frekvences 0... 65534 Hz.
Pārskats par DDS ģeneratoru GK101. Izveidots, izmantojot Altera MAX240 FPGA. Frekvences līdz 10 MHz.
Daudzfunkciju ģenerators uz PIC16F870. Frekvenču diapazons: 11 Hz - 60 kHz.
ģeneratori
  • Qt5
  • Pievienojiet atzīmes

    Jebkurā mājas darbnīcā jābūt nepieciešamajam instrumentu un mērinstrumentu komplektam. Cilvēkiem, kas nodarbojas ar radioamatieru kā hobiju, augstās naudas izmaksas par nepieciešamā aprīkojuma iegādi bieži vien ir nepieņemamas.

    Tāpēc manā gadījumā šī aprīkojuma saraksts bija tālu no pilnīgas un trūka signālu ģenerators.

    Signālu ģenerators Izrādījās, ka no pieejamajiem radioelementiem pašam izgatavot ir viegli un galu galā nav dārgi. Tātad, rakņājoties internetā, es atradu lielu skaitu ķēžu dažādiem ģeneratoriem, tostarp modernākiem modeļiem ar DAC, bet jau dārgi ražot. Sākumā es apstājos pie vienkārša DDS signāla ģenerators uz ATMEGA8 mikrokontrolleri no Atmel. Šo es neko neuzlaboju un nemainīju - atstāju visu kā ir, tikai izveidoju kopiju un turklāt nepretendēju uz šīs ierīces autorību.

    Tātad, signālu ģenerators ir labas īpašības un piemērots vienkāršu problēmu risināšanai.

    Informācijas parādīšana iekšā signālu ģenerators ražots uz 16x2 rakstzīmju LCD displeja ar HD44780 kontrolieri. Jāatzīmē, ka, lai saglabātu mikrokontrollera pieslēgvietas, LCD displejs tiek vadīts tikai caur trim vadiem, tas tika panākts, izmantojot maiņu reģistru - lasiet par to, kā savienot displeju, izmantojot trīs vadus.

    Nepieciešama pieslēgvietas taupīšana, 8 porti tiek izmantoti rezistīvajam DAC, 7 porti pogām. Sākotnējā rakstā autors apsolīja izmantot PWM modulāciju, taču acīmredzot to nepabeidza, jo viņš sāka izstrādāt progresīvāku versiju uz ATMEGA16.

    DDS signāla ģeneratora shematiska diagramma un iespiedshēmas plate.

    Shēma un plates ir parādītas oriģinālā, tajās ir arī pogas PWM vadībai, kuras autors neizmanto.

    DAC speciāli nopirku precizitātes rezistorus ar kļūdu ±0,05%, bet kā izrādījās, pilnīgi pietiek ar vienkāršiem ar ±5% kļūdu. Signāla forma bija diezgan pieņemama visu veidu signāliem.

    Kad ģenerators samontēts un programma ielādēta mikrokontrollerī, nekādi iestatījumi nav nepieciešami, ja vien nepielāgojat displeja kontrastu.

    Darbs ar ierīci ir vienkāršs - izvēlieties signāla formu, iestatiet nepieciešamo frekvenci, un jūs varat mainīt frekvences iestatīšanas soli ar ierobežojumiem 1 - 10 - 100 - 1000 Hz solī. Pēc tam noklikšķiniet uz Sākt un ģenerators sāk darboties. Jāņem vērā, ka, iedarbinot ģeneratoru, signāla frekvenci un formu nevar mainīt, tas ir saistīts ar to, ka programma ieiet bezgalīgā cilpā un, lai palielinātu maksimālo ģenerēšanas frekvenci, tiek izmantota pogu aptaujas procedūra. bija jānoņem. Lai apturētu ģenerēšanu, noklikšķiniet uz Apturēt/atiestatīt, tas restartēs programmu un atgriežas iestatījumu izvēlnē. Šeit ir nianse.

    Atsevišķi es gribētu runāt par korpusa izgatavošanu ģeneratoram. Jūs varat iegādāties gatavu maciņu veikalā vai izmantot piemērotu no kādas citas ierīces, bet es nolēmu to izgatavot pilnībā pats. Dīkstāvē gulēja abpusējas stiklašķiedras gabals, kuru es ziedoju ķermenim.

    Vispirms jums ir jāveic visi mērījumi, LCD displeja un signālu ģeneratora plates izmēri, barošanas avots, savienotāji un pogas, pēc tam novietojiet to uz papīra lapas, kā tas būs korpusa iekšpusē. Pamatojoties uz iegūtajiem izmēriem, varat sākt ražošanu.

    Šis projekts ir kvalitatīvs un universāls funkciju ģenerators, kuram, neskatoties uz zināmu ķēdes sarežģītību, vismaz salīdzinājumā ar vienkāršākiem, ir ļoti plaša funkcionalitāte, kas attaisno tā montāžas izmaksas. Tas spēj radīt 9 dažādas viļņu formas un darbojas arī ar impulsu sinhronizāciju.

    MK ģeneratora shematiskā diagramma

    Ierīces iestatījumi

    • Frekvenču diapazons: 10 Hz - 60 kHz
    • Digitālā frekvences regulēšana 3 dažādos posmos
    • Viļņu formas: sinusa, trīsstūris, kvadrāts, zāģis, H-impulss, L-impulss, pārrāvums, slaucīšana, troksnis
    • Izvades diapazons: 15 V sinusa un trīsstūra, 0-5 V citiem režīmiem
    • Ir izeja impulsu sinhronizācijai

    Ierīce tiek darbināta no 12 voltu maiņstrāvas, kas nodrošina pietiekami augstu (virs 18 V) līdzstrāvas spriegumu, kas nepieciešams normālai 78L15 un 79L15 darbībai, kas veido bipolāru 15 V ķēdi Tas tiek darīts, lai LF353 mikroshēma varētu izvadīt pilns signālu diapazons slodzei 1 kOhm.

    Izmantotais līmeņa kontrolieris ALPS SRBM1L0800. Ķēdē jāizmanto rezistori ar ±1% pielaidi vai labāku. LED strāvas ierobežotāji - 4306R sērijas rezistori. Spilgtumu var palielināt atkarībā no izpildītāja vēlmēm. Ģenerators ir salikts plastmasas korpusā 178x154x36 mm ar alumīnija priekšējo un aizmugurējo paneļu.

    Daudzi kontaktu komponenti ir uzstādīti uz priekšējā un aizmugurējā paneļa (pogas, pogas, RCA savienotāji, LED bloki, strāvas savienotājs). Iespiedshēmas plates ir piestiprinātas pie korpusa ar skrūvēm ar plastmasas starplikām. Visi pārējie ģeneratora elementi ir uzstādīti uz iespiedshēmu platēm - barošanas avots ir atsevišķs. Kreisā poga vidū ir paredzēta režīma maiņai, labā poga ir režīma frekvences izvēlei.

    Ģenerators rada dažādus signālus un darbojas trīs režīmos, kas tiek atlasīti, izmantojot taustiņu "Atlasīt" un norādīti ar trim augšējām (shēmā) gaismas diodēm. Rotācijas vadība maina signāla parametrus saskaņā ar šādu tabulu:

    Tūlīt pēc iestatīšanas 1. režīmā notiek sinusa ģenerēšana. Tomēr sākuma frekvence ir diezgan zema, un, lai to palielinātu, ir nepieciešams vismaz viens kodētāja klikšķis. Platē ir kontakts ierīces pieslēgšanai programmēšanai, kas ļauj ātri mainīt signāla ģeneratora funkcionalitāti, ja nepieciešams. Visi projekta faili - PIC16F870 programmaparatūra, dēļu rasējumi, atrodas

    Šis signālu DDS funkciju ģenerators (versija 2.0) ir samontēts uz AVR mikrokontrollera, tam ir laba funkcionalitāte, tam ir amplitūdas kontrole, kā arī tas ir samontēts uz vienpusējas iespiedshēmas plates.

    Šis ģenerators ir balstīts uz Jesper DDS ģeneratora algoritmu, programma ir modernizēta AVR-GCC C ar montāžas koda ieliktņiem. Ģeneratoram ir divi izejas signāli: pirmais ir DDS signāli, otrs ir ātrgaitas (1..8 MHz) “taisnstūra” izeja, ar kuru var atdzīvināt MK ar nepareiziem fuziem un citiem mērķiem.
    Ātrgaitas HS (High Speed) signāls tiek ņemts tieši no Atmega16 OC1A (PD5) mikrokontrollera.
    DDS signāli tiek ģenerēti no citām MC izejām, izmantojot rezistīvo R2R matricu un LM358N mikroshēmu, kas ļauj regulēt signāla amplitūdu un nobīdi. Nobīde un amplitūda tiek regulēta, izmantojot divus potenciometrus. Nobīdi var regulēt diapazonā no +5V..-5V, un amplitūda ir 0...10V. DDS signālu frekvenci var regulēt robežās no 0... 65534 Hz, tas ir vairāk nekā pietiekami audio ķēžu pārbaudei un citiem radioamatieru uzdevumiem.

    DDS ģeneratora V2.0 galvenie raksturlielumi:
    - vienkārša shēma ar parastiem un lētiem radioelementiem;
    - vienpusēja iespiedshēmas plate;
    - iebūvēts barošanas avots;
    - atsevišķa ātrgaitas izeja (HS) līdz 8 MHz;
    - DDS signāli ar mainīgu amplitūdu un nobīdi;
    - DDS signāli: sinusa, taisnstūra, zāģa un reversā zāģa, trīsstūra, EKG signāls un trokšņa signāls;
    - 2×16 LCD ekrāns;
    - intuitīva 5 pogu tastatūra;
    - frekvences regulēšanas soļi: 1, 10, 100, 1000, 10000 Hz;
    - atcerēties pēdējo stāvokli pēc strāvas ieslēgšanas.

    Zemāk redzamā blokshēma parāda funkciju ģeneratora loģisko struktūru:

    Kā redzat, ierīcei ir nepieciešami vairāki barošanas spriegumi: +5V, -12V, +12V. Spriegumi +12V un -12V tiek izmantoti signāla amplitūdas un nobīdes regulēšanai. Barošanas avots ir veidots, izmantojot transformatoru un vairākas sprieguma stabilizatora mikroshēmas:

    Barošanas avots ir samontēts uz atsevišķas plates:

    Ja nevēlaties pats montēt barošanas bloku, varat izmantot parasto ATX barošanas bloku no datora, kur jau ir visi nepieciešamie spriegumi. ATX savienotāja izkārtojums.

    LCD ekrāns

    Visas darbības tiek parādītas LCD ekrānā. Ģenerators tiek vadīts ar pieciem taustiņiem

    Augšup/lejup taustiņus izmanto, lai pārvietotos pa izvēlni, kreiso/labo taustiņu izmanto, lai mainītu frekvences vērtību. Nospiežot centrālo taustiņu, sāk ģenerēt izvēlēto signālu. Nospiežot taustiņu vēlreiz, ģenerators tiek apturēts.

    Lai iestatītu frekvences maiņas pakāpi, tiek nodrošināta atsevišķa vērtība. Tas ir ērti, ja nepieciešams mainīt frekvenci plašā diapazonā.

    Trokšņa ģeneratoram nav nekādu iestatījumu. Tas izmanto parasto funkciju rand(), kas nepārtraukti tiek padots uz DDS ģeneratora izvadi.

    HS ātrgaitas izvadei ir 4 frekvences režīmi: 1, 2, 4 un 8 MHz.

    Shematiska diagramma

    Funkciju ģeneratora shēma ir vienkārša un satur viegli pieejamus elementus:
    - AVR Atmega16 mikrokontrolleris, ar ārējo kvarcu 16 MHz;
    - standarta HD44780 tipa LCD ekrāns 2×16;
    - R2R DAC matrica no parastajiem rezistoriem;
    - operacionālais pastiprinātājs LM358N (vietējais KR1040UD1 analogs);
    - divi potenciometri;
    - piecas atslēgas;
    - vairāki savienotāji.

    Maksāt:

    Funkcionālais ģenerators ir salikts plastmasas kastē:


    Programmatūra

    Kā jau teicu iepriekš, es savu programmu balstīju uz Jesper DDS ģeneratora algoritmu. Es pievienoju dažas montāžas koda rindiņas, lai ieviestu ģenerēšanas apturēšanu. Tagad algoritms satur 10 CPU ciklus, nevis 9.

    void static inline Signal_OUT(const uint8_t *signal, 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"
    "pievienot r18, %0 ;1 cikls" "\n\t"
    "adc r19, %1 ;1 cikls" "\n\t"
    "adc %A3, %2 ;1 cikls" "\n\t"
    "lpm ;3 cikli" "\n\t"
    "ārā %4, __tmp_reg__ ;1 cikls" "\n\t"
    "sbis %5, 2 ;1 cikls, ja nav izlaišanas" "\n\t"
    "rjmp 1b ;2 cikli. Kopā 10 cikli" "\n\t"
    :
    :"r" (ad0),"r" (ad1),,"r" (ad2),"e" (signāls),"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR) ))
    :"r18", "r19"
    );}

    DDS signāla formu tabula atrodas MK zibatmiņā, kuras adrese sākas ar 0xXX00. Šīs sadaļas ir definētas makefile atbilstošajās atmiņas vietās:
    #Definējiet sadaļas, kur glabāt signālu tabulas
    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