Atmeli mikrokontrolleri dds-generaatori skemaatiline diagramm. Funktsionaalne dds-generaator plc-s. Generaatori töörežiimide test pärast kokkupanekut

Atmeli mikrokontrolleri dds-generaatori skemaatiline diagramm.  Funktsionaalne dds-generaator plc-s.  Generaatori töörežiimide test pärast kokkupanekut
Atmeli mikrokontrolleri dds-generaatori skemaatiline diagramm. Funktsionaalne dds-generaator plc-s. Generaatori töörežiimide test pärast kokkupanekut

Maksimaalne sagedus - 65534 Hz ​​(ja kuni 8 MHz HS väljund ruutlainega). Ja siis mõtlesin, et generaator on suurepärane ülesanne, kus FPGA saab end parimast küljest näidata. Spordi mõttes otsustasin korrata projekti FPGA-l, pidades samal ajal tähtaegadest kinni kahe nädalavahetuse jooksul ja saades parameetrid mitte rangelt määratletud, vaid maksimaalselt võimaliku. Mis sellest välja tuli, saad teada lõike all.

Päev null

Enne nädalavahetuse saabumist oli mul aega teostuse peale mõelda. Ülesande lihtsustamiseks otsustasin generaatori teha mitte eraldi nuppude ja LCD-ekraaniga seadmena, vaid seadmena, mis ühendatakse arvutiga USB kaudu. Selleks on mul USB2RS232 plaat. Tahvel ei vaja draivereid (CDC), seetõttu arvan, et see töötab Linuxi all (mõnede jaoks on see oluline). Samuti ei varja ma, et olen juba töötanud RS232 kaudu sõnumite vastuvõtmisega. Võtan RS232-ga töötamiseks valmis moodulid saidilt opencores.com.

Siinuslaine signaali genereerimiseks vajate DAC-i. Valisin DAC tüübi, nagu algses projektis - R2R 8-bitine. See võimaldab teil töötada kõrgetel sagedustel, suurusjärgus megahertsi. Olen veendunud, et FPGA peaks sellega toime tulema

Mõtlesin, kuidas kirjutada programm andmete edastamiseks COM-pordi kaudu. Ühest küljest saate kirjutada Delphi7-s, kuid teil on juba kogemusi sellise programmi kirjutamisel ja pealegi pole käivitatava faili maht suur. Üritasin ka html-lehel java skripti kujul visandada midagi Serialiga töötamiseks, kuid see töötas enam-vähem ainult Chrome'i jada API kaudu, kuid selleks on vaja installida plugin... üldiselt , see ei tule samuti kõne alla. Proovisin enda jaoks uuendusena PyQt5, aga sellise projekti levitamisel tuleb hunnik teeke lohistada. Olles proovinud PyQti projekti exe-failiks kompileerida, selgus, et see on üle 10 MB. See tähendab, et see pole parem kui C++\Qt5 keeles kirjutatud rakendus. Tasub ka arvestada, et mul pole pythonis arendamise kogemust, küll aga Qt5-ga. Seetõttu langes valik Qt5 peale. Alates viiendast versioonist ilmus seeriaviisiga töötamise moodul ja olen sellega juba töötanud. Ja Qt5-l põhineva rakenduse saab üle kanda Linuxile ja Macile (mõnede jaoks on see oluline) ning alates versioonist 5.2 saab QWidgetidel põhinevaid rakendusi üle kanda isegi nutitelefoni!

Mida veel vaja on? Loomulikult on plaadil FPGA. Mul on neid kaks (Cyclone iv EP4CE10E22C8N 10 tuhande raku jaoks ja Cyclone ii EP2C5 5 tuhande raku jaoks). Ma valin vasakpoolse ainuüksi mugavama pistiku tõttu. Mahu poolest ei kavatse projekt olla suur, nii et see sobib mõlemasse. Need ei erine töökiiruse poolest. Mõlemal plaadil on pardal 50 MHz ostsillaatorid ja FPGA sees on PLL, millega saan tõsta sagedust planeeritud 200 MHz-ni.

Esimene päev

Seoses sellega, et olin oma süntesaatoriprojektis juba DDS mooduli teinud, võtsin kohe jootekolvi kätte ja hakkasin takistitega DAC-i jootma. Võtsin prototüübi tahvli. Paigaldamine toimus ümbrise abil. Ainus muudatus, mis tehnoloogiat mõjutas, oli see, et loobusin stendide tinatamiseks kasutatavast F38N happest ja eelistasin TT indikaatorvoo geeli. Tehnoloogia olemus on lihtne: jootan riiulid trükkplaadi sisse ja takistid peale trükkplaadi poolelt. Puuduvad ühendused loon keerates. Samuti on nagid mugavad, kuna saan need otse FPGA plaadile sisestada.

Kahjuks polnud kodus saada 1 ja 2 kilooomiseid takisteid. Polnud aega poodi minna. Pidin loobuma ühest oma reeglist ja eemaldama vanalt mittevajalikult plaadilt takistid. Seal kasutati 15K ja 30K takisteid. Tulemuseks on Frankenstein:


Pärast projekti loomist peate määrama sihtseadme: Menüü Assigments -> Device


Projektis kodeerisin kontrollimatu DDS-i põhimooduli fikseeritud sagedusele.

1000 Hz generaatori moodul

mooduli signaali_generaator(clk50M, signaali_väljund); sisendjuhe clk50M; juhtme väljundsignaal_väljund; traat clk200M; osc osc_200M reg akumulaator; määra signaali_väljund = aku; //proovige genereerida 1000 Hz //50 000 000 Hz - välise generaatori taktsagedus //2^32 = 4 294 967 296 - DDS-i bitisügavus - 32 bitti //jagage 1000 Hz / 50 000 000 Hz / 6 = 9,4 9,9,2 alati @ (posedge clk50M) algusaku<= accumulator + 32"d42949; end endmodule


Peale seda klõpsasin “Alusta koostamist”, et arenduskeskkond küsiks, mis sisend/väljundliinid meil projekti põhimoodulis on ja milliste füüsiliste PIN-koodidega on võimalik peale koostamist ühendust võtta määrake FPGA kiibi tegelikele PIN-koodidele ilmuvad read:

Menüüelement Ülesanded -> Pin Planner

Palun ignoreerige praegu ridu HS_OUT, key0 ja key1, need ilmuvad projekti hiljem, kuid mul ei olnud kohe alguses aega ekraanipilti teha.

Põhimõtteliselt piisab, kui asukoha veerus “registreerida” ainult PIN_nn ja ülejäänud parameetrid (I/O standard, Current Strench ja Slew Rate) võib vaikimisi jätta või valida samad, mida pakub vaikimisi (vaikimisi), et ei oleks hoiatust "ov.

Kuidas ma saan teada, milline PIN-kood vastab plaadil olevale pistiku numbrile?

Pistikute tihvtide numbrid on märgitud tahvlile


Ja FPGA tihvte, millega pistiku kontaktid on ühendatud, on kirjeldatud FPGA-plaadiga kaasasolevas dokumentatsioonis.




Pärast tihvtide määramist kompileerin projekti uuesti ja käivitan selle USB-programmeerija abil. Kui teil pole USB Byte Blaster programmeerija jaoks draivereid installitud, öelge Windowsile, et need asuvad kaustas, kuhu olete installinud Quartuse. Siis leiab ta selle ise üles.

Programmeerija peab olema ühendatud JTAG-pistikuga. Ja programmeerimise menüüpunkt on “Tööriistad -> Programmeerija” (või klõpsake tööriistaribal ikooni). Nupp "Start", rõõmus "Edu" ja püsivara on juba FPGA sees ja juba töötavad. Lihtsalt ärge lülitage FPGA-d välja, muidu unustab see kõik.

Tööriistad -> Programmeerija


DAC on ühendatud FPGA plaadi pistikuga. Ühendan S1-112A ostsilloskoobi DAC väljundiga. Tulemuseks peaks olema "saag", kuna faasiaku DDS-sõna kõrge osa väljastatakse 8-bitisesse väljundisse. Ja see kasvab alati, kuni see üle voolab.

Umbes 1,5 tundi ja sagedusel 1000 Hz näen järgmist ostsillogrammi:

Tahaksin märkida, et “sael” on keskel väike murd. See on tingitud asjaolust, et takistitel on väärtuste vahemik.

Veel üks oluline punkt, mida oli vaja selgitada, on maksimaalne võimalik sagedus, millega DDS-generaator töötab. Õigesti seadistatud TimeQuesti parameetrite korral näete pärast kompileerimist "Koostamisaruandes", et vooluahela kiirus on varuga üle 200 MHz. See tähendab, et ma korrutan generaatori sageduse 50 MHz 4-ga, kasutades PLL-i, suurendan DDS-i faasiaku väärtust sagedusega 200 MHz. Lõplik meie tingimustes saadav sagedusvahemik on 0–100 MHz. Sageduse seadmise täpsus:

200 000 000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
See tähendab, et see on parem kui ~ 0,05 Hz. Sellise töösageduste vahemikuga (0...100 MHz) generaatori jaoks pean piisavaks hertsi murdosa täpsust. Kui kellelgi on vaja täpsust suurendada, saate selleks suurendada DDS-i bitisügavust (pidage meeles, et kontrollige TimeQuest Timing Analyzeris, et loogikaahela töökiirus oli CLK = 200 MHz piires, kuna see on liitja), või lihtsalt taktsagedust vähendada, kui nii laia sagedusvahemikku pole vaja.

TimeQuesti ajastuse analüsaator


Pärast seda, kui nägin ekraanil “sae”, sundisid pereasjad mind maale minema (see oli minu vaba päev). Seal niitsin, tegin süüa, grillisin ja polnud õrna aimugi üllatusest, mis mind õhtul ees ootas. Õhtule lähemal, enne magamaminekut, otsustasin vaadata teiste sageduste signaali kuju.

Sagedusel 100 kHz

Sagedusel 250 kHz

Sagedusel 500 kHz

1 MHz sagedusele

Teine päev

Kuna oli huvitav, kuidas DAC töötab 100 ja 200 oomiliste takistitega, võtsin kohe jootekolbi. Seekord osutus täpsemaks DAC ja selle paigaldamine võttis vähem aega.

Panime DAC-i FPGA-plaadile ja ühendame selle ostsilloskoobiga

1 MHz kontrollimine – VO! See on hoopis teine ​​asi!

Nägi 10 MHz

Nägi 25 MHz


10 MHz sae kuju on endiselt sarnane õigele. Kuid 25 MHz juures pole see enam üldse "ilus". C1-112a ribalaius on aga 10 MHz, nii et sel juhul võib põhjus peituda juba ostsilloskoobis.

Põhimõtteliselt võib selle DAC-i teema lugeda lõpetatuks. Nüüd võtame kiire väljundi lainekujud. Selleks väljastame kõige olulisema biti FPGA eraldi PIN-koodi. Võtame selle rea andmed DDS-i akumulaatori kõige olulisemast bitist.

Määra hs_out = aku;

Ruutlaine 1 MHz

Ruutlaine 5 MHz

Ruutlaine 25 MHz

50 MHz ruutlaine on praegu peaaegu nähtamatu


Kuid ma arvan, et FPGA väljund peaks olema koormatud takistusega. Võib-olla oleksid rinded olnud järsemad.

Siinus tehakse tabeli järgi. Tabeli suurus on 256 väärtust 8 bitist. Oleks võinud rohkemgi võtta, aga mul oli juba valmis mif fail. Viisardi abil loome mif-failist siinustabeli andmetega ROM-i elemendi.

ROM-i loomine - Tööriistad -> Mega Wizardi pistikprogrammide haldur


Valige 1 port ROM ja andke moodulile nimi

Oleme nõus

Oleme ka siin nõus

Sirvimise abil leiame oma mif-faili siinuse tabeliga

Ka siin ei muuda me midagi.

Tühjendage mooduli sine_rom_bb.v märge – seda pole vaja. Järgmine finiš. Quartus palub projektile mooduli lisada – oleme nõus. Pärast seda saab moodulit kasutada nagu mis tahes muud Verilogi moodulit.


DDS-i akumulaatorisõna ülemist 8 bitti kasutatakse ROM-aadressina ja andmeväljundiks on siinusväärtus.

Kood

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


Siinuslaine ostsillogramm erinevatel sagedustel näeb välja... ühesugune.

Soovi korral võite kaaluda takisti levikuga seotud DAC-probleeme:

Noh, see on nädalavahetuse lõpp. Kuid arvutist juhtimise tarkvara pole veel kirjutatud. Olen sunnitud tunnistama tõsiasja, et ei pidanud kinni kavandatud tähtaegadest.

Kolmas päev

Aega on väga vähe, seega kirjutame programmi kiirustades (parimate traditsioonide kohaselt). Mõnes kohas kasutatakse tähtede arvu vähendamiseks ja klaviatuurilt teabe sisestamise hõlbustamiseks vidina nime järgi sündmuste filtrit. Palun mõistke ja andke andeks.

Liides

Seosed analoogidega

Mitte täielik nimekiri
Funktsionaalne DDS generaator. Loodud AVR-i põhjal. Sagedused 0... 65534 Hz.
DDS-generaatori GK101 ülevaade. Loodud Altera MAX240 FPGA abil. Sagedused kuni 10 MHz.
Multifunktsionaalne generaator PIC16F870 peal. Sagedusvahemik: 11 Hz - 60 kHz.
generaatorid Lisa silte

Maksimaalne sagedus - 65534 Hz ​​(ja kuni 8 MHz HS väljund ruutlainega). Ja siis mõtlesin, et generaator on suurepärane ülesanne, kus FPGA saab end parimast küljest näidata. Spordi mõttes otsustasin korrata projekti FPGA-l, pidades samal ajal tähtaegadest kinni kahe nädalavahetuse jooksul ja saades parameetrid mitte rangelt määratletud, vaid maksimaalselt võimaliku. Mis sellest välja tuli, saad teada lõike all.

Päev null

Enne nädalavahetuse saabumist oli mul aega teostuse peale mõelda. Ülesande lihtsustamiseks otsustasin generaatori teha mitte eraldi nuppude ja LCD-ekraaniga seadmena, vaid seadmena, mis ühendatakse arvutiga USB kaudu. Selleks on mul USB2RS232 plaat. Tahvel ei vaja draivereid (CDC), seetõttu arvan, et see töötab Linuxi all (mõnede jaoks on see oluline). Samuti ei varja ma, et olen juba töötanud RS232 kaudu sõnumite vastuvõtmisega. Võtan RS232-ga töötamiseks valmis moodulid saidilt opencores.com.

Siinuslaine signaali genereerimiseks vajate DAC-i. Valisin DAC tüübi, nagu algses projektis - R2R 8-bitine. See võimaldab teil töötada kõrgetel sagedustel, suurusjärgus megahertsi. Olen veendunud, et FPGA peaks sellega toime tulema

Mõtlesin, kuidas kirjutada programm andmete edastamiseks COM-pordi kaudu. Ühest küljest saate kirjutada Delphi7-s, kuid teil on juba kogemusi sellise programmi kirjutamisel ja pealegi pole käivitatava faili maht suur. Üritasin ka html-lehel java skripti kujul visandada midagi Serialiga töötamiseks, kuid see töötas enam-vähem ainult Chrome'i jada API kaudu, kuid selleks on vaja installida plugin... üldiselt , see ei tule samuti kõne alla. Proovisin enda jaoks uuendusena PyQt5, aga sellise projekti levitamisel tuleb hunnik teeke lohistada. Olles proovinud PyQti projekti exe-failiks kompileerida, selgus, et see on üle 10 MB. See tähendab, et see pole parem kui C++\Qt5 keeles kirjutatud rakendus. Tasub ka arvestada, et mul pole pythonis arendamise kogemust, küll aga Qt5-ga. Seetõttu langes valik Qt5 peale. Alates viiendast versioonist ilmus seeriaviisiga töötamise moodul ja olen sellega juba töötanud. Ja Qt5-l põhineva rakenduse saab üle kanda Linuxile ja Macile (mõnede jaoks on see oluline) ning alates versioonist 5.2 saab QWidgetidel põhinevaid rakendusi üle kanda isegi nutitelefoni!

Mida veel vaja on? Loomulikult on plaadil FPGA. Mul on neid kaks (Cyclone iv EP4CE10E22C8N 10 tuhande raku jaoks ja Cyclone ii EP2C5 5 tuhande raku jaoks). Ma valin vasakpoolse ainuüksi mugavama pistiku tõttu. Mahu poolest ei kavatse projekt olla suur, nii et see sobib mõlemasse. Need ei erine töökiiruse poolest. Mõlemal plaadil on pardal 50 MHz ostsillaatorid ja FPGA sees on PLL, millega saan tõsta sagedust planeeritud 200 MHz-ni.

Esimene päev

Tänu sellele, et olin oma süntesaatoriprojektis juba DDS mooduli teinud, võtsin kohe jootekolvi kätte ja hakkasin takistitega DAC-i jootma. Võtsin prototüübi tahvli. Paigaldamine viidi läbi kasutades. Ainus muudatus, mis tehnoloogiat mõjutas, oli see, et loobusin stendide tinatamiseks kasutatavast F38N happest ja eelistasin TT indikaatorvoo geeli. Tehnoloogia olemus on lihtne: ma jootan riiulid trükkplaadi sisse ja takistid peale trükkplaadi poolelt. Puuduvad ühendused loon keerates. Samuti on nagid mugavad, kuna saan need otse FPGA-plaadile sisestada.

Kahjuks polnud kodus saada 1 ja 2 kilooomiseid takisteid. Polnud aega poodi minna. Pidin loobuma ühest oma reeglist ja eemaldama vanalt mittevajalikult plaadilt takistid. Seal kasutati 15K ja 30K takisteid. Tulemuseks on Frankenstein:


Pärast projekti loomist peate määrama sihtseadme: Menüü Assigments -> Device


Projektis kodeerisin kontrollimatu DDS-i põhimooduli fikseeritud sagedusele.

1000 Hz generaatori moodul

mooduli signaali_generaator(clk50M, signaali_väljund); sisendjuhe clk50M; juhtme väljundsignaal_väljund; traat clk200M; osc osc_200M reg akumulaator; määra signaali_väljund = aku; //proovige genereerida 1000 Hz //50 000 000 Hz - välise generaatori taktsagedus //2^32 = 4 294 967 296 - DDS-i bitisügavus - 32 bitti //jagage 1000 Hz / 50 000 000 Hz / 6 = 9,4 9,9,2 alati @ (posedge clk50M) algusaku<= accumulator + 32"d42949; end endmodule


Peale seda klõpsasin “Alusta koostamist”, et arenduskeskkond küsiks, mis sisend/väljundliinid meil projekti põhimoodulis on ja milliste füüsiliste PIN-koodidega on võimalik peale koostamist ühendust võtta määrake FPGA kiibi tegelikele PIN-koodidele ilmuvad read:

Menüüelement Ülesanded -> Pin Planner

Palun ignoreerige praegu ridu HS_OUT, key0 ja key1, need ilmuvad projekti hiljem, kuid mul ei olnud kohe alguses aega ekraanipilti teha.

Põhimõtteliselt piisab, kui asukoha veerus “registreerida” ainult PIN_nn ja ülejäänud parameetrid (I/O standard, Current Strench ja Slew Rate) võib vaikimisi jätta või valida samad, mida pakub vaikimisi (vaikimisi), et ei oleks hoiatust "ov.

Kuidas ma saan teada, milline PIN-kood vastab plaadil olevale pistiku numbrile?

Pistikute tihvtide numbrid on märgitud tahvlile


Ja FPGA tihvte, millega pistiku kontaktid on ühendatud, on kirjeldatud FPGA-plaadiga kaasasolevas dokumentatsioonis.




Pärast tihvtide määramist kompileerin projekti uuesti ja käivitan selle USB-programmeerija abil. Kui teil pole USB Byte Blaster programmeerija jaoks draivereid installitud, öelge Windowsile, et need asuvad kaustas, kuhu olete installinud Quartuse. Siis leiab ta selle ise üles.

Programmeerija peab olema ühendatud JTAG-pistikuga. Ja programmeerimise menüüpunkt on “Tööriistad -> Programmeerija” (või klõpsake tööriistaribal ikooni). Nupp "Start", rõõmus "Edu" ja püsivara on juba FPGA sees ja juba töötavad. Lihtsalt ärge lülitage FPGA-d välja, muidu unustab see kõik.

Tööriistad -> Programmeerija


DAC on ühendatud FPGA plaadi pistikuga. Ühendan S1-112A ostsilloskoobi DAC väljundiga. Tulemuseks peaks olema "saag", kuna faasiaku DDS-sõna kõrge osa väljastatakse 8-bitisesse väljundisse. Ja see kasvab alati, kuni see üle voolab.

Umbes 1,5 tundi ja sagedusel 1000 Hz näen järgmist ostsillogrammi:

Tahaksin märkida, et “sael” on keskel väike murd. See on tingitud asjaolust, et takistitel on väärtuste vahemik.

Veel üks oluline punkt, mida oli vaja selgitada, on maksimaalne võimalik sagedus, millega DDS-generaator töötab. Õigesti seadistatud TimeQuesti parameetrite korral näete pärast kompileerimist "Koostamisaruandes", et vooluahela kiirus on varuga üle 200 MHz. See tähendab, et ma korrutan generaatori sageduse 50 MHz 4-ga, kasutades PLL-i, suurendan DDS-i faasiaku väärtust sagedusega 200 MHz. Lõplik meie tingimustes saadav sagedusvahemik on 0–100 MHz. Sageduse seadmise täpsus:

200 000 000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
See tähendab, et see on parem kui ~ 0,05 Hz. Sellise töösageduste vahemikuga (0...100 MHz) generaatori jaoks pean piisavaks hertsi murdosa täpsust. Kui kellelgi on vaja täpsust suurendada, saate selleks suurendada DDS-i bitisügavust (pidage meeles, et kontrollige TimeQuest Timing Analyzeris, et loogikaahela töökiirus oli CLK = 200 MHz piires, kuna see on liitja), või lihtsalt taktsagedust vähendada, kui nii laia sagedusvahemikku pole vaja.

TimeQuesti ajastuse analüsaator


Pärast seda, kui nägin ekraanil “sae”, sundisid pereasjad mind maale minema (see oli minu vaba päev). Seal niitsin, tegin süüa, grillisin ja polnud õrna aimugi üllatusest, mis mind õhtul ees ootas. Õhtule lähemal, enne magamaminekut, otsustasin vaadata teiste sageduste signaali kuju.

Sagedusel 100 kHz

Sagedusel 250 kHz

Sagedusel 500 kHz

1 MHz sagedusele

Teine päev

Kuna oli huvitav, kuidas DAC töötab 100 ja 200 oomiliste takistitega, võtsin kohe jootekolbi. Seekord osutus täpsemaks DAC ja selle paigaldamine võttis vähem aega.

Panime DAC-i FPGA-plaadile ja ühendame selle ostsilloskoobiga

1 MHz kontrollimine – VO! See on hoopis teine ​​asi!

Nägi 10 MHz

Nägi 25 MHz


10 MHz sae kuju on endiselt sarnane õigele. Kuid 25 MHz juures pole see enam üldse "ilus". C1-112a ribalaius on aga 10 MHz, nii et sel juhul võib põhjus peituda juba ostsilloskoobis.

Põhimõtteliselt võib selle DAC-i teema lugeda lõpetatuks. Nüüd võtame kiire väljundi lainekujud. Selleks väljastame kõige olulisema biti FPGA eraldi PIN-koodi. Võtame selle rea andmed DDS-i akumulaatori kõige olulisemast bitist.

Määra hs_out = aku;

Ruutlaine 1 MHz

Ruutlaine 5 MHz

Ruutlaine 25 MHz

50 MHz ruutlaine on praegu peaaegu nähtamatu


Kuid ma arvan, et FPGA väljund peaks olema koormatud takistusega. Võib-olla oleksid rinded olnud järsemad.

Siinus tehakse tabeli järgi. Tabeli suurus on 256 väärtust 8 bitist. Oleks võinud rohkemgi võtta, aga mul oli juba valmis mif fail. Viisardi abil loome mif-failist siinustabeli andmetega ROM-i elemendi.

ROM-i loomine - Tööriistad -> Mega Wizardi pistikprogrammide haldur


Valige 1 port ROM ja andke moodulile nimi

Oleme nõus

Oleme ka siin nõus

Sirvimise abil leiame oma mif-faili siinuse tabeliga

Ka siin ei muuda me midagi.

Tühjendage mooduli sine_rom_bb.v märge – seda pole vaja. Järgmine finiš. Quartus palub projektile mooduli lisada – oleme nõus. Pärast seda saab moodulit kasutada nagu mis tahes muud Verilogi moodulit.


DDS-i akumulaatorisõna ülemist 8 bitti kasutatakse ROM-aadressina ja andmeväljundiks on siinusväärtus.

Kood

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


Siinuslaine ostsillogramm erinevatel sagedustel näeb välja... ühesugune.

Soovi korral võite kaaluda takisti levikuga seotud DAC-probleeme:

Noh, see on nädalavahetuse lõpp. Kuid arvutist juhtimise tarkvara pole veel kirjutatud. Olen sunnitud tunnistama tõsiasja, et ei pidanud kinni kavandatud tähtaegadest.

Kolmas päev

Aega on väga vähe, seega kirjutame programmi kiirustades (parimate traditsioonide kohaselt). Mõnes kohas kasutatakse tähtede arvu vähendamiseks ja klaviatuurilt teabe sisestamise hõlbustamiseks vidina nime järgi sündmuste filtrit. Palun mõistke ja andke andeks.

Liides

Seosed analoogidega

Mitte täielik nimekiri
Funktsionaalne DDS generaator. Loodud AVR-i põhjal. Sagedused 0... 65534 Hz.
DDS-generaatori GK101 ülevaade. Loodud Altera MAX240 FPGA abil. Sagedused kuni 10 MHz.
Multifunktsionaalne generaator PIC16F870 peal. Sagedusvahemik: 11 Hz - 60 kHz.
generaatorid
  • Qt5
  • Lisa märksõnu

    Igas koduses töökojas peaks olema vajalik tööriistade ja mõõteriistade komplekt. Inimestele, kes tegelevad amatöörraadioga hobi korras, on vajalike seadmete ostmise suured rahalised kulud sageli vastuvõetamatud.

    Nii et minu puhul polnud selle varustuse nimekiri kaugeltki täielik ja puudulik signaali generaator.

    Signaali generaator Selgus, et saadaolevatest raadioelementidest on lihtne ise valmistada ja lõppkokkuvõttes mitte kallis. Nii leidsin pärast Internetis tuhnimist suure hulga vooluahelaid erinevatele generaatoritele, sealhulgas täiustatud mudelitele, millel on DAC, kuid tootmine on juba kallis. Alustuseks peatusin lihtsal DDS signaali generaator Atmeli ATMEGA8 mikrokontrolleril. Seda ma ei parandanud ega muutnud midagi - jätsin kõik nii, nagu on, lõin lihtsalt koopia ja pealegi ei pretendeeri ma selle seadme autorlusele.

    Niisiis, signaali generaator on heade omadustega ja sobib lihtsate ülesannete lahendamiseks.

    Teabe kuvamine sisse signaali generaator toodetud 16x2 tähemärgiga LCD-ekraanil koos HD44780 kontrolleriga. Tähelepanuväärne on see, et mikrokontrolleri portide säästmiseks juhitakse LCD-ekraani ainult kolme juhtme kaudu, see saavutati nihkeregistri abil - lugege, kuidas ühendada ekraan kolme juhtme kaudu.

    Portide salvestamine on vajalik, 8 porti kasutatakse takistusliku DAC jaoks, 7 porti nuppude jaoks. Algses artiklis lubas autor kasutada PWM-modulatsiooni, kuid ilmselt ei lõpetanud seda, kuna hakkas arendama ATMEGA16-s täiustatud versiooni.

    DDS-signaali generaatori skemaatiline diagramm ja trükkplaat.

    Ahel ja plaadid on näidatud originaalis, need sisaldavad ka nuppe PWM juhtimiseks, mida autor ei kasuta.

    DAC-i jaoks ostsin spetsiaalselt täppistakistid, mille viga on ±0,05%, kuid nagu selgus, piisab täiesti lihtsatest, mille viga on ±5%. Signaali kuju oli igat tüüpi signaalide jaoks üsna vastuvõetav.

    Millal generaator kokkupandud ja programm mikrokontrollerisse laaditud, pole seadistusi vaja, kui just ekraani kontrasti ei reguleeri.

    Seadmega töötamine on lihtne - valige signaali kuju, määrake vajalik sagedus ja saate muuta sageduse seadistuse sammu piirangutega 1 - 10 - 100 - 1000 Hz sammu kohta. Seejärel klõpsake nuppu Start ja generaator hakkab tööle. Tuleb märkida, et generaatori käivitamisel ei saa signaali sagedust ja kuju muuta, see on tingitud sellest, et programm läheb lõputusse ahelasse ja maksimaalse genereerimise sageduse suurendamiseks on nupu pollimise protseduur tuli eemaldada. Loomise peatamiseks klõpsake nuppu Stop/reset, see taaskäivitab programmi ja naaseb seadete menüüsse. Siin on nüanss.

    Eraldi tahaksin rääkida generaatori korpuse valmistamisest. Valmis ümbrise saab osta poest või kasutada sobivat mõnest muust seadmest, kuid otsustasin selle täiesti ise teha. Tükk kahepoolset klaaskiudu lebas jõude, mille kinkisin kehale.

    Kõigepealt peate tegema kõik mõõtmised, LCD-ekraani ja signaaligeneraatori plaadi, toiteallika, pistikute ja nuppude mõõtmed, seejärel asetage see paberilehele, nagu see korpuse sees on. Saadud mõõtmete põhjal saate tootmist alustada.

    See projekt on kvaliteetne ja universaalne funktsioonigeneraator, millel on vaatamata ahela mõningasele keerukusele, vähemalt võrreldes lihtsamatega, väga lai funktsionaalsus, mis õigustab selle kokkupaneku maksumust. See on võimeline tootma 9 erinevat lainekuju ja töötab ka impulsside sünkroniseerimisega.

    MK generaatori skemaatiline diagramm

    Seadme seaded

    • Sagedusvahemik: 10 Hz - 60 kHz
    • Digitaalne sageduse reguleerimine 3 erinevas etapis
    • Lainekujud: siinus, kolmnurk, ruut, saag, H-impulss, L-impulss, saristamine, pühkimine, müra
    • Väljundvahemik: 15 V siinuse ja kolmnurga jaoks, 0-5 V muude režiimide jaoks
    • Impulsside sünkroonimiseks on väljund

    Seade saab toite 12-voldist vahelduvvoolust, mis tagab 78L15 ja 79L15 normaalseks tööks vajaliku piisavalt kõrge (üle 18 V) alalispinge, mis moodustavad bipolaarse 15 V vooluringi Seda tehakse selleks, et LF353 mikroskeem saaks väljastada täielik signaalivahemik koormusele 1 kOhm.

    Kasutatud tasemekontroller ALPS SRBM1L0800. Ahel peaks kasutama takisteid, mille tolerants on ±1% või parem. LED voolu piirajad - 4306R seeria takistid. Heledust saab suurendada sõltuvalt esineja eelistustest. Generaator on kokku pandud plastikust korpusesse 178x154x36 mm alumiiniumist esi- ja tagapaneelidega.

    Paljud kontaktkomponendid on paigaldatud esi- ja tagapaneelile (nupud, nupud, RCA-pistikud, LED-sõlmed, toitepistik). Trükkplaadid kinnitatakse korpuse külge plastikvahetükkidega poltidega. Kõik teised generaatori elemendid on paigaldatud trükkplaatidele - toiteallikas on eraldi. Keskel asuv vasakpoolne nupp on režiimi muutmiseks, parem režiimi sageduse valimiseks.

    Generaator toodab erinevaid signaale ja töötab kolmes režiimis, mis valitakse klahvi "Select" abil ja mida näitavad kolm ülemist (diagrammil) LED-tuli. Pöördlüliti muudab signaali parameetreid vastavalt järgmisele tabelile:

    Kohe pärast režiimi 1 seadistamist toimub siinuse genereerimine. Käivitussagedus on aga üsna madal ja selle suurendamiseks on vaja vähemalt ühte koodri klõpsu. Plaadil on seadme ühendamiseks programmeerimiseks kontakt, mis võimaldab vajadusel kiiresti signaaligeneraatori funktsionaalsust muuta. Kõik projekti failid - PIC16F870 püsivara, tahvli joonised, asuvad

    See signaalide DDS-i funktsioonigeneraator (versioon 2.0) on monteeritud AVR-i mikrokontrollerile, on hea funktsionaalsusega, amplituudi juhtimisega ja on kokku pandud ka ühepoolsele trükkplaadile.

    See generaator põhineb Jesper DDS generaatori algoritmil, programm on moderniseeritud AVR-GCC C jaoks koos montaažikoodi lisadega. Generaatoril on kaks väljundsignaali: esimene on DDS signaalid, teine ​​on kiire (1..8 MHz) “ristkülikukujuline” väljund, millega saab MK-d elustada valede fuzzide korral ja muuks otstarbeks.
    Kiire HS (High Speed) signaal võetakse otse Atmega16 OC1A (PD5) mikrokontrollerist.
    DDS-signaalid genereeritakse teistest MC-väljunditest läbi takistusliku R2R maatriksi ja LM358N kiibi, mis võimaldab reguleerida signaali amplituudi ja nihet. Nihet ja amplituudi reguleeritakse kahe potentsiomeetriga. Nihet saab reguleerida vahemikus +5V..-5V ning amplituud on 0...10V. DDS-signaalide sagedust saab reguleerida vahemikus 0... 65534 Hz, sellest piisab heliahelate testimiseks ja muudeks amatöörraadioülesanneteks.

    DDS-generaatori V2.0 peamised omadused:
    - lihtne ahel tavaliste ja odavate raadioelementidega;
    - ühepoolne trükkplaat;
    - sisseehitatud toiteallikas;
    - eraldiseisev kiire väljund (HS) kuni 8 MHz;
    - muutuva amplituudi ja nihkega DDS-signaalid;
    - DDS-signaalid: siinus-, ristkülik-, saag- ja tagurpidisaag, kolmnurk, EKG-signaal ja mürasignaal;
    - 2×16 LCD ekraan;
    - intuitiivne 5 nupuga klaviatuur;
    - sageduse reguleerimise sammud: 1, 10, 100, 1000, 10000 Hz;
    - viimase oleku meeldejätmine pärast toite sisselülitamist.

    Allolev plokkskeem näitab funktsioonigeneraatori loogilist struktuuri:

    Nagu näete, vajab seade mitut toitepinget: +5V, -12V, +12V. Pingeid +12V ja -12V kasutatakse signaali amplituudi ja nihke reguleerimiseks. Toiteallikas on konstrueeritud trafo ja mitme pinge stabilisaatori kiibi abil:

    Toiteallikas on kokku pandud eraldi plaadile:

    Kui te ei soovi toiteplokki ise kokku panna, võite kasutada tavalist ATX toiteallikat arvutist, kus kõik vajalikud pinged on juba olemas. ATX-pistiku paigutus.

    LCD ekraan

    Kõik toimingud kuvatakse LCD-ekraanil. Generaatorit juhitakse viie võtmega

    Üles/alla klahve kasutatakse menüüs liikumiseks, vasak-/paremale klahvidega sageduse väärtuse muutmiseks. Keskmise klahvi vajutamisel hakatakse genereerima valitud signaali. Klahvi uuesti vajutamine peatab generaatori.

    Sageduse muutmise sammu määramiseks antakse eraldi väärtus. See on mugav, kui peate sagedust laias vahemikus muutma.

    Mürageneraatoril pole sätteid. See kasutab tavalist rand() funktsiooni, mida antakse pidevalt DDS-generaatori väljundisse.

    HS kiirväljundil on 4 sagedusrežiimi: 1, 2, 4 ja 8 MHz.

    Skemaatiline diagramm

    Funktsioonigeneraatori ahel on lihtne ja sisaldab kergesti ligipääsetavaid elemente:
    - AVR Atmega16 mikrokontroller, välise kvartsiga 16 MHz;
    - standardne HD44780-tüüpi LCD ekraan 2×16;
    - R2R DAC maatriks tavalistest takistitest;
    - operatsioonivõimendi LM358N (KR1040UD1 kodumaine analoog);
    - kaks potentsiomeetrit;
    - viis võtit;
    - mitu pistikut.

    Maksma:

    Funktsionaalne generaator on kokku pandud plastkarpi:


    Tarkvara

    Nagu ma eespool ütlesin, põhinesin oma programmil Jesper DDS generaatori algoritmil. Lisasin genereerimispeatuse rakendamiseks paar rida koostekoodi. Nüüd sisaldab algoritm 9 asemel 10 CPU tsüklit.

    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"
    "lisa r18, %0 ;1 tsükkel" "\n\t"
    "adc r19, %1 ;1 tsükkel" "\n\t"
    "adc %A3, %2 ;1 tsükkel" "\n\t"
    "lpm ;3 tsüklit" "\n\t"
    "välja %4, __tmp_reg__ ;1 tsükkel" "\n\t"
    "sbis %5, 2 ;1 tsükkel, kui vahelejätmist ei toimu" "\n\t"
    "rjmp 1b ;2 tsüklit. Kokku 10 tsüklit" "\n\t"
    :
    :"r" (ad0),,"r" (ad1),,"r" (ad2),"e" (signaal),"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR) ))
    :"r18", "r19"
    );}

    DDS signaali vormide tabel asub MK välkmälus, mille aadress algab 0xXX00. Need jaotised on määratletud make-failis sobivates mälukohtades:
    #Määrake jaotised, kuhu signaalitabeleid salvestada
    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