Mundarija:
- 1 -qadam: Ma'lumotlar majmuasini yarating
- 2 -qadam: Parallel chiqishni yoqish
- 3 -qadam: uzilishni yoqish
- 4 -qadam: R/2R DAC
- 5 -qadam: To'liq kod
Video: Arduino tufayli 3 fazali sinus to'lqin generatori: 5 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:25
bu ulushning maqsadi, Due-ning yuqori ishlashi + ma'lumotnomaning etishmasligi + foydali bo'lmagan ma'lumotlar jadvalidan foydalanmoqchi bo'lgan kishiga yordam berishdir.
Ushbu loyiha past chastotali (<1kHz) 3 fazali sinus to'lqinli 256 ta namunani / tsiklni va yuqori chastotali (20 kHzgacha) 16 ta namunani / tsiklni ishlab chiqarishi mumkin, bu oddiy LPF va chiqish deyarli mukammal.
biriktirilgan fayl mening oxirgi versiyam emas edi, chunki men ba'zi qo'shimcha funktsiyalarni qo'shdim, lekin yadro bunga o'xshaydi. E'tibor bering, namunalar/tsikl yuqoridagi bayonotdan pastroq.
protsessor imkoniyatlari biriktirilgan faylda ko'rsatilgan yondashuv yordamida maksimal darajada oshirilganligi sababli, men Arduino Due -ning chastota qiymatini uzatish uchun Arduino Due tashqi uzilishidan foydalanadigan boshqaruv bloki sifatida Arduino Uno -dan foydalandim. Chastotani nazorat qilishdan tashqari, Arduino Uno amplitudani ham boshqaradi (raqamli potentsial o'lchagich + OpAmp orqali), shuningdek I/U --- o'ynash uchun juda ko'p joy bo'ladi.
1 -qadam: Ma'lumotlar majmuasini yarating
Haqiqiy vaqtda hisoblash protsessorni talab qilganligi sababli, yaxshi ishlash uchun sinusli ma'lumotlar majmuasi talab qilinadi
uint32_t sin768 PROGMEM =….xozir x = [0: 5375]; y = 127+127*(gunoh (2*pi/5376/*yoki siz xohlagan # # talabga bog'liq)/))
2 -qadam: Parallel chiqishni yoqish
Uno -dan farqli o'laroq, Due ma'lumotnomasi cheklangan. Biroq, Arduino Uno -ga asoslangan 3 fazali sinus to'lqinni yaratish uchun, birinchi navbatda, MCLK pastligi tufayli (16 MGts, chunki 84 MGts) ishlash maqtana olmaydi, 2 -chi, cheklangan GPIO maksimal 2 fazali chiqishi mumkin va sizga qo'shimcha 3-fazani ishlab chiqarish uchun analog sxema (C = -AB).
GPIO -ni yoqish asosan SAM3X ma'lumot -jadvaliga asoslangan emas
PIOC-> PIO_PER = 0xFFFFFFFE; // PIO boshqaruvchisi PIO Energiya registrini yoqish (ATMEL SAM3X ma'lumotlar jadvalining p656-ga qarang) va https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due pin 33-41 va 44-51 yoqilgan.
PIOC-> PIO_OER = 0xFFFFFFFE; // PIO tekshirgichining chiqishini yoqish registri, ATMEL SAM3X ma'lumotlar jadvalining p657-ga qarang PIOC-> PIO_OSR = 0xFFFFFFFE; // PIO tekshirgichining chiqish holati reestri, ATMEL SAM3X ma'lumotlar jadvalining p658 -ga qarang
PIOC-> PIO_OWER = 0xFFFFFFFE; // PIO chiqishi yozishni yoqish reestri, ATMEL SAM3X ma'lumotlar jadvalining p670 ga qarang
// PIOA-> PIO_PDR = 0x30000000; // sug'urta sifatida ixtiyoriy, ishlashga ta'sir qilmaydi, raqamli pin 10 ham PC29, ham PA28 ga ulanadi, raqamli pin 4 PC29 va PA28 ga ulanadi, bu erda PIOA #28 va 29 ni o'chirib qo'yish uchun.
3 -qadam: uzilishni yoqish
Uning ishlashini maksimal darajada oshirish uchun CPU yuki imkon qadar past bo'lishi kerak. Ammo CPU pin va Due pin o'rtasidagi 1to1 bo'lmagan yozishmalar tufayli bit operatsiyasi zarur.
Siz algoritmni yanada optimallashtirishingiz mumkin, lekin xona juda cheklangan.
bekor TC7_Handler (bekor) {TC_GetStatus (TC2, 1);
t = t%namunalar; // t dan oshmasligi uchun "if" o'rniga t%namunalarini ishlating
PhaseAInc = (oldindan o'rnatilgan*t)%5376; // massiv indeksining oshib ketishiga yo'l qo'ymaslik uchun %5376 dan foydalaning
PhaseBInc = (PhaseAInc+1792)%5376;
PhaseCInc = (PhaseAInc+3584)%5376;
p_A = sin768 [o'zgarishlarAInc] << 1; // PIOC-ga qarang: PC1-dan PC8-ga, Arduino-ga tegishli pin: pin 33-40, shuning uchun chapga 1-raqamga siljiting.
p_B = sin768 [o'zgarishlarBInc] << 12; // PIOC-ga qarang: PC12-dan PC19-ga, Arduino-ga tegishli pin: pin 51-44, shuning uchun chapga 12-raqamli siljish.
p_C = sin768 [o'zgarishlarCInc]; // fazali C chiqishi PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 va PC29, mos keladigan Arduino Due pin: raqamli pin: mos ravishda 9, 8, 7, 6, 5, 4, 3, 10
p_C2 = (p_C va B11000000) << 22; // bu PC28 va PC29 ni yaratadi
p_C3 = (p_C & B00111111) << 21; // bu PC21-PC26 ishlab chiqaradi
p_C = p_C2 | p_C3; // bu C fazasining parallel chiqishini hosil qiladi
p_A = p_A | p_B | p_C; // 32 bitli chiqish = A bosqichi (8bit) | B bosqichi | C bosqichi
PIOC-> PIO_ODSR = p_A; // chiqish registri = p_A
t ++; }
4 -qadam: R/2R DAC
3x8bit R/2R DAC yaratish, google -da ko'p yuklamalar.
5 -qadam: To'liq kod
#devine _BV (x) (1 << (x)); uint32_t sin768 PROGMEM = /* x = [0: 5375]; y = 127+127*(gunoh (2*pi/5376))*/
uint32_t p_A, p_B, p_C, p_C2, p_C3; // faza A faza B fazasi C qiymati-chiqish 8 bitli bo'lsa-da, p_A va p_B qiymati 32 bitli PIOC chiqishi bilan ishlash uchun yangi 32 bitli qiymatni yaratish uchun ishlaydi.
uint16_t PhaseAInc, PhaseBInc, PhaseCInc, Freq, FreqNew; uint32_t oralig'i; uint16_t namunalari, oldindan o'rnatilgan; uint32_t t = 0;
bo'sh o'rnatish () {
// parallel chiqish PIOC sozlamalari: Arduino Due pin33-40 A fazasi chiqishi sifatida ishlatiladi, pin 44-51 esa B fazasi chiqishi uchun ishlaydi.
PIOC-> PIO_PER = 0xFFFFFFFE; // PIO boshqaruvchisi PIO Energiya registrini yoqish (ATMEL SAM3X ma'lumotlar jadvalining p656-ga qarang) va https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due pin 33-41 va 44-51 yoqilgan.
PIOC-> PIO_OER = 0xFFFFFFFE; // PIO tekshirgichining chiqishini yoqish registri, ATMEL SAM3X ma'lumotlar jadvalining p657 ga qarang
PIOC-> PIO_OSR = 0xFFFFFFFE; // PIO tekshirgichining chiqish holati reestri, ATMEL SAM3X ma'lumotlar jadvalining p658 -ga qarang
PIOC-> PIO_OWER = 0xFFFFFFFE; // PIO chiqishni yozishni yoqish reestri, ATMEL SAM3X ma'lumotlar jadvalining p670 ga qarang
// PIOA-> PIO_PDR = 0x30000000; // sug'urta sifatida ixtiyoriy, ishlashga ta'sir qilmaydi, raqamli pin 10 PC29 va PA28 ga ulanadi, raqamli pin 4 PC29 va PA28 ga ulanadi, bu erda PIOA #28 va 29 ni o'chirish uchun // taymer sozlamalarini o'chirish uchun http ga qarang.: //arduino.cc/en/Hacking/PinMappingSAM3X, pmc_set_writeprotect (noto'g'ri); // Quvvatni boshqarish registrlarining yozishni himoyasini o'chirish
pmc_enable_periph_clk (ID_TC7); // periferik soat taymerini yoqish 7
TC_Configure (/ * soat */TC2,/ * kanal */1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); // TC soati 42 MGts (soat, kanal, taqqoslash rejimini sozlash) TC_SetRC (TC2, 1, interval); TC_Start (TC2, 1);
// taymerda taymer uzilishlarini yoqish TC2-> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS; // IER = uzilishni yoqish registri TC2-> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS; // IDR = ro'yxatga olishni to'xtatish
NVIC_EnableIRQ (TC7_IRQn); // Ichki joylashtirilgan vektorli uzilishni boshqarish moslamasida uzilishni yoqish freq = 60; // chastotani 60Hz oldindan o'rnatilgan = 21 sifatida ishga tushirish; // massiv indeksining 21 ta namuna ortishi = 256; // chiqish namunalari 256/tsikl oralig'i = 42000000/(chastota*namunalari); // uzilishlar soni TC_SetRC (TC2, 1, interval); // ishga tushirish TC Serial.begin (9600); // sinov maqsadida}
void checkFreq ()
{freqNew = 20000;
agar (freq == freqNew) {} boshqa
{freq = freqNew;
agar (chastota> 20000) {chastota = 20000; /*maksimal chastota 20 kHz*/};
agar (chastota <1) {chastota = 1; /*min chastota 1Hz*/};
agar (chastota> 999) {oldindan o'rnatilgan = 384; namunalar = 14;} // chastota uchun> = 1kHz, har bir tsikl uchun 14 ta namuna
if if (freq> 499) {preset = 84; namunalar = 64;} // 500 uchun <= chastota99) {oldindan o'rnatilgan = 42; namunalar = 128;} // 100Hz uchun <= chastota <500Hz, 128 ta namuna/tsikl
boshqa {oldindan o'rnatilgan = 21; namunalar = 256;}; // 100 gigagertsli chastota uchun, har bir tsikl uchun 256 ta namuna
interval = 42000000/(chastota*namunalari); t = 0; TC_SetRC (TC2, 1, interval); }}
void loop () {
checkFreq (); kechikish (100); }
bekor TC7_Handler (bekor)
{TC_GetStatus (TC2, 1);
t = t%namunalar; // t fazaAInc = (oldindan o'rnatilgan*t)%5376 dan oshib ketishining oldini olish uchun t%namunalarini ishlating; // massiv indeksining oshib ketishiga yo'l qo'ymaslik uchun %5376 dan foydalaning
PhaseBInc = (PhaseAInc+1792)%5376;
PhaseCInc = (PhaseAInc+3584)%5376;
p_A = sin768 [o'zgarishlarAInc] << 1; // PIOC-ga qarang: PC1-dan PC8-ga, Arduino-ga tegishli pin: pin 33-40, shuning uchun chapga 1-raqamga siljiting.
p_B = sin768 [o'zgarishlarBInc] << 12; // PIOC ga qarang: PC12 dan PC19, mos keladigan Arduino Due pin: pin 51-44, shuning uchun chapga 12 raqamli siljish
p_C = sin768 [o'zgarishlarCInc]; // C bosqichining chiqishi PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 va PC29, mos keladigan Arduino Due pin: raqamli pin: mos ravishda 9, 8, 7, 6, 5, 4, 3, 10
p_C2 = (p_C va B11000000) << 22; // bu PC28 va PC29 ni yaratadi
p_C3 = (p_C va B00111111) << 21; // bu PC21-PC26 //Serial.println(p_C3, BIN) hosil qiladi; p_C = p_C2 | p_C3; // bu C fazasining parallel chiqishini hosil qiladi
p_A = p_A | p_B | p_C; // 32 bitli chiqish = A fazasi (8bit) | B bosqichi | C fazasi //Serial.println(p_A>>21, BIN); // PIOC-> PIO_ODSR = 0x37E00000;
PIOC-> PIO_ODSR = p_A; // chiqish registri = p_A t ++; }
Tavsiya:
DIY funktsiyasi/to'lqin shakli generatori: 6 qadam (rasmlar bilan)
DIY funktsiyasi/to'lqin shakli generatori: Ushbu loyihada biz DIY versiyasi uchun qanday xususiyatlar muhimligini aniqlash uchun tijorat funktsiyasi/to'lqin shakli generatorlarini qisqacha ko'rib chiqamiz. Keyin men sizga oddiy funktsiyali generatorni, analog va raqamni qanday yaratishni ko'rsataman
Arduino to'lqin shakli generatori: 5 qadam (rasmlar bilan)
Arduino to'lqin shakllari generatori: 2021 yil fevral. Yangilanish: Raspberry Pi Pico asosidagi 300x namuna olish tezligi bilan yangi versiyani ko'rib chiqing. Bu kuchaytirgichni sinab ko'rish, kontaktlarning zanglashini tekshirish bo'lishi mumkin
Ob -havoga asoslangan musiqa generatori (ESP8266 asosidagi Midi generatori): 4 qadam (rasmlar bilan)
Ob -havoga asoslangan musiqa generatori (ESP8266 asosidagi Midi generatori): Salom, bugun men qanday qilib o'zingizning ob -havoga asoslangan kichik musiqa generatorini yasashni tushuntirib beraman. Bu ESP8266 ga asoslangan, u xuddi Arduinoga o'xshaydi va u harorat, yomg'irga javob beradi. va yorug'lik intensivligi. Bu butun qo'shiq yoki akkord dasturini yaratishini kutmang
Past narxli to'lqin shakli generatori (0 - 20MGts): 20 qadam (rasmlar bilan)
Arzon narxlardagi to'lqin shakllari generatori (0 - 20MGts): ABSTRATH Ushbu loyiha 10 MGts dan yuqori tarmoqli kengligi va 1%dan past bo'lgan harmonik buzilishli to'lqin generatorini olish zarurligidan kelib chiqadi, bularning barchasi arzon narxda. Ushbu hujjat tarmoqli kengligi to'lqin generatorining dizaynini tasvirlaydi
Tez qirrali to'lqin generatori: 4 qadam
Tez qirrali to'lqin generatori: Agar siz biron bir komponentning indüktansini, sig'imini o'lchashni xohlasangiz, sizga tez qirrali to'lqin kerak bo'ladi, biz bu maqolada bu haqda bilib olamiz