Egy dds generátor sematikus diagramja egy Atmel mikrokontrolleren. Funkcionális dds generátor a plc-n. A generátor működési módjának tesztelése összeszerelés után

Egy dds generátor sematikus diagramja egy Atmel mikrokontrolleren.  Funkcionális dds generátor a plc-n.  A generátor működési módjának tesztelése összeszerelés után
Egy dds generátor sematikus diagramja egy Atmel mikrokontrolleren. Funkcionális dds generátor a plc-n. A generátor működési módjának tesztelése összeszerelés után

Maximális frekvencia - 65534 Hz ​​(és akár 8 MHz HS kimenet négyszöghullámmal). És akkor arra gondoltam, hogy egy generátor kiváló feladat, ahol az FPGA a legjobban tudja megmutatni magát. Sportszerűen úgy döntöttem, megismétlem a projektet FPGA-n, miközben a határidőket két hétvégén belül betartom, és a nem szigorúan meghatározott paramétereket, hanem a lehető legtöbbet kapom. Hogy mi sült ki ebből, azt a vágás alatt megtudhatja.

Nulladik nap

Mielőtt eljött a hétvége, volt egy kis időm a megvalósításon gondolkodni. A feladatom leegyszerűsítése érdekében úgy döntöttem, hogy a generátort nem különálló eszközként készítem el gombokkal és LCD képernyővel, hanem USB-n keresztül PC-hez csatlakoztatható eszközként. Ehhez van egy USB2RS232 kártyám. Az alaplap nem igényel meghajtókat (CDC), ezért úgy gondolom, hogy Linux alatt működik (egyeseknek ez fontos). Azt sem rejtem véka alá, hogy dolgoztam már üzenetek fogadásával RS232-n keresztül. Kész modulokat veszek az RS232-vel való munkához az opencores.com oldalról.

Szinuszos jel generálásához DAC-ra lesz szüksége. A DAC típust választottam, mint az eredeti projektben - R2R 8 bites. Lehetővé teszi, hogy magas frekvencián működjön, megahertzes nagyságrendben. Meggyőződésem, hogy az FPGA-nak meg kell birkóznia ezzel

Azon gondolkodtam, hogyan írjak programot COM porton keresztüli adatátvitelre. Egyrészt írhatsz Delphi7-ben, van már tapasztalatod egy ilyen program írásában, ráadásul a futtatható fájl mérete sem lesz nagy. Próbáltam egy html oldalon java szkript formájában is felvázolni valamit a Serial-al való munkához, de ez többé-kevésbé csak a Chrome soros API-n keresztül működött, de ehhez telepíteni kell egy plugint... általában , az sem jöhet szóba. Kipróbáltam a PyQt5-öt újításként magamnak, de egy ilyen projekt terjesztésekor egy csomó könyvtárat kell húzni. Miután megpróbáltunk egy PyQt projektet exe fájlba fordítani, kiderült, hogy több mint 10 MB. Vagyis semmivel sem lesz jobb, mint egy C++\Qt5 nyelven írt alkalmazás. Azt is érdemes figyelembe venni, hogy pythonban nincs tapasztalatom fejlesztésben, de Qt5-ben igen. Ezért a választás a Qt5-re esett. Az ötödik verzió óta megjelent egy modul a soros munkavégzéshez, és már dolgoztam is vele. A Qt5 alapú alkalmazás pedig átvihető Linuxra és Macre (van akinek ez fontos), az 5.2-es verziótól pedig akár okostelefonra is átvihetők a QWidgetre épülő alkalmazások!

Mi kell még? Természetesen az alaplapon van FPGA. Nekem kettő van belőle (Cyclone iv EP4CE10E22C8N 10 ezer cellához, és Cyclone ii EP2C5 5 ezer cellához). Kizárólag a kényelmesebb csatlakozó miatt a bal oldaliat választom. A projekt volumenét tekintve nem kíván nagynak lenni, így a kettő bármelyikébe belefér. Sebességben nem különböznek egymástól. Mindkét táblán 50 MHz-es oszcillátorok vannak a fedélzeten, az FPGA-n belül pedig egy PLL, amivel tudom a frekvenciát a tervezett 200 MHz-re emelni.

Az első nap

Tekintettel arra, hogy a szintetizátor projektemben már elkészítettem a DDS modult, azonnal kezembe vettem a forrasztópákát és elkezdtem ellenállásokkal forrasztani a DAC-t. Vettem egy prototípus táblát. A beszerelés burkolással történt. Az egyetlen változás, ami a technológiát érintette, az volt, hogy elhagytam az állványok ónozására szolgáló F38N savat, és a TT indikátor fluxus gél helyett. A technológia lényege egyszerű: nyomtatott áramköri lapba forrasztóállványokat, a nyomtatott áramköri lap felől ellenállásokat forrasztok rájuk. A hiányzó kapcsolatokat csavarással hozom létre. Ezenkívül a rackek kényelmesek, mert közvetlenül az FPGA kártyába helyezhetem őket.

Sajnos itthon nem volt kapható 1 és 2 kiloohmos ellenállás. Nem volt idő a boltba menni. Fel kellett adnom az egyik szabályomat, és eltávolítanom az ellenállásokat a régi, felesleges tábláról. Ott 15K és 30K ellenállásokat használtak. Az eredmény ez a Frankenstein:


A projekt létrehozása után be kell állítani a céleszközt: Menu Assigments -> Device


A projektben a vezérelhetetlen fő DDS modult rögzített frekvenciára kódoltam.

1000 Hz-es generátor modul

modul jelgenerátor(clk50M, jel_kimenet); bemeneti vezeték clk50M; vezeték kimeneti jel_kimenet; huzal clk200M; osc osc_200M reg akkumulátor; assign_out = akkumulátor; //próbálj meg generálni 1000 Hz-et //50 000 000 Hz - a külső generátor órafrekvenciája //2^32 = 4 294 967 296 - DDS bitmélység - 32 bit //osztás 1000 Hz / 50 000 000 Hz / 6 = 9,42 / 6 = 9,42 mindig @ (posedge clk50M) kezdődik akkumulátor<= accumulator + 32"d42949; end endmodule


Ezek után rákattintottam a „Fordítás indítása” gombra, hogy a fejlesztői környezet megkérdezze, hogy a projekt fő moduljában milyen bemeneti/kimeneti vonalaink vannak, és milyen fizikai PIN-kódokhoz csatlakoznak.Szinte bárkihez csatlakozhat. A fordítás után mi rendelje hozzá a megjelenő sorokat az FPGA chip valódi PIN-kódjához:

Menüpont Feladatok -> Pin Planner

Kérem, a HS_OUT, key0 és key1 sorokat egyelőre figyelmen kívül hagyja, ezek később megjelennek a projektben, de a legelején nem volt időm screenshotot készíteni.

Elvileg elég csak a PIN_nn „regisztrálása” a Location oszlopban, és a többi paramétert (I/O szabvány, Current Strench és Slew Rate) alapból meg lehet hagyni, vagy kiválaszthatjuk ugyanazokat, amelyeket alapértelmezett (alapértelmezett), hogy ne legyen figyelmeztetés „ov.

Hogyan tudhatom meg, hogy melyik PIN-kód felel meg a kártyán lévő csatlakozó számának?

A csatlakozó érintkezőinek számai a táblán vannak jelölve


Az FPGA érintkezőket, amelyekhez a csatlakozó érintkezői csatlakoztatják, az FPGA-kártyához mellékelt dokumentáció írja le.




A tűk hozzárendelése után újra lefordítom a projektet, és USB programozóval flashelgetem. Ha nincs telepítve illesztőprogram az USB Byte Blaster programozóhoz, akkor mondja meg a Windowsnak, hogy azok abban a mappában találhatók, ahová telepítette a Quartust. Aztán ő maga is megtalálja.

A programozót a JTAG csatlakozóhoz kell csatlakoztatni. A programozás menüpontja pedig az „Eszközök -> Programozó” (vagy kattintson az ikonra az eszköztáron). A „Start” gomb, az örömteli „Siker” és a firmware már az FPGA-n belül van, és már működik. Csak ne kapcsold ki az FPGA-t, különben mindent elfelejt.

Eszközök -> Programozó


A DAC az FPGA kártya csatlakozójához csatlakozik. A DAC kimenetre egy S1-112A oszcilloszkópot csatlakoztatok. Az eredmény egy „fűrész” legyen, mert a fázisakkumulátor DDS-szava magasabb rendű része a 8 bites kimenetre kerül. És mindig növekszik, amíg túl nem csordul.

Körülbelül 1,5 óra és 1000 Hz-es frekvencia esetén a következő oszcillogramot látom:

Szeretném megjegyezni, hogy a „fűrész” közepén egy kis törés van. Ez annak a ténynek köszönhető, hogy az ellenállásoknak számos értéke van.

Egy másik fontos pont, amelyet tisztázni kell, a DDS generátor maximális lehetséges frekvenciája. Helyesen konfigurált TimeQuest paraméterek esetén a „Compilation Report”-ban fordítás után láthatja, hogy az áramkör sebessége 200 MHz felett van egy margóval. Ez azt jelenti, hogy az 50 MHz-es generátorfrekvenciát PLL segítségével megszorzom 4-gyel.A DDS fázisakkumulátor értékét 200 MHz-es frekvenciával növelem. A mi körülményeink között elérhető végső frekvenciatartomány 0-100 MHz. Frekvencia beállítási pontosság:

200 000 000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Azaz jobb, mint ~0,05 Hz. A hertz töredékének pontosságát elégségesnek tartom egy ilyen üzemi frekvenciatartományú (0...100 MHz) generátorhoz. Ha valakinek növelnie kell a pontosságot, akkor ehhez növelheti a DDS bitmélységet (ne felejtse el ellenőrizni a TimeQuest Timing Analyzer-ben, hogy a logikai áramkör működési sebessége CLK = 200 MHz-en belül volt, mivel ez egy összeadó), vagy egyszerűen csökkentse az órajel frekvenciáját, ha nincs szükség ilyen széles frekvenciatartományra.

TimeQuest Timing Analyzer


Miután megláttam a „fűrészt” a képernyőn, a családi ügyek miatt vidékre kellett mennem (szabadnapom volt). Ott kaszáltam, főztem, grilleztem és fogalmam sem volt arról a meglepetésről, ami este vár rám. Estéhez közelebb, lefekvés előtt úgy döntöttem, hogy megnézem a jel alakját más frekvenciákhoz.

100 kHz frekvenciához

250 kHz frekvenciához

500 kHz frekvenciához

1 MHz frekvenciához

Második nap

Tekintettel arra, hogy érdekes volt, hogyan működik a DAC 100 és 200 ohmos ellenállásokon, azonnal kezembe vettem a forrasztópákát. Ezúttal a DAC pontosabbnak bizonyult, és kevesebb időt vett igénybe a telepítése.

Az FPGA kártyára tesszük a DAC-t és rákötjük az oszcilloszkópra

1 MHz ellenőrzése - VO! Ez teljesen más kérdés!

10 MHz-et látott

25 MHz-et látott


A 10 MHz-es fűrész formája továbbra is hasonló a helyeshez. De 25 MHz-en már egyáltalán nem „szép”. A C1-112a azonban 10 MHz-es sávszélességű, így ebben az esetben már az oszcilloszkópban lehet az ok.

Elvileg ez a kérdés a DAC-val lezártnak tekinthető. Most vegyük a nagy sebességű kimenet hullámformáit. Ehhez a legjelentősebb bitet az FPGA külön PIN-kódjára írjuk ki. Ennek a sornak az adatait a DDS-akkumulátor legjelentősebb bitjéből vesszük.

Hs_out = akkumulátor hozzárendelése;

Négyszöghullám 1 MHz

Négyszög 5 MHz

Négyszög 25 MHz

Az 50 MHz-es négyszöghullám ma már szinte láthatatlan


De szerintem az FPGA kimenetet ellenállással kellene terhelni. Talán a frontok meredekebbek lennének.

A szinusz a táblázat szerint történik. A táblázat mérete 256 8 bites érték. Lehetett volna többet is vinni, de volt már kész mif fájlom. A varázsló segítségével a mif fájlból egy ROM elemet készítünk szinusztábla adatokkal.

ROM létrehozása - Eszközök -> Mega Wizard Plugin manager


Válassza ki az 1 port ROM-ot, és adjon nevet a modulnak

Egyetértünk

Itt is egyetértünk

A tallózás segítségével megtaláljuk a mif fájlunkat a szinusztáblázattal

Itt sem változtatunk semmit.

Törölje a sine_rom_bb.v modul jelölését – nincs rá szükség. Következő befejezés. A Quartus meg fogja kérni, hogy adjon hozzá egy modult a projekthez – egyetértünk. Ezt követően a modul ugyanúgy használható, mint bármely más Verilog modul.


A DDS gyűjtőszó felső 8 bitje lesz ROM címként, az adatkimenet pedig a szinusz érték lesz.

Kód

//sine rom vezeték szinusz_kimenet; sine_rom sine1(.clock(clk200M), .address(acumulator), .q(sine_out));


Egy szinuszhullám oszcillogramja különböző frekvenciákon... ugyanúgy néz ki.

Ha szükséges, mérlegelheti az ellenállás terjedésével kapcsolatos DAC-problémákat:

Na, itt a hétvége vége. De a számítógépről történő vezérléshez még nem írtak szoftvert. Kénytelen vagyok beismerni, hogy nem tartottam a tervezett határidőket.

Harmadik nap

Nagyon kevés az idő, ezért sietve írjuk a programot (a legjobb hagyományok szerint). Egyes helyeken a betűk számának csökkentése és a billentyűzetről történő információbevitel kényelme érdekében eseményszűrőt használnak a widget neve mellett. Kérlek értsd meg és bocsáss meg.

Felület

Kapcsolatok analógokkal

Nem teljes lista
Funkcionális DDS generátor. Az AVR alapján készült. Frekvenciák 0…65534 Hz.
A GK101 DDS generátor áttekintése. Altera MAX240 FPGA segítségével készült. 10 MHz-ig terjedő frekvenciák.
Többfunkciós generátor a PIC16F870-en. Frekvencia tartomány: 11 Hz - 60 kHz.
generátorok Címkék hozzáadása

Maximális frekvencia - 65534 Hz ​​(és akár 8 MHz HS kimenet négyszöghullámmal). És akkor arra gondoltam, hogy egy generátor kiváló feladat, ahol az FPGA a legjobban tudja megmutatni magát. Sportszerűen úgy döntöttem, megismétlem a projektet FPGA-n, miközben a határidőket két hétvégén belül betartom, és a nem szigorúan meghatározott paramétereket, hanem a lehető legtöbbet kapom. Hogy mi sült ki ebből, azt a vágás alatt megtudhatja.

Nulladik nap

Mielőtt eljött a hétvége, volt egy kis időm a megvalósításon gondolkodni. A feladatom leegyszerűsítése érdekében úgy döntöttem, hogy a generátort nem különálló eszközként készítem el gombokkal és LCD képernyővel, hanem USB-n keresztül PC-hez csatlakoztatható eszközként. Ehhez van egy USB2RS232 kártyám. Az alaplap nem igényel meghajtókat (CDC), ezért úgy gondolom, hogy Linux alatt működik (egyeseknek ez fontos). Azt sem rejtem véka alá, hogy dolgoztam már üzenetek fogadásával RS232-n keresztül. Kész modulokat veszek az RS232-vel való munkához az opencores.com oldalról.

Szinuszos jel generálásához DAC-ra lesz szüksége. A DAC típust választottam, mint az eredeti projektben - R2R 8 bites. Lehetővé teszi, hogy magas frekvencián működjön, megahertzes nagyságrendben. Meggyőződésem, hogy az FPGA-nak meg kell birkóznia ezzel

Azon gondolkodtam, hogyan írjak programot COM porton keresztüli adatátvitelre. Egyrészt írhatsz Delphi7-ben, van már tapasztalatod egy ilyen program írásában, ráadásul a futtatható fájl mérete sem lesz nagy. Próbáltam egy html oldalon java szkript formájában is felvázolni valamit a Serial-al való munkához, de ez többé-kevésbé csak a Chrome soros API-n keresztül működött, de ehhez telepíteni kell egy plugint... általában , az sem jöhet szóba. Kipróbáltam a PyQt5-öt újításként magamnak, de egy ilyen projekt terjesztésekor egy csomó könyvtárat kell húzni. Miután megpróbáltunk egy PyQt projektet exe fájlba fordítani, kiderült, hogy több mint 10 MB. Vagyis semmivel sem lesz jobb, mint egy C++\Qt5 nyelven írt alkalmazás. Azt is érdemes figyelembe venni, hogy pythonban nincs tapasztalatom fejlesztésben, de Qt5-ben igen. Ezért a választás a Qt5-re esett. Az ötödik verzió óta megjelent egy modul a soros munkavégzéshez, és már dolgoztam is vele. A Qt5 alapú alkalmazás pedig átvihető Linuxra és Macre (van akinek ez fontos), az 5.2-es verziótól pedig akár okostelefonra is átvihetők a QWidgetre épülő alkalmazások!

Mi kell még? Természetesen az alaplapon van FPGA. Nekem kettő van belőle (Cyclone iv EP4CE10E22C8N 10 ezer cellához, és Cyclone ii EP2C5 5 ezer cellához). Kizárólag a kényelmesebb csatlakozó miatt a bal oldaliat választom. A projekt volumenét tekintve nem kíván nagynak lenni, így a kettő bármelyikébe belefér. Sebességben nem különböznek egymástól. Mindkét táblán 50 MHz-es oszcillátorok vannak a fedélzeten, az FPGA-n belül pedig egy PLL, amivel tudom a frekvenciát a tervezett 200 MHz-re emelni.

Az első nap

Tekintettel arra, hogy a szintetizátor projektemben már elkészítettem a DDS modult, azonnal kezembe vettem a forrasztópákát és elkezdtem ellenállásokkal forrasztani a DAC-t. Vettem egy prototípus táblát. A telepítés a segítségével történt. Az egyetlen változás, ami a technológiát érintette, az volt, hogy elhagytam az állványok ónozására szolgáló F38N savat, és a TT indikátor fluxus gél helyett. A technológia lényege egyszerű: nyomtatott áramköri lapba forrasztóállványokat, a nyomtatott áramköri lap felől ellenállásokat forrasztok rájuk. A hiányzó kapcsolatokat csavarással hozom létre. Ezenkívül a rackek kényelmesek, mert közvetlenül az FPGA kártyába helyezhetem őket.

Sajnos itthon nem volt kapható 1 és 2 kiloohmos ellenállás. Nem volt idő a boltba menni. Fel kellett adnom az egyik szabályomat, és eltávolítanom az ellenállásokat a régi, felesleges tábláról. Ott 15K és 30K ellenállásokat használtak. Az eredmény ez a Frankenstein:


A projekt létrehozása után be kell állítani a céleszközt: Menu Assigments -> Device


A projektben a vezérelhetetlen fő DDS modult rögzített frekvenciára kódoltam.

1000 Hz-es generátor modul

modul jelgenerátor(clk50M, jel_kimenet); bemeneti vezeték clk50M; vezeték kimeneti jel_kimenet; huzal clk200M; osc osc_200M reg akkumulátor; assign_out = akkumulátor; //próbálj meg generálni 1000 Hz-et //50 000 000 Hz - a külső generátor órafrekvenciája //2^32 = 4 294 967 296 - DDS bitmélység - 32 bit //osztás 1000 Hz / 50 000 000 Hz / 6 = 9,42 / 6 = 9,42 mindig @ (posedge clk50M) kezdődik akkumulátor<= accumulator + 32"d42949; end endmodule


Ezek után rákattintottam a „Fordítás indítása” gombra, hogy a fejlesztői környezet megkérdezze, hogy a projekt fő moduljában milyen bemeneti/kimeneti vonalaink vannak, és milyen fizikai PIN-kódokhoz csatlakoznak.Szinte bárkihez csatlakozhat. A fordítás után mi rendelje hozzá a megjelenő sorokat az FPGA chip valódi PIN-kódjához:

Menüpont Feladatok -> Pin Planner

Kérem, a HS_OUT, key0 és key1 sorokat egyelőre figyelmen kívül hagyja, ezek később megjelennek a projektben, de a legelején nem volt időm screenshotot készíteni.

Elvileg elég csak a PIN_nn „regisztrálása” a Location oszlopban, és a többi paramétert (I/O szabvány, Current Strench és Slew Rate) alapból meg lehet hagyni, vagy kiválaszthatjuk ugyanazokat, amelyeket alapértelmezett (alapértelmezett), hogy ne legyen figyelmeztetés „ov.

Hogyan tudhatom meg, hogy melyik PIN-kód felel meg a kártyán lévő csatlakozó számának?

A csatlakozó érintkezőinek számai a táblán vannak jelölve


Az FPGA érintkezőket, amelyekhez a csatlakozó érintkezői csatlakoztatják, az FPGA-kártyához mellékelt dokumentáció írja le.




A tűk hozzárendelése után újra lefordítom a projektet, és USB programozóval flashelgetem. Ha nincs telepítve illesztőprogram az USB Byte Blaster programozóhoz, akkor mondja meg a Windowsnak, hogy azok abban a mappában találhatók, ahová telepítette a Quartust. Aztán ő maga is megtalálja.

A programozót a JTAG csatlakozóhoz kell csatlakoztatni. A programozás menüpontja pedig az „Eszközök -> Programozó” (vagy kattintson az ikonra az eszköztáron). A „Start” gomb, az örömteli „Siker” és a firmware már az FPGA-n belül van, és már működik. Csak ne kapcsold ki az FPGA-t, különben mindent elfelejt.

Eszközök -> Programozó


A DAC az FPGA kártya csatlakozójához csatlakozik. A DAC kimenetre egy S1-112A oszcilloszkópot csatlakoztatok. Az eredmény egy „fűrész” legyen, mert a fázisakkumulátor DDS-szava magasabb rendű része a 8 bites kimenetre kerül. És mindig növekszik, amíg túl nem csordul.

Körülbelül 1,5 óra és 1000 Hz-es frekvencia esetén a következő oszcillogramot látom:

Szeretném megjegyezni, hogy a „fűrész” közepén egy kis törés van. Ez annak a ténynek köszönhető, hogy az ellenállásoknak számos értéke van.

Egy másik fontos pont, amelyet tisztázni kell, a DDS generátor maximális lehetséges frekvenciája. Helyesen konfigurált TimeQuest paraméterek esetén a „Compilation Report”-ban fordítás után láthatja, hogy az áramkör sebessége 200 MHz felett van egy margóval. Ez azt jelenti, hogy az 50 MHz-es generátorfrekvenciát PLL segítségével megszorzom 4-gyel.A DDS fázisakkumulátor értékét 200 MHz-es frekvenciával növelem. A mi körülményeink között elérhető végső frekvenciatartomány 0-100 MHz. Frekvencia beállítási pontosság:

200 000 000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Azaz jobb, mint ~0,05 Hz. A hertz töredékének pontosságát elégségesnek tartom egy ilyen üzemi frekvenciatartományú (0...100 MHz) generátorhoz. Ha valakinek növelnie kell a pontosságot, akkor ehhez növelheti a DDS bitmélységet (ne felejtse el ellenőrizni a TimeQuest Timing Analyzer-ben, hogy a logikai áramkör működési sebessége CLK = 200 MHz-en belül volt, mivel ez egy összeadó), vagy egyszerűen csökkentse az órajel frekvenciáját, ha nincs szükség ilyen széles frekvenciatartományra.

TimeQuest Timing Analyzer


Miután megláttam a „fűrészt” a képernyőn, a családi ügyek miatt vidékre kellett mennem (szabadnapom volt). Ott kaszáltam, főztem, grilleztem és fogalmam sem volt arról a meglepetésről, ami este vár rám. Estéhez közelebb, lefekvés előtt úgy döntöttem, hogy megnézem a jel alakját más frekvenciákhoz.

100 kHz frekvenciához

250 kHz frekvenciához

500 kHz frekvenciához

1 MHz frekvenciához

Második nap

Tekintettel arra, hogy érdekes volt, hogyan működik a DAC 100 és 200 ohmos ellenállásokon, azonnal kezembe vettem a forrasztópákát. Ezúttal a DAC pontosabbnak bizonyult, és kevesebb időt vett igénybe a telepítése.

Az FPGA kártyára tesszük a DAC-t és rákötjük az oszcilloszkópra

1 MHz ellenőrzése - VO! Ez teljesen más kérdés!

10 MHz-et látott

25 MHz-et látott


A 10 MHz-es fűrész formája továbbra is hasonló a helyeshez. De 25 MHz-en már egyáltalán nem „szép”. A C1-112a azonban 10 MHz-es sávszélességű, így ebben az esetben már az oszcilloszkópban lehet az ok.

Elvileg ez a kérdés a DAC-val lezártnak tekinthető. Most vegyük a nagy sebességű kimenet hullámformáit. Ehhez a legjelentősebb bitet az FPGA külön PIN-kódjára írjuk ki. Ennek a sornak az adatait a DDS-akkumulátor legjelentősebb bitjéből vesszük.

Hs_out = akkumulátor hozzárendelése;

Négyszöghullám 1 MHz

Négyszög 5 MHz

Négyszög 25 MHz

Az 50 MHz-es négyszöghullám ma már szinte láthatatlan


De szerintem az FPGA kimenetet ellenállással kellene terhelni. Talán a frontok meredekebbek lennének.

A szinusz a táblázat szerint történik. A táblázat mérete 256 8 bites érték. Lehetett volna többet is vinni, de volt már kész mif fájlom. A varázsló segítségével a mif fájlból egy ROM elemet készítünk szinusztábla adatokkal.

ROM létrehozása - Eszközök -> Mega Wizard Plugin manager


Válassza ki az 1 port ROM-ot, és adjon nevet a modulnak

Egyetértünk

Itt is egyetértünk

A tallózás segítségével megtaláljuk a mif fájlunkat a szinusztáblázattal

Itt sem változtatunk semmit.

Törölje a sine_rom_bb.v modul jelölését – nincs rá szükség. Következő befejezés. A Quartus meg fogja kérni, hogy adjon hozzá egy modult a projekthez – egyetértünk. Ezt követően a modul ugyanúgy használható, mint bármely más Verilog modul.


A DDS gyűjtőszó felső 8 bitje lesz ROM címként, az adatkimenet pedig a szinusz érték lesz.

Kód

//sine rom vezeték szinusz_kimenet; sine_rom sine1(.clock(clk200M), .address(acumulator), .q(sine_out));


Egy szinuszhullám oszcillogramja különböző frekvenciákon... ugyanúgy néz ki.

Ha szükséges, mérlegelheti az ellenállás terjedésével kapcsolatos DAC-problémákat:

Na, itt a hétvége vége. De a számítógépről történő vezérléshez még nem írtak szoftvert. Kénytelen vagyok beismerni, hogy nem tartottam a tervezett határidőket.

Harmadik nap

Nagyon kevés az idő, ezért sietve írjuk a programot (a legjobb hagyományok szerint). Egyes helyeken a betűk számának csökkentése és a billentyűzetről történő információbevitel kényelme érdekében eseményszűrőt használnak a widget neve mellett. Kérlek értsd meg és bocsáss meg.

Felület

Kapcsolatok analógokkal

Nem teljes lista
Funkcionális DDS generátor. Az AVR alapján készült. Frekvenciák 0…65534 Hz.
A GK101 DDS generátor áttekintése. Altera MAX240 FPGA segítségével készült. 10 MHz-ig terjedő frekvenciák.
Többfunkciós generátor a PIC16F870-en. Frekvencia tartomány: 11 Hz - 60 kHz.
generátorok
  • Qt5
  • Címkék hozzáadása

    Minden otthoni műhelynek rendelkeznie kell a szükséges szerszámokkal és mérőeszközökkel. Azok számára, akik hobbiként foglalkoznak rádióamatőrrel, gyakran elfogadhatatlanok a szükséges berendezések beszerzésének magas pénzbeli költségei.

    Így az én esetemben ennek a berendezésnek a listája messze nem volt teljes és hiányzott jelgenerátor.

    Jelgenerátor Kiderült, hogy könnyen elkészíthető a rendelkezésre álló rádióelemekből, és végül nem is drága. Így az interneten való turkálás után nagyszámú áramkört találtam különféle generátorokhoz, beleértve a fejlettebb DAC-s modelleket is, de a gyártás már drága. Kezdésnek megálltam az egyszerűnél. DDS jelgenerátor az Atmel ATMEGA8 mikrokontrollerén. Ezen nem javítottam vagy változtattam semmit - mindent úgy hagytam, ahogy van, csak létrehoztam egy másolatot, és főleg nem állítom ennek az eszköznek a szerzőségét.

    Így, jelgenerátor jó tulajdonságokkal rendelkezik, egyszerű problémák megoldására alkalmas.

    Információk megjelenítése a jelgenerátor HD44780 vezérlővel ellátott 16x2 karakteres LCD kijelzőn készült. Figyelemre méltó, hogy a mikrokontroller portok megtakarítása érdekében az LCD-kijelzőt csak három vezetéken keresztül vezéreljük, ezt egy eltolási regiszter használatával sikerült elérni - olvassa el a kijelző három vezetéken keresztüli csatlakoztatását.

    A portok mentése szükséges, 8 port az ellenállásos DAC-hoz, 7 port a gombokhoz használható. Az eredeti cikkben a szerző megígérte, hogy PWM modulációt használ, de láthatóan nem fejezte be, mivel elkezdett egy fejlettebb verziót fejleszteni az ATMEGA16-on.

    DDS jelgenerátor sematikus diagramjaés nyomtatott áramköri lap.

    Az áramkör és a kártyák az eredetiben láthatók, a szerző által nem használt PWM vezérlésre szolgáló gombokat is tartalmaznak.

    A DAC-hoz kifejezetten precíziós ellenállásokat vettem ±0,05%-os hibával, de mint kiderült, az egyszerű ±5%-os hibával is bőven elég. A hullámforma minden jeltípushoz elfogadható volt.

    Amikor generátorösszeszerelve és a programot betöltve a mikrokontrollerbe, nincs szükség beállításra, hacsak nem állítja be a kijelző kontrasztját.

    A készülékkel való munkavégzés egyszerű - válassza ki a jel alakját, állítsa be a kívánt frekvenciát, és lépésenként 1 - 10 - 100 - 1000 Hz-es határértékekkel módosíthatja a frekvenciabeállítási lépést. Ezután kattintson a Start gombra, és a generátor elkezd dolgozni. Megjegyzendő, hogy a generátor indításakor a jel frekvenciája és alakja nem változtatható, ez abból adódik, hogy a program egy végtelen hurokba megy át, és a maximális generálási frekvencia növelése érdekében a gomb lekérdezési eljárás el kellett távolítani. A generálás leállításához kattintson a stop/reset gombra, ezzel újraindul a program és visszatér a beállítások menübe. Itt az árnyalat.

    Külön szeretném elmondani a generátor házának gyártásáról. Vásárolhat kész tokot egy boltban, vagy használhat egy megfelelőt más eszközről, de úgy döntöttem, hogy teljesen magam készítem. Egy darab kétoldalas üvegszál hevert tétlenül, amit adományoztam a testnek.

    Először is meg kell venni az összes mérést, az LCD kijelző és a jelgenerátor kártya méreteit, a tápegységet, a csatlakozókat és a gombokat, majd egy papírlapra kell helyezni, ahogy a tokban lesz. A kapott méretek alapján megkezdheti a gyártást.

    Ez a projekt egy kiváló minőségű és univerzális funkciógenerátor, amely az áramkör bizonyos bonyolultsága ellenére, legalábbis az egyszerűbbekhez képest, nagyon széles funkcionalitással rendelkezik, ami indokolja az összeszerelés költségeit. 9 különböző hullámforma előállítására képes, és impulzusszinkronizálással is működik.

    A generátor sematikus diagramja az MK-n

    Eszköz beállítások

    • Frekvencia tartomány: 10 Hz - 60 kHz
    • Digitális frekvencia állítás 3 különböző lépésben
    • Hullámformák: Szinusz, Háromszög, Négyzet, Fűrész, H-impulzus, L-impulzus, Burst, Sweep, Zaj
    • Kimeneti tartomány: 15 V szinusz és háromszög, 0-5 V egyéb üzemmódok esetén
    • Van egy kimenet az impulzusszinkronizáláshoz

    A készülék tápellátása 12 voltos váltóáram, amely a 78L15 és 79L15 normál működéséhez szükséges kellően magas (18 V feletti) egyenfeszültséget biztosít, amelyek egy bipoláris 15 V-os áramkört alkotnak, így az LF353 mikroáramkör ki tudja adni a teljes jeltartomány a terheléshez 1 kOhm.

    Szintvezérlő használt ALPS SRBM1L0800. Az áramkörnek ±1%-os vagy jobb tűrésű ellenállásokat kell használnia. LED áramkorlátozók - 4306R sorozatú ellenállások. A fényerő az előadó preferenciáitól függően növelhető. A generátor 178x154x36 mm-es műanyag házba van összeszerelve, alumínium elülső és hátsó panelekkel.

    Számos érintkezőelem van felszerelve az elülső és a hátsó panelre (gombok, tekerőgombok, RCA csatlakozók, LED szerelvények, tápcsatlakozó). A nyomtatott áramköri lapok műanyag távtartókkal ellátott csavarokkal vannak a házhoz rögzítve. A generátor összes többi eleme nyomtatott áramköri lapokra van felszerelve - a tápegység külön van. A középső bal gomb az üzemmód megváltoztatására szolgál, a jobb gomb pedig az üzemmód frekvenciájának kiválasztására szolgál.

    A generátor különféle jeleket állít elő, és három üzemmódban működik, amelyeket a "Select" gombbal lehet kiválasztani, és a három felső (az ábrán) LED jelzi. A forgóvezérlés a jelparamétereket az alábbi táblázat szerint módosítja:

    Közvetlenül az 1-es módba állítás után szinuszgenerálás következik be. Az indítási frekvencia azonban meglehetősen alacsony, és legalább egy kattintásra van szükség a kódolón a növeléséhez. A kártyán van egy érintkező a készülék programozáshoz történő csatlakoztatásához, amely lehetővé teszi a jelgenerátor működésének gyors megváltoztatását, ha szükséges. Az összes projektfájl - PIC16F870 firmware, táblarajzok találhatók

    Ez a jelek DDS funkciógenerátora (2.0-s verzió) AVR mikrokontrollerre van összeszerelve, jó funkcionalitással rendelkezik, amplitúdószabályozással rendelkezik, és egyoldalas nyomtatott áramköri lapra is össze van szerelve.

    Ez a generátor a Jesper DDS generátor algoritmuson alapul, a program AVR-GCC C-re lett modernizálva assembly kód beillesztésekkel. A generátornak két kimeneti jele van: az első a DDS jelek, a második egy nagy sebességű (1..8 MHz) „téglalap alakú” kimenet, amivel hibás fuzzok esetén és egyéb célokra is fel lehet éleszteni az MK-t.
    A nagy sebességű HS (High Speed) jel közvetlenül az Atmega16 OC1A (PD5) mikrokontrollertől származik.
    A DDS jelek más MC kimenetekről generálódnak egy rezisztív R2R mátrixon és az LM358N mikroáramkörön keresztül, amely lehetővé teszi a jel amplitúdójának és eltolásának (Offset) beállítását. Az eltolás és az amplitúdó két potenciométerrel állítható be. Az eltolás +5V..-5V tartományban állítható, az amplitúdó pedig 0...10V. A DDS jelek frekvenciája 0...65534 Hz ​​tartományban állítható, ez bőven elegendő audio áramkörök teszteléséhez és egyéb rádióamatőr feladatokhoz.

    A DDS generátor V2.0 főbb jellemzői:
    - egyszerű áramkör általános és olcsó rádióelemekkel;
    - egyoldalas nyomtatott áramköri lap;
    - beépített tápegység;
    - különálló nagysebességű kimenet (HS) 8 MHz-ig;
    - DDS jelek változó amplitúdójú és eltolású;
    - DDS jelek: szinusz, téglalap, fűrész és fordított fűrész, háromszög, EKG jel és zajjel;
    - 2×16 LCD képernyő;
    - intuitív 5 gombos billentyűzet;
    - a frekvencia beállítás lépései: 1, 10, 100, 1000, 10000 Hz;
    - az utolsó állapot emlékezése a tápfeszültség bekapcsolása után.

    Az alábbi blokkdiagram egy függvénygenerátor logikai felépítését mutatja:

    Mint látható, a készülék több tápfeszültséget igényel: +5V, -12V, +12V. A +12V és -12V feszültségek a jelamplitúdó és az eltolás szabályozására szolgálnak. A tápegységet transzformátorral és több feszültségstabilizátor chippel tervezték:

    A tápegység külön táblára van szerelve:

    Ha nem szeretné saját maga összeszerelni a tápegységet, használhat egy normál ATX tápegységet számítógépről, ahol már minden szükséges feszültség megvan. ATX csatlakozó elrendezés.

    LCD képernyő

    Minden műveletet az LCD képernyőn jelenít meg. A generátort öt kulcs vezérli

    A fel/le gombokkal a menüben mozoghatunk, a bal/jobb gombokkal pedig a frekvenciaértéket lehet változtatni. A középső gomb megnyomásakor megkezdődik a kiválasztott jel generálása. A gomb ismételt megnyomása leállítja a generátort.

    Külön érték áll rendelkezésre a frekvenciaváltási lépés beállításához. Ez kényelmes, ha széles tartományban kell frekvenciát változtatni.

    A zajgenerátornak nincs semmilyen beállítása. A szokásos rand() függvényt használja, amely folyamatosan a DDS generátor kimenetére kerül.

    A HS nagysebességű kimenet 4 frekvenciamóddal rendelkezik: 1, 2, 4 és 8 MHz.

    Sematikus ábrája

    A funkciógenerátor áramkör egyszerű és könnyen hozzáférhető elemeket tartalmaz:
    - AVR Atmega16 mikrokontroller, külső kvarccal 16 MHz-en;
    - szabványos HD44780 típusú LCD képernyő 2×16;
    - R2R DAC mátrix közönséges ellenállásokból;
    - LM358N műveleti erősítő (a KR1040UD1 hazai analógja);
    - két potenciométer;
    - öt kulcs;
    - több csatlakozó.

    Fizetés:

    A funkcionális generátor műanyag dobozba van összeszerelve:


    Szoftver

    Ahogy fentebb is mondtam, a programomat a Jesper DDS generátor algoritmusra alapoztam. Hozzáadtam néhány sor összeállítási kódot a generációs leállítás megvalósításához. Az algoritmus 9 helyett 10 CPU-ciklust tartalmaz.

    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"
    "r18 hozzáadása, %0 ;1 ciklus" "\n\t"
    "adc r19, %1 ;1 ciklus" "\n\t"
    "adc %A3, %2 ;1 ciklus" "\n\t"
    "lpm ;3 ciklus" "\n\t"
    "out %4, __tmp_reg__ ;1 ciklus" "\n\t"
    "sbis %5, 2 ;1 ciklus, ha nincs kihagyás" "\n\t"
    "rjmp 1b ;2 ciklus. Összesen 10 ciklus" "\n\t"
    :
    :"r" (ad0),,"r" (ad1),,"r" (ad2),,"e" (jel),"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR) ))
    :"r18", "r19"
    );}

    A DDS jelformák táblázata az MK flash memóriájában található, melynek címe 0xXX00-tól kezdődik. Ezek a szakaszok a makefile-ben vannak meghatározva, a megfelelő memóriahelyeken:
    #Határozza meg azokat a szakaszokat, ahol a jeltáblázatokat tárolja
    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