Atmel mikrokontrolleridagi dds generatorining sxematik diagrammasi. PLCda funktsional dds generatori. Yig'ishdan keyin generatorning ish rejimlarini sinovdan o'tkazish

Atmel mikrokontrolleridagi dds generatorining sxematik diagrammasi.  PLCda funktsional dds generatori.  Yig'ishdan keyin generatorning ish rejimlarini sinovdan o'tkazish
Atmel mikrokontrolleridagi dds generatorining sxematik diagrammasi. PLCda funktsional dds generatori. Yig'ishdan keyin generatorning ish rejimlarini sinovdan o'tkazish

Maksimal chastota - 65534 Gts (va kvadrat to'lqinli 8 MGts gacha HS chiqishi). Va keyin men generatorni FPGA o'zini eng yaxshi tarzda ko'rsatishi mumkin bo'lgan ajoyib vazifa deb o'yladim. Sport masalasiga kelsak, men FPGA-da loyihani takrorlashga qaror qildim, shu bilan birga ikki hafta oxiri ichida belgilangan muddatlarni bajarib, parametrlarni aniq belgilanmagan, lekin maksimal mumkin. Bundan nima chiqqanini kesish ostida bilib olishingiz mumkin.

Nolinchi kun

Dam olish kunlari kelishidan oldin, men amalga oshirish haqida o'ylash uchun biroz vaqtim bor edi. Vazifamni soddalashtirish uchun men generatorni tugmalar va LCD displeyli alohida qurilma sifatida emas, balki USB orqali kompyuterga ulanadigan qurilma sifatida qilishga qaror qildim. Buning uchun menda USB2RS232 plata bor. Kengash haydovchilarni (CDC) talab qilmaydi, shuning uchun u Linux ostida ishlaydi deb o'ylayman (ba'zilar uchun bu muhim). Bundan tashqari, men allaqachon RS232 orqali xabarlarni qabul qilish bilan ishlaganimni yashirmayman. Men opencores.com saytidan RS232 bilan ishlash uchun tayyor modullarni olaman.

Sinus to'lqin signalini yaratish uchun sizga DAC kerak bo'ladi. Asl loyihada bo'lgani kabi DAC turini tanladim - R2R 8-bit. Bu sizga yuqori chastotalarda, megaherts tartibida ishlash imkonini beradi. Ishonchim komilki, FPGA buni engishi kerak

Men COM porti orqali ma'lumotlarni uzatish uchun dasturni qanday yozish haqida o'ylardim. Bir tomondan, siz Delphi7 da yozishingiz mumkin, sizda bunday dasturni yozish tajribangiz bor va bundan tashqari, bajariladigan fayl hajmi katta bo'lmaydi. Men HTML-sahifada java skripti ko'rinishida Serial bilan ishlash uchun biror narsani chizishga harakat qildim, lekin u ko'proq yoki kamroq faqat Chrome serial API orqali ishladi, lekin buning uchun plaginni o'rnatishingiz kerak ... umuman , bu ham gap emas. Men PyQt5-ni o'zim uchun yangilik sifatida sinab ko'rdim, lekin bunday loyihani tarqatishda siz bir nechta kutubxonalarni sudrab olishingiz kerak. PyQt loyihasini exe fayliga kompilyatsiya qilishga urinib ko'rganimizdan so'ng, u 10 MB dan ortiq bo'lib chiqdi. Ya'ni, u C++\Qt5 da yozilgan dasturdan yaxshiroq bo'lmaydi. Shuni ham hisobga olish kerakki, menda python-da rivojlanish bo'yicha tajribam yo'q, lekin Qt5da tajribam bor. Shuning uchun tanlov Qt5 ga tushdi. Beshinchi versiyadan boshlab serial bilan ishlash moduli paydo bo'ldi va men u bilan allaqachon ishlaganman. Qt5-ga asoslangan dasturni Linux va Mac-ga o'tkazish mumkin (ba'zilar uchun bu muhim) va 5.2 versiyasidan QWidgetlarga asoslangan ilovalar hatto smartfonga ham o'tkazilishi mumkin!

Yana nima kerak? Tabiiyki, platada FPGA mavjud. Menda ulardan ikkitasi bor (10 ming hujayra uchun Cyclone iv EP4CE10E22C8N va 5 ming hujayra uchun Cyclone ii EP2C5). Men faqat qulayroq ulagich tufayli chap tomonni tanlayman. Hajmi bo'yicha loyiha katta bo'lishni maqsad qilgan emas, shuning uchun u ikkalasiga ham mos keladi. Ular ishlash tezligida farq qilmaydi. Ikkala platada ham bortda 50 MGts chastotali osilatorlar mavjud va FPGA ichida PLL mavjud, uning yordamida chastotani rejalashtirilgan 200 MGts ga oshirishim mumkin.

Birinchi kun

Sintezator loyihamda allaqachon DDS modulini yasaganim sababli, men darhol lehim temirini oldim va DACni rezistorlar bilan lehimlashni boshladim. Men prototip taxtasini oldim. O'rnatish o'rash yordamida amalga oshirildi. Texnologiyaga ta'sir qilgan yagona o'zgarish shundaki, men TT indikatorli oqim jeli foydasiga stendlarni qalaylash uchun F38N kislotasidan voz kechdim. Texnologiyaning mohiyati oddiy: men tokchalarni bosilgan elektron plataga lehimlayman va ulardagi rezistorlarni bosilgan elektron plata tomonidan lehimlayman. Men etishmayotgan ulanishlarni burish orqali qilaman. Bundan tashqari, tokchalar qulay, chunki men ularni to'g'ridan-to'g'ri FPGA platasiga kiritishim mumkin.

Afsuski, uyda 1 va 2 kilo-ohm rezistorlar mavjud emas edi. Do'konga borishga vaqt yo'q edi. Men qoidalarimdan biridan voz kechishim va eski keraksiz taxtadan rezistorlarni olib tashlashim kerak edi. U erda 15K va 30K rezistorlar ishlatilgan. Natijada bu Frankenshteyn:


Loyihani yaratgandan so'ng, siz maqsadli qurilmani o'rnatishingiz kerak: Menyu Assigments -> Device


Loyihada men boshqarilmaydigan asosiy DDS modulini belgilangan chastotaga kodladim.

1000 Hz generator moduli

modul signal_generator (clk50M, signal_out); kirish simi clk50M; sim chiqishi signal_out; tel clk200M; osc osc_200M reg akkumulyatori; signal_out = akkumulyatorni belgilash; //1000 Gts ni yaratishga harakat qiling //50 000 000 Gts - tashqi generatorning takt chastotasi //2^32 = 4,294,967,296 - DDS bit chuqurligi - 32 bit //1000Hz / 50,000,000 Hz / 29 66 ga bo'linadi / har doim 2 66 @ 729 = 429 (posedge clk50M) akkumulyatorni ishga tushiring<= accumulator + 32"d42949; end endmodule


Shundan so'ng, men "Kompilyatsiyani boshlash" tugmasini bosdim, shunda ishlab chiqish muhiti loyihaning asosiy modulida qanday kirish/chiqish liniyalari borligini va ular qanday jismoniy PIN-kodlarga ulanganligini so'raydi FPGA chipining haqiqiy PIN-kodlariga ko'rinadigan qatorlarni belgilang:

Menyu elementi Assigments -> Pin Planner

Iltimos, hozircha HS_OUT, key0 va key1 qatorlariga e'tibor bermang, ular loyihada keyinroq paydo bo'ladi, lekin boshida skrinshot olishga vaqtim yo'q edi.

Aslida, "Joylashuv" ustunida faqat PIN_nn-ni "ro'yxatdan o'tkazish" kifoya qiladi va qolgan parametrlar (I/U standarti, Current Strench va Slew Rate) sukut bo'yicha qoldirilishi mumkin yoki siz tomonidan taklif qilinganlarni tanlashingiz mumkin. hech qanday ogohlantirish bo'lmasligi uchun standart (standart) "ov.

Qaysi PIN-kod platadagi ulagich raqamiga mos kelishini qanday aniqlash mumkin?

Ulagichning pin raqamlari taxtada belgilangan


Va ulagichning kontaktlari ulangan FPGA pinlari FPGA platasi bilan birga kelgan hujjatlarda tasvirlangan.




Pinlar tayinlangandan so'ng, men loyihani qayta kompilyatsiya qilaman va uni USB dasturchisi yordamida o'chirib qo'yaman. Agar sizda USB Byte blaster dasturchisi uchun drayverlar o'rnatilmagan bo'lsa, Windows-ga ular Quartus o'rnatilgan papkada joylashganligini ayting. Keyin uni o'zi topadi.

Dasturchi JTAG ulagichiga ulangan bo'lishi kerak. Dasturlash uchun menyu elementi "Asboblar -> Dasturchi" (yoki asboblar panelidagi belgini bosing). "Ishga tushirish" tugmasi, quvonchli "Muvaffaqiyat" va proshivka allaqachon FPGA ichida va allaqachon ishlamoqda. Faqat FPGA-ni o'chirmang, aks holda u hamma narsani unutadi.

Asboblar -> Dasturchi


DAC FPGA plata ulagichiga ulangan. Men S1-112A osiloskopini DAC chiqishiga ulayman. Natijada "arra" bo'lishi kerak, chunki fazali akkumulyatorning DDS so'zining yuqori qismi 8 bitli chiqishga chiqariladi. Va u har doim to'lib toshib ketguncha ortadi.

Taxminan 1,5 soat va 1000 Gts chastotada men quyidagi oscillogrammani ko'raman:

Shuni ta'kidlashni istardimki, "arra" o'rtada kichik singan. Buning sababi rezistorlarning bir qator qiymatlarga ega bo'lishidir.

Aniqlanishi kerak bo'lgan yana bir muhim nuqta - bu DDS generatorining maksimal mumkin bo'lgan chastotasi. To'g'ri sozlangan TimeQuest parametrlari bilan "Tuzlama hisoboti" da kompilyatsiya qilingandan so'ng, kontaktlarning zanglashiga olib keladigan tezligi 200 MGts dan yuqori ekanligini ko'rishingiz mumkin. Bu shuni anglatadiki, men PLL yordamida 50 MGts generator chastotasini 4 ga ko'paytiraman, men 200 MGts chastotali DDS fazali akkumulyatorning qiymatini oshiraman. Bizning sharoitimizda olinishi mumkin bo'lgan oxirgi chastota diapazoni 0 - 100 MGts. Chastotani sozlash aniqligi:

200 000 000 Gts (clk) / 2^32 (DDS) = 0,047 Gts
Ya'ni, ~0,05 Gts dan yaxshiroqdir. Men bunday ish chastotalari diapazoni (0 ... 100 MGts) bo'lgan generator uchun hertsning bir qismining aniqligini etarli deb hisoblayman. Agar kimdir aniqlikni oshirishi kerak bo'lsa, buning uchun siz DDS bit chuqurligini oshirishingiz mumkin (TimeQuest Timing Analyzer-da mantiqiy kontaktlarning zanglashiga olib kirish tezligi CLK = 200 MGts oralig'ida ekanligini tekshirishni unutmang, chunki bu to'ldiruvchi), yoki oddiygina soat chastotasini kamaytiring, agar bunday keng chastota diapazoni talab qilinmasa.

TimeQuest vaqt tahlilchisi


Ekranda "ko'rdim" ni ko'rganimdan so'ng, oilaviy muammolar meni mamlakatga borishga majbur qildi (bu mening dam olish kunim edi). U erda men o'rgandim, pishirdim, mangal pishirdim va kechqurun meni kutayotgan syurpriz haqida hech qanday tasavvurga ega emasdim. Kechga yaqinroq, yotishdan oldin, men boshqa chastotalar uchun signal shakliga qarashga qaror qildim.

100 kHz chastota uchun

250 kHz chastota uchun

500 kHz chastota uchun

1 MGts chastota uchun

Ikkinchi kun

DAC 100 va 200 Ohm rezistorlarda qanday ishlashi qiziq bo'lganligi sababli, men darhol lehim temirini oldim. Bu safar DAC aniqroq bo'lib chiqdi va uni o'rnatish uchun kamroq vaqt kerak bo'ldi.

Biz DACni FPGA platasiga joylashtiramiz va uni osiloskopga ulaymiz

1 MGts tekshirilmoqda - VO! Bu butunlay boshqa masala!

10 MGts ni ko'rdim

25 MGts ni ko'rgan


10 MGts arra shakli hali ham to'g'ri shaklga o'xshaydi. Ammo 25 MGts chastotada u endi "chiroyli" emas. Biroq, C1-112a 10 MGts tarmoqli kengligiga ega, shuning uchun bu holda sabab allaqachon osiloskopda bo'lishi mumkin.

Asosan, DAC bilan bu masalani yopiq deb hisoblash mumkin. Endi yuqori tezlikdagi chiqishning to'lqin shakllarini olaylik. Buning uchun biz FPGA ning alohida PIN-kodiga eng muhim bitni chiqaramiz. Biz ushbu qator uchun ma'lumotlarni DDS akkumulyatorining eng muhim bitidan olamiz.

hs_out = akkumulyatorni belgilang;

Kvadrat to'lqin 1 MGts

Kvadrat to'lqin 5 MGts

Kvadrat to'lqin 25 MGts

50 MGts kvadrat to'lqin hozir deyarli ko'rinmas


Lekin menimcha, FPGA chiqishi qarshilik bilan yuklanishi kerak. Ehtimol, jabhalar tikroq bo'lar edi.

Sinus jadvalga muvofiq amalga oshiriladi. Jadval hajmi 8 bitning 256 qiymatidan iborat. Ko'proq olish mumkin edi, lekin menda allaqachon tayyor mif fayli bor edi. Sehrgardan foydalanib, mif faylidan sinus jadval ma'lumotlari bilan ROM elementini yaratamiz.

ROM yaratish - Asboblar -> Mega Wizard Plugin menejeri


1 port ROMni tanlang va modulga nom bering

Biz rozimiz

Bu erda ham rozimiz

Browse-dan foydalanib, biz sinus jadvali bilan mif faylimizni topamiz

Biz bu erda ham hech narsani o'zgartirmaymiz.

Sine_rom_bb.v modulidan belgini olib tashlang - bu kerak emas. Keyingi tugatish. Quartus loyihaga modul qo'shishni so'raydi - biz rozimiz. Shundan so'ng, modul Verilog'dagi boshqa har qanday modul kabi ishlatilishi mumkin.


DDS akkumulyator so'zining yuqori 8 biti ROM manzili sifatida ishlatiladi va ma'lumotlar chiqishi sinus qiymati bo'ladi.

Kod

//sine rom sim sine_out; sine_rom sine1(.clock(clk200M), .manzil(akkumulyator), .q(sine_out));


Turli chastotalardagi sinus to'lqinining oscillogrammasi ... bir xil ko'rinadi.

Agar xohlasangiz, rezistor tarqalishi bilan bog'liq DAC muammolarini ko'rib chiqishingiz mumkin:

Xo'sh, dam olish kunlarining oxiri. Ammo kompyuterdan boshqarish uchun dasturiy ta'minot hali yozilmagan. Men rejalashtirilgan muddatlarni bajarmaganimni tan olishga majburman.

Uchinchi kun

Vaqt juda oz, shuning uchun dasturni shoshqaloqlik bilan yozamiz (eng yaxshi an'analarda). Ba'zi joylarda harflar sonini kamaytirish va klaviaturadan ma'lumotlarni kiritish qulayligi uchun vidjet nomi bilan hodisa filtri qo'llaniladi. Iltimos, tushuning va kechiring.

Interfeys

Analoglar bilan havolalar

To'liq ro'yxat emas
Funktsional DDS generatori. AVR asosida yaratilgan. Chastotalar 0... 65534 Hz.
GK101 DDS generatorini ko'rib chiqish. Altera MAX240 FPGA yordamida yaratilgan. 10 MGts gacha bo'lgan chastotalar.
PIC16F870 da ko'p funksiyali generator. Chastota diapazoni: 11 Hz - 60 kHz.
generatorlar Teglar qo'shish

Maksimal chastota - 65534 Gts (va kvadrat to'lqinli 8 MGts gacha HS chiqishi). Va keyin men generatorni FPGA o'zini eng yaxshi tarzda ko'rsatishi mumkin bo'lgan ajoyib vazifa deb o'yladim. Sport masalasiga kelsak, men FPGA-da loyihani takrorlashga qaror qildim, shu bilan birga ikki hafta oxiri ichida belgilangan muddatlarni bajarib, parametrlarni aniq belgilanmagan, lekin maksimal mumkin. Bundan nima chiqqanini kesish ostida bilib olishingiz mumkin.

Nolinchi kun

Dam olish kunlari kelishidan oldin, men amalga oshirish haqida o'ylash uchun biroz vaqtim bor edi. Vazifamni soddalashtirish uchun men generatorni tugmalar va LCD displeyli alohida qurilma sifatida emas, balki USB orqali kompyuterga ulanadigan qurilma sifatida qilishga qaror qildim. Buning uchun menda USB2RS232 plata bor. Kengash haydovchilarni (CDC) talab qilmaydi, shuning uchun u Linux ostida ishlaydi deb o'ylayman (ba'zilar uchun bu muhim). Bundan tashqari, men allaqachon RS232 orqali xabarlarni qabul qilish bilan ishlaganimni yashirmayman. Men opencores.com saytidan RS232 bilan ishlash uchun tayyor modullarni olaman.

Sinus to'lqin signalini yaratish uchun sizga DAC kerak bo'ladi. Asl loyihada bo'lgani kabi DAC turini tanladim - R2R 8-bit. Bu sizga yuqori chastotalarda, megaherts tartibida ishlash imkonini beradi. Ishonchim komilki, FPGA buni engishi kerak

Men COM porti orqali ma'lumotlarni uzatish uchun dasturni qanday yozish haqida o'ylardim. Bir tomondan, siz Delphi7 da yozishingiz mumkin, sizda bunday dasturni yozish tajribangiz bor va bundan tashqari, bajariladigan fayl hajmi katta bo'lmaydi. Men HTML-sahifada java skripti ko'rinishida Serial bilan ishlash uchun biror narsani chizishga harakat qildim, lekin u ko'proq yoki kamroq faqat Chrome serial API orqali ishladi, lekin buning uchun plaginni o'rnatishingiz kerak ... umuman , bu ham gap emas. Men PyQt5-ni o'zim uchun yangilik sifatida sinab ko'rdim, lekin bunday loyihani tarqatishda siz bir nechta kutubxonalarni sudrab olishingiz kerak. PyQt loyihasini exe fayliga kompilyatsiya qilishga urinib ko'rganimizdan so'ng, u 10 MB dan ortiq bo'lib chiqdi. Ya'ni, u C++\Qt5 da yozilgan dasturdan yaxshiroq bo'lmaydi. Shuni ham hisobga olish kerakki, menda python-da rivojlanish bo'yicha tajribam yo'q, lekin Qt5da tajribam bor. Shuning uchun tanlov Qt5 ga tushdi. Beshinchi versiyadan boshlab serial bilan ishlash moduli paydo bo'ldi va men u bilan allaqachon ishlaganman. Qt5-ga asoslangan dasturni Linux va Mac-ga o'tkazish mumkin (ba'zilar uchun bu muhim) va 5.2 versiyasidan QWidgetlarga asoslangan ilovalar hatto smartfonga ham o'tkazilishi mumkin!

Yana nima kerak? Tabiiyki, platada FPGA mavjud. Menda ulardan ikkitasi bor (10 ming hujayra uchun Cyclone iv EP4CE10E22C8N va 5 ming hujayra uchun Cyclone ii EP2C5). Men faqat qulayroq ulagich tufayli chap tomonni tanlayman. Hajmi bo'yicha loyiha katta bo'lishni maqsad qilgan emas, shuning uchun u ikkalasiga ham mos keladi. Ular ishlash tezligida farq qilmaydi. Ikkala platada ham bortda 50 MGts chastotali osilatorlar mavjud va FPGA ichida PLL mavjud, uning yordamida chastotani rejalashtirilgan 200 MGts ga oshirishim mumkin.

Birinchi kun

Sintezator loyihamda allaqachon DDS modulini yasaganim sababli, men darhol lehim temirini oldim va DACni rezistorlar bilan lehimlashni boshladim. Men prototip taxtasini oldim. O'rnatish yordamida amalga oshirildi. Texnologiyaga ta'sir qilgan yagona o'zgarish shundaki, men TT indikatorli oqim jeli foydasiga stendlarni qalaylash uchun F38N kislotasidan voz kechdim. Texnologiyaning mohiyati oddiy: men tokchalarni bosilgan elektron plataga lehimlayman va ulardagi rezistorlarni bosilgan elektron plata tomonidan lehimlayman. Men etishmayotgan ulanishlarni burish orqali qilaman. Bundan tashqari, tokchalar qulay, chunki men ularni to'g'ridan-to'g'ri FPGA platasiga kiritishim mumkin.

Afsuski, uyda 1 va 2 kilo-ohm rezistorlar mavjud emas edi. Do'konga borishga vaqt yo'q edi. Men qoidalarimdan biridan voz kechishim va eski keraksiz taxtadan rezistorlarni olib tashlashim kerak edi. U erda 15K va 30K rezistorlar ishlatilgan. Natijada bu Frankenshteyn:


Loyihani yaratgandan so'ng, siz maqsadli qurilmani o'rnatishingiz kerak: Menyu Assigments -> Device


Loyihada men boshqarilmaydigan asosiy DDS modulini belgilangan chastotaga kodladim.

1000 Hz generator moduli

modul signal_generator (clk50M, signal_out); kirish simi clk50M; sim chiqishi signal_out; tel clk200M; osc osc_200M reg akkumulyatori; signal_out = akkumulyatorni belgilash; //1000 Gts ni yaratishga harakat qiling //50 000 000 Gts - tashqi generatorning takt chastotasi //2^32 = 4,294,967,296 - DDS bit chuqurligi - 32 bit //1000Hz / 50,000,000 Hz / 29 66 ga bo'linadi / har doim 2 66 @ 729 = 429 (posedge clk50M) akkumulyatorni ishga tushiring<= accumulator + 32"d42949; end endmodule


Shundan so'ng, men "Kompilyatsiyani boshlash" tugmasini bosdim, shunda ishlab chiqish muhiti loyihaning asosiy modulida qanday kirish/chiqish liniyalari borligini va ular qanday jismoniy PIN-kodlarga ulanganligini so'raydi FPGA chipining haqiqiy PIN-kodlariga ko'rinadigan qatorlarni belgilang:

Menyu elementi Assigments -> Pin Planner

Iltimos, hozircha HS_OUT, key0 va key1 qatorlariga e'tibor bermang, ular loyihada keyinroq paydo bo'ladi, lekin boshida skrinshot olishga vaqtim yo'q edi.

Aslida, "Joylashuv" ustunida faqat PIN_nn-ni "ro'yxatdan o'tkazish" kifoya qiladi va qolgan parametrlar (I/U standarti, Current Strench va Slew Rate) sukut bo'yicha qoldirilishi mumkin yoki siz tomonidan taklif qilinganlarni tanlashingiz mumkin. hech qanday ogohlantirish bo'lmasligi uchun standart (standart) "ov.

Qaysi PIN-kod platadagi ulagich raqamiga mos kelishini qanday aniqlash mumkin?

Ulagichning pin raqamlari taxtada belgilangan


Va ulagichning kontaktlari ulangan FPGA pinlari FPGA platasi bilan birga kelgan hujjatlarda tasvirlangan.




Pinlar tayinlangandan so'ng, men loyihani qayta kompilyatsiya qilaman va uni USB dasturchisi yordamida o'chirib qo'yaman. Agar sizda USB Byte blaster dasturchisi uchun drayverlar o'rnatilmagan bo'lsa, Windows-ga ular Quartus o'rnatilgan papkada joylashganligini ayting. Keyin uni o'zi topadi.

Dasturchi JTAG ulagichiga ulangan bo'lishi kerak. Dasturlash uchun menyu elementi "Asboblar -> Dasturchi" (yoki asboblar panelidagi belgini bosing). "Ishga tushirish" tugmasi, quvonchli "Muvaffaqiyat" va proshivka allaqachon FPGA ichida va allaqachon ishlamoqda. Faqat FPGA-ni o'chirmang, aks holda u hamma narsani unutadi.

Asboblar -> Dasturchi


DAC FPGA plata ulagichiga ulangan. Men S1-112A osiloskopini DAC chiqishiga ulayman. Natijada "arra" bo'lishi kerak, chunki fazali akkumulyatorning DDS so'zining yuqori qismi 8 bitli chiqishga chiqariladi. Va u har doim to'lib toshib ketguncha ortadi.

Taxminan 1,5 soat va 1000 Gts chastotada men quyidagi oscillogrammani ko'raman:

Shuni ta'kidlashni istardimki, "arra" o'rtada kichik singan. Buning sababi rezistorlarning bir qator qiymatlarga ega bo'lishidir.

Aniqlanishi kerak bo'lgan yana bir muhim nuqta - bu DDS generatorining maksimal mumkin bo'lgan chastotasi. To'g'ri sozlangan TimeQuest parametrlari bilan "Tuzlama hisoboti" da kompilyatsiya qilingandan so'ng, kontaktlarning zanglashiga olib keladigan tezligi 200 MGts dan yuqori ekanligini ko'rishingiz mumkin. Bu shuni anglatadiki, men PLL yordamida 50 MGts generator chastotasini 4 ga ko'paytiraman, men 200 MGts chastotali DDS fazali akkumulyatorning qiymatini oshiraman. Bizning sharoitimizda olinishi mumkin bo'lgan oxirgi chastota diapazoni 0 - 100 MGts. Chastotani sozlash aniqligi:

200 000 000 Gts (clk) / 2^32 (DDS) = 0,047 Gts
Ya'ni, ~0,05 Gts dan yaxshiroqdir. Men bunday ish chastotalari diapazoni (0 ... 100 MGts) bo'lgan generator uchun hertsning bir qismining aniqligini etarli deb hisoblayman. Agar kimdir aniqlikni oshirishi kerak bo'lsa, buning uchun siz DDS bit chuqurligini oshirishingiz mumkin (TimeQuest Timing Analyzer-da mantiqiy kontaktlarning zanglashiga olib kirish tezligi CLK = 200 MGts oralig'ida ekanligini tekshirishni unutmang, chunki bu to'ldiruvchi), yoki oddiygina soat chastotasini kamaytiring, agar bunday keng chastota diapazoni talab qilinmasa.

TimeQuest vaqt tahlilchisi


Ekranda "ko'rdim" ni ko'rganimdan so'ng, oilaviy muammolar meni mamlakatga borishga majbur qildi (bu mening dam olish kunim edi). U erda men o'rgandim, pishirdim, mangal pishirdim va kechqurun meni kutayotgan syurpriz haqida hech qanday tasavvurga ega emasdim. Kechga yaqinroq, yotishdan oldin, men boshqa chastotalar uchun signal shakliga qarashga qaror qildim.

100 kHz chastota uchun

250 kHz chastota uchun

500 kHz chastota uchun

1 MGts chastota uchun

Ikkinchi kun

DAC 100 va 200 Ohm rezistorlarda qanday ishlashi qiziq bo'lganligi sababli, men darhol lehim temirini oldim. Bu safar DAC aniqroq bo'lib chiqdi va uni o'rnatish uchun kamroq vaqt kerak bo'ldi.

Biz DACni FPGA platasiga joylashtiramiz va uni osiloskopga ulaymiz

1 MGts tekshirilmoqda - VO! Bu butunlay boshqa masala!

10 MGts ni ko'rdim

25 MGts ni ko'rgan


10 MGts arra shakli hali ham to'g'ri shaklga o'xshaydi. Ammo 25 MGts chastotada u endi "chiroyli" emas. Biroq, C1-112a 10 MGts tarmoqli kengligiga ega, shuning uchun bu holda sabab allaqachon osiloskopda bo'lishi mumkin.

Asosan, DAC bilan bu masalani yopiq deb hisoblash mumkin. Endi yuqori tezlikdagi chiqishning to'lqin shakllarini olaylik. Buning uchun biz FPGA ning alohida PIN-kodiga eng muhim bitni chiqaramiz. Biz ushbu qator uchun ma'lumotlarni DDS akkumulyatorining eng muhim bitidan olamiz.

hs_out = akkumulyatorni belgilang;

Kvadrat to'lqin 1 MGts

Kvadrat to'lqin 5 MGts

Kvadrat to'lqin 25 MGts

50 MGts kvadrat to'lqin hozir deyarli ko'rinmas


Lekin menimcha, FPGA chiqishi qarshilik bilan yuklanishi kerak. Ehtimol, jabhalar tikroq bo'lar edi.

Sinus jadvalga muvofiq amalga oshiriladi. Jadval hajmi 8 bitning 256 qiymatidan iborat. Ko'proq olish mumkin edi, lekin menda allaqachon tayyor mif fayli bor edi. Sehrgardan foydalanib, mif faylidan sinus jadval ma'lumotlari bilan ROM elementini yaratamiz.

ROM yaratish - Asboblar -> Mega Wizard Plugin menejeri


1 port ROMni tanlang va modulga nom bering

Biz rozimiz

Bu erda ham rozimiz

Browse-dan foydalanib, biz sinus jadvali bilan mif faylimizni topamiz

Biz bu erda ham hech narsani o'zgartirmaymiz.

Sine_rom_bb.v modulidan belgini olib tashlang - bu kerak emas. Keyingi tugatish. Quartus loyihaga modul qo'shishni so'raydi - biz rozimiz. Shundan so'ng, modul Verilog'dagi boshqa har qanday modul kabi ishlatilishi mumkin.


DDS akkumulyator so'zining yuqori 8 biti ROM manzili sifatida ishlatiladi va ma'lumotlar chiqishi sinus qiymati bo'ladi.

Kod

//sine rom sim sine_out; sine_rom sine1(.clock(clk200M), .manzil(akkumulyator), .q(sine_out));


Turli chastotalardagi sinus to'lqinining oscillogrammasi ... bir xil ko'rinadi.

Agar xohlasangiz, rezistor tarqalishi bilan bog'liq DAC muammolarini ko'rib chiqishingiz mumkin:

Xo'sh, dam olish kunlarining oxiri. Ammo kompyuterdan boshqarish uchun dasturiy ta'minot hali yozilmagan. Men rejalashtirilgan muddatlarni bajarmaganimni tan olishga majburman.

Uchinchi kun

Vaqt juda oz, shuning uchun dasturni shoshqaloqlik bilan yozamiz (eng yaxshi an'analarda). Ba'zi joylarda harflar sonini kamaytirish va klaviaturadan ma'lumotlarni kiritish qulayligi uchun vidjet nomi bilan hodisa filtri qo'llaniladi. Iltimos, tushuning va kechiring.

Interfeys

Analoglar bilan havolalar

To'liq ro'yxat emas
Funktsional DDS generatori. AVR asosida yaratilgan. Chastotalar 0... 65534 Hz.
GK101 DDS generatorini ko'rib chiqish. Altera MAX240 FPGA yordamida yaratilgan. 10 MGts gacha bo'lgan chastotalar.
PIC16F870 da ko'p funksiyali generator. Chastota diapazoni: 11 Hz - 60 kHz.
generatorlar
  • Qt5
  • Teglar qo'shing

    Har qanday uy ustaxonasida kerakli asboblar va o'lchash asboblari to'plami bo'lishi kerak. Xobbi sifatida havaskor radio bilan shug'ullanadigan odamlar uchun zarur jihozlarni sotib olishning yuqori pul xarajatlari ko'pincha qabul qilinishi mumkin emas.

    Shunday qilib, mening vaziyatimda ushbu uskunaning ro'yxati to'liq emas va etishmayotgan edi signal generatori.

    Signal generatori Mavjud radio elementlardan o'zingizni yasash oson va oxir-oqibat qimmat emas edi. Shunday qilib, Internetda aylanib yurganimdan so'ng, men turli xil generatorlar uchun juda ko'p sxemalarni topdim, shu jumladan DAC bilan yanada ilg'or modellar, lekin ishlab chiqarish allaqachon qimmat. Boshlash uchun men oddiygina to'xtadim DDS signal generatori Atmel'dan ATMEGA8 mikrokontrollerida. Bu, men hech narsani yaxshilamadim yoki o'zgartirmadim - men hamma narsani avvalgidek qoldirdim, shunchaki nusxasini yaratdim va bundan tashqari, men ushbu qurilmaning muallifligini da'vo qilmayman.

    Shunday qilib, signal generatori yaxshi xususiyatlarga ega va oddiy muammolarni hal qilish uchun mos keladi.

    Ma'lumotni ko'rsatish signal generatori HD44780 kontrollerli 16x2 belgili LCD displeyda ishlab chiqarilgan. Shunisi e'tiborga loyiqki, mikrokontroller portlarini saqlash uchun LCD displey faqat uchta sim orqali boshqariladi, bunga shift registridan foydalanish orqali erishildi - displeyni uchta sim orqali qanday ulash haqida o'qing.

    Portlarni saqlash kerak, rezistiv DAC uchun 8 port, tugmalar uchun 7 port ishlatiladi. Asl maqolada muallif PWM modulyatsiyasidan foydalanishga va'da bergan, ammo ATMEGA16-da yanada ilg'or versiyani ishlab chiqishni boshlaganligi sababli uni tugatmaganga o'xshaydi.

    DDS signal generatorining sxematik diagrammasi va bosilgan elektron plata.

    O'chirish va platalar asl nusxada ko'rsatilgan, ularda muallif tomonidan ishlatilmaydigan PWM boshqaruvi tugmalari mavjud;

    DAC uchun men ± 0,05% xatolikka ega bo'lgan aniq rezistorlarni sotib oldim, ammo ma'lum bo'lishicha, ± 5% xatosi bo'lgan oddiylar etarli. Signal shakli barcha turdagi signallar uchun juda maqbul edi.

    Qachon generator yig'ilgan va dastur mikrokontrollerga yuklangan bo'lsa, displey kontrastini sozlamaguningizcha hech qanday sozlash talab qilinmaydi.

    Qurilma bilan ishlash oddiy - signal shaklini tanlang, kerakli chastotani o'rnating va chastotani sozlash bosqichini har bir qadam uchun 1 - 10 - 100 - 1000 Gts chegaralari bilan o'zgartirishingiz mumkin. Keyin Start tugmasini bosing va generator ishlay boshlaydi. Shuni ta'kidlash kerakki, generator ishga tushirilganda signalning chastotasi va shaklini o'zgartirib bo'lmaydi, bu dastur cheksiz tsiklga o'tishi va maksimal ishlab chiqarish chastotasini oshirish uchun tugmani so'rash tartibi bilan bog'liq. olib tashlash kerak edi. Ishlab chiqarishni to'xtatish uchun to'xtatish/qayta tiklash tugmasini bosing, bu dasturni qayta ishga tushiradi va u sozlamalar menyusiga qaytadi. Mana nuance.

    Alohida-alohida, men generator uchun uy qurish haqida gapirmoqchiman. Siz do'konda tayyor sumkani sotib olishingiz yoki boshqa qurilmadan mos keladiganidan foydalanishingiz mumkin, lekin men uni butunlay o'zim qilishga qaror qildim. Ikki tomonlama shisha tolali shishaning bir qismi ishlamay qoldi, men uni tanaga sovg'a qildim.

    Birinchidan, siz barcha o'lchovlarni, LCD displey va signal generator platasining o'lchamlarini, quvvat manbai, ulagichlar va tugmalarni olishingiz kerak, keyin uni qog'oz varag'iga joylashtiring, chunki u ishning ichida bo'ladi. Olingan o'lchamlarga asoslanib, siz ishlab chiqarishni boshlashingiz mumkin.

    Ushbu loyiha yuqori sifatli va universal funktsiyali generator bo'lib, u sxemaning biroz murakkabligiga qaramay, hech bo'lmaganda oddiyroqlarga nisbatan juda keng funksionallikka ega, bu uni yig'ish narxini oqlaydi. U 9 ​​xil to'lqin shakllarini ishlab chiqarishga qodir va impuls sinxronizatsiyasi bilan ham ishlaydi.

    MK dagi generatorning sxematik diagrammasi

    Qurilma sozlamalari

    • Chastota diapazoni: 10 Hz - 60 kHz
    • Raqamli chastotani 3 xil bosqichda sozlash
    • To'lqin shakllari: sinus, uchburchak, kvadrat, arra, H-puls, L-puls, portlash, supurish, shovqin
    • Chiqish diapazoni: sinus va uchburchak uchun 15V, boshqa rejimlar uchun 0-5V
    • Impuls sinxronizatsiyasi uchun chiqish mavjud

    Qurilma 12 voltli o'zgaruvchan tokdan quvvatlanadi, bu 78L15 va 79L15 ning normal ishlashi uchun zarur bo'lgan etarli darajada yuqori (18 V dan yuqori) doimiy kuchlanishni ta'minlaydi, bu esa LF353 mikrosxemasining bipolyar 15 V zanjirini hosil qilishi uchun amalga oshiriladi 1 kOhm yukga signallarning to'liq diapazoni.

    Daraja boshqaruvchisi ALPS SRBM1L0800 dan foydalanilgan. O'chirish ± 1% bardoshlik yoki undan yuqori bo'lgan rezistorlardan foydalanishi kerak. LED oqim cheklovchilari - 4306R seriyali rezistorlar. Yorqinlikni ijrochining xohishiga qarab oshirish mumkin. Jeneratör alyuminiy old va orqa panelli 178x154x36 mm o'lchamdagi plastik qutiga yig'ilgan.

    Ko'pgina kontaktli komponentlar old va orqa panellarga o'rnatiladi (tugmalar, tugmalar, RCA ulagichlari, LED yig'ilishlari, quvvat ulagichi). Bosilgan elektron platalar korpusga plastik bo'shliqlar bilan murvat bilan biriktirilgan. Jeneratorning barcha boshqa elementlari bosilgan elektron platalarga o'rnatiladi - quvvat manbai alohida. O'rtadagi chap tugma rejimni o'zgartirish uchun, o'ngdagi - rejim chastotasini tanlash.

    Jeneratör turli xil signallarni ishlab chiqaradi va uchta rejimda ishlaydi, ular "Tanlash" tugmasi yordamida tanlanadi va uchta yuqori (diagrammada) LEDlar bilan ko'rsatiladi. Aylanadigan boshqaruv signal parametrlarini quyidagi jadvalga muvofiq o'zgartiradi:

    1-rejimga o'rnatilgandan so'ng darhol sinus hosil bo'ladi. Biroq, boshlang'ich chastotasi juda past va uni oshirish uchun kodlovchining kamida bir marta bosilishi kerak. Kengashda qurilmani dasturlash uchun ulash uchun kontakt mavjud bo'lib, u kerak bo'lganda signal generatorining funksiyasini tezda o'zgartirishga imkon beradi. Barcha loyiha fayllari - PIC16F870 proshivka, taxtali chizmalar joylashgan

    Signallarning ushbu DDS funktsiyasi generatori (versiya 2.0) AVR mikrokontrollerida yig'ilgan, yaxshi funksionallikka ega, amplitudani boshqarishga ega, shuningdek, bir tomonlama bosilgan elektron platada yig'ilgan.

    Ushbu generator Jesper DDS generator algoritmiga asoslangan bo'lib, dastur AVR-GCC C uchun montaj kodlari qo'shimchalari bilan modernizatsiya qilingan. Jeneratör ikkita chiqish signaliga ega: birinchisi DDS signallari, ikkinchisi yuqori tezlikda (1..8 MGts) "to'rtburchaklar" chiqishi bo'lib, u noto'g'ri fuzzlar bilan MKni qayta tiklash va boshqa maqsadlarda ishlatilishi mumkin.
    Yuqori tezlikdagi HS (High Speed) signali to'g'ridan-to'g'ri Atmega16 OC1A (PD5) mikrokontrolleridan olinadi.
    DDS signallari boshqa MC chiqishlaridan rezistiv R2R matritsasi va LM358N chipi orqali ishlab chiqariladi, bu signal amplitudasi va ofsetini sozlash imkonini beradi. Ofset va amplituda ikki potansiyometr yordamida o'rnatiladi. Ofsetni +5V..-5V oralig'ida sozlash mumkin, amplituda esa 0...10V. DDS signallarining chastotasi 0... 65534 Gts oralig'ida sozlanishi mumkin, bu audio davrlarini va boshqa havaskor radio vazifalarini sinab ko'rish uchun etarli.

    DDS generator V2.0 ning asosiy xususiyatlari:
    - umumiy va arzon radioelementli oddiy sxema;
    - bir tomonlama bosilgan elektron plata;
    - o'rnatilgan elektr ta'minoti;
    - 8 MGts gacha bo'lgan alohida yuqori tezlikli chiqish (HS);
    - o'zgaruvchan amplitudali va ofsetli DDS signallari;
    - DDS signallari: sinus, to'rtburchak, arra va teskari arra, uchburchak, EKG signali va shovqin signali;
    - 2×16 LCD displey;
    - intuitiv 5 tugmali klaviatura;
    - chastotani sozlash bosqichlari: 1, 10, 100, 1000, 10000 Hz;
    - quvvat yoqilgandan keyin oxirgi holatni eslash.

    Quyidagi blok diagrammada funktsiya generatorining mantiqiy tuzilishi ko'rsatilgan:

    Ko'rib turganingizdek, qurilma bir nechta besleme kuchlanishini talab qiladi: +5V, -12V, +12V. Signal amplitudasi va ofsetini tartibga solish uchun +12V va -12V kuchlanish ishlatiladi. Elektr ta'minoti transformator va bir nechta kuchlanish stabilizator chiplari yordamida ishlab chiqilgan:

    Elektr ta'minoti alohida taxtada yig'iladi:

    Elektr ta'minotini o'zingiz yig'ishni istamasangiz, barcha kerakli kuchlanishlar allaqachon mavjud bo'lgan kompyuterdan muntazam ATX quvvat manbaidan foydalanishingiz mumkin. ATX ulagichining joylashuvi.

    LCD displey

    Barcha harakatlar LCD displey orqali ko'rsatiladi. Jeneratör beshta tugma bilan boshqariladi

    Yuqori/past tugmalari menyu bo'ylab harakatlanish uchun ishlatiladi, chap/o'ng tugmalar chastota qiymatini o'zgartirish uchun ishlatiladi. Markaziy tugma bosilganda tanlangan signal hosil bo'la boshlaydi. Tugmachani yana bosish generatorni to'xtatadi.

    Chastotani o'zgartirish bosqichini o'rnatish uchun alohida qiymat beriladi. Agar siz chastotani keng diapazonda o'zgartirishingiz kerak bo'lsa, bu qulay.

    Shovqin generatorida hech qanday sozlamalar yo'q. U DDS generatorining chiqishiga doimiy ravishda oziqlanadigan odatiy rand() funksiyasidan foydalanadi.

    HS yuqori tezlikda chiqishi 4 chastota rejimiga ega: 1, 2, 4 va 8 MGts.

    Sxematik diagramma

    Funktsiya generatorining sxemasi oddiy va oson kirish mumkin bo'lgan elementlarni o'z ichiga oladi:
    - AVR Atmega16 mikrokontrolleri, tashqi kvartsli 16 MGts;
    - standart HD44780 tipidagi LCD displey 2×16;
    - oddiy rezistorlardan tayyorlangan R2R DAC matritsasi;
    - operatsion kuchaytirgich LM358N (KR1040UD1 ning mahalliy analogi);
    - ikkita potansiyometr;
    - beshta kalit;
    - bir nechta ulagichlar.

    To'lash:

    Funktsional generator plastik qutiga yig'iladi:


    Dasturiy ta'minot

    Yuqorida aytganimdek, men dasturimni Jesper DDS generator algoritmiga asosladim. Men avlodni to'xtatishni amalga oshirish uchun bir necha qator montaj kodini qo'shdim. Endi algoritm 9 o'rniga 10 ta protsessor tsiklini o'z ichiga oladi.

    bekor statik 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 qo'shing, %0 ;1 sikl" "\n\t"
    "adc r19, %1 ;1 sikl" "\n\t"
    "adc %A3, %2 ;1 sikl" "\n\t"
    "lpm ;3 sikl" "\n\t"
    "out %4, __tmp_reg__ ;1 sikl" "\n\t"
    "sbis %5, 2 ; o'tkazib yuborilmasa, 1 tsikl" "\n\t"
    "rjmp 1b ;2 sikl. Jami 10 tsikl" "\n\t"
    :
    :"r" (ad0),,"r" (ad1),,"r" (ad2),,"e" (signal),,"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR) ))
    :"r18", "r19"
    );}

    DDS signal shakllari jadvali MK ning flesh-xotirasida joylashgan bo'lib, uning manzili 0xXX00 dan boshlanadi. Ushbu bo'limlar makefile faylida, tegishli xotira joylarida aniqlanadi:
    #Signal jadvallarini saqlash uchun bo'limlarni belgilang
    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