Mundarija:

Arduino tufayli 3 fazali sinus to'lqin generatori: 5 qadam
Arduino tufayli 3 fazali sinus to'lqin generatori: 5 qadam

Video: Arduino tufayli 3 fazali sinus to'lqin generatori: 5 qadam

Video: Arduino tufayli 3 fazali sinus to'lqin generatori: 5 qadam
Video: Использование кнопки скорости шагового двигателя 28BYJ-48 с 8 проектами: Ultimate Video Tutorial, урок 107 2024, Noyabr
Anonim
Arduino tufayli 3 fazali sinus to'lqin generatori
Arduino tufayli 3 fazali sinus to'lqin generatori

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: