Sisukord:

3 faasi siinuslainegeneraator Arduino tõttu: 5 sammu
3 faasi siinuslainegeneraator Arduino tõttu: 5 sammu

Video: 3 faasi siinuslainegeneraator Arduino tõttu: 5 sammu

Video: 3 faasi siinuslainegeneraator Arduino tõttu: 5 sammu
Video: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, Juuli
Anonim
3 faasi siinuslainegeneraator Arduino Due alusel
3 faasi siinuslainegeneraator Arduino Due alusel

selle jagamise eesmärk on aidata kedagi, kes üritab kasutada Due suuremat jõudlust + viitepuudus + mittekasulik andmeleht.

see projekt suudab genereerida kuni 3 faasi siinuslainet @ 256 proovi tsükli kohta madalal sagedusel (<1 kHz) ja 16 näidist / tsükli @ kõrge sagedusega (kuni 20 kHz), mis on piisavalt hea, et seda saaks tasandada lihtsate LPF -ide ja väljund on peaaegu täiuslik.

manustatud fail ei olnud minu lõplik versioon, sest lisasin mõne lisafunktsiooni, kuid tuum on selles osas sama. Pange tähele, et proovid/tsükkel on seatud madalamale kui ülaltoodud.

kuna protsessori võimsus on lisatud failis näidatud lähenemisviisi abil maksimaalne, kasutasin juhtimisseadmena Arduino Unot, mis kasutab Arduino Due välist katkestust sagedusväärtuse edastamiseks Arduino Duele. Lisaks sageduse juhtimisele juhib Arduino Uno ka amplituudi (digitaalse potentsiaalimõõturi + OpAmp kaudu) ja sisend-/väljundvälju --- seal on palju ruumi mängida.

Samm: looge siinusandmete massiiv

Kuna reaalajas arvutamine nõuab protsessorit, on parema jõudluse jaoks vajalik siinusandmete massiiv

uint32_t sin768 PROGMEM =…. samas x = [0: 5375]; y = 127+127*(sin (2*pi/5376/*või mõni #, mida eelistate, sõltub nõudest*/))

Samm 2: Paralleelväljundi lubamine

Erinevalt Unost on Due'l piiratud viide. Kuid Arduino Uno baasil kolmefaasilise siinuslaine tekitamiseks ei ole jõudlus selle madala MCLK (16 MHz, kuid tähtaeg 84 MHz) tõttu kiiduväärt, teiseks, piiratud GPIO suudab toota maksimaalselt kahefaasilist väljundit ja vajate täiendavat analoogskeem, et toota 3. faas (C = -AB).

GPIO lubamine põhines enamasti proovimisel ja proovimisel+ei olnud kasulik SAM3X -i andmeleht

PIOC-> PIO_PER = 0xFFFFFFFE; // PIO kontroller PIO lubamise register (vt ATMEL SAM3X andmelehe lk 656) ja https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due pin 33-41 ja 44-51 olid lubatud

PIOC-> PIO_OER = 0xFFFFFFFE; // PIO-kontrolleri väljundi lubamise register, vt ATMEL SAM3X andmelehe lk 657 PIOC-> PIO_OSR = 0xFFFFFFFE; // PIO -kontrolleri väljundi olekuregister, vt ATMEL SAM3X andmelehe lk 658

PIOC-> PIO_OWER = 0xFFFFFFFE; // PIO väljundi kirjutamise lubamise register, vt ATMEL SAM3X andmelehe lk 670

// PIOA-> PIO_PDR = 0x30000000; // valikuline kindlustusena, tundub, et see ei mõjuta jõudlust, digitaalne tihvt 10 ühendatakse nii PC29 kui ka PA28 -ga, digitaalne tihvt 4 ühendatakse nii PC29 kui ka PA28 -ga, siin PIOA #28 & 29 keelamiseks

Samm: katkestamise lubamine

Selle jõudluse maksimeerimiseks peaks protsessori koormus olema võimalikult väike. Kuid protsessori tihvti ja täpiühenduse vahelise mittevastavuse tõttu 1-st 1 on bititehing vajalik.

Saate algoritmi veelgi optimeerida, kuid ruum on väga piiratud.

tühine TC7_Handler (tühine) {TC_GetStatus (TC2, 1);

t = t%proovidest; // t -i ületäitumise vältimiseks kasutage '%' asemel t%näidiseid

phaseAInc = (eelseadistus*t)%5376; // massiiviindeksi ületäitumise vältimiseks kasutage %5376

faasBInc = (faasAInc+1792)%5376;

phaseCInc = (faasAInc+3584)%5376;

p_A = sin768 [faasAInc] << 1; // vt PIOC: PC1 kuni PC8, vastav Arduino täpi tihvt: tihvt 33-40, seega nihe vasakule 1 numbri jaoks

p_B = sin768 [faasBInc] << 12; // vt PIOC: PC12 kuni PC19, vastav Arduino täpi tihvt: tihvt 51-44, seega nihe vasakule 12 numbrit

p_C = sin768 [faasiCInc]; // faasi C väljund kasutab PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 ja PC29, vastav Arduino Due tihvt: digitaalne tihvt: vastavalt 9, 8, 7, 6, 5, 4, 3, 10

p_C2 = (p_C & B11000000) << 22; // see genereerib PC28 ja PC29

p_C3 = (p_C & B00111111) << 21; // see genereerib PC21-PC26

p_C = p_C2 | p_C3; // see genereerib faasi C paralleelse väljundi

p_A = p_A | p_B | p_C; // 32 -bitine väljund = faas A (8 -bitine) | faas B | faas C

PIOC-> PIO_ODSR = p_A; // väljundregister = p_A

t ++; }

4. samm: R/2R DAC

ehitada 3x8bit R/2R DAC, palju ref. google'is.

Samm: täielik kood

#define _BV (x) (1 << (x)); uint32_t sin768 PROGMEM = /* x = [0: 5375]; y = 127+127*(patt (2*pi/5376))*/

uint32_t p_A, p_B, p_C, p_C2, p_C3; // A faasi faasi B faasi C väärtus-kuigi väljund on ainult 8 bitti, kasutatakse p_A ja p_B väärtusi, et genereerida uus 32-bitine väärtus, et tulla toime 32-bitise PIOC-väljundiga

uint16_t phaseAInc, phaseBInc, phaseCInc, freq, freqNew; intervall uint32_t; uint16_t proovid, eelseadistatud; uint32_t t = 0;

tühine seadistus () {

// paralleelväljundi PIOC seadistus: Arduino Due tihvti 33-40 kasutatakse faasi A väljundina, samas kui tihvt 44-51 töötab faasi B väljundina

PIOC-> PIO_PER = 0xFFFFFFFE; // PIO kontroller PIO lubamise register (vt ATMEL SAM3X andmelehe lk 656) ja https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due pin 33-41 ja 44-51 olid lubatud

PIOC-> PIO_OER = 0xFFFFFFFE; // PIO kontrolleri väljundi lubamise register, vt ATMEL SAM3X andmelehe lk 657

PIOC-> PIO_OSR = 0xFFFFFFFE; // PIO -kontrolleri väljundolekuregister, vaadake ATMEL SAM3X andmelehe lk 658

PIOC-> PIO_OWER = 0xFFFFFFFE; // PIO väljundi kirjutamise lubamise register, vt ATMEL SAM3X andmelehe lk 670

// PIOA-> PIO_PDR = 0x30000000; // valikuline kindlustusena, tundub, et see ei mõjuta jõudlust, digitaalne tihvt 10 ühendatakse nii PC29 kui ka PA28 -ga, digitaalne tihvt 4 ühendatakse nii PC29 kui ka PA28 -ga, siin PIOA #28 & 29 keelamise keelamiseks // taimeri seadistamine, vt https://arduino.cc/en/Hacking/PinMappingSAM3X, pmc_set_writeprotect (vale); // toitehalduse juhtimisregistrite kirjutuskaitse keelamine

pmc_enable_periph_clk (ID_TC7); // perifeerse kellaaja loenduri lubamine 7

TC_Configure (/ * kell */TC2,/ * kanal */1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); // TC kell 42MHz (kell, kanal, võrdlusrežiimi seadistus) TC_SetRC (TC2, 1, intervall); TC_Start (TC2, 1);

// lubage taimeri katkestused taimeril TC2-> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS; // IER = katkestamise lubamise register TC2-> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS; // IDR = katkestuse keelamise register

NVIC_EnableIRQ (TC7_IRQn); // Katkestuse lubamine pesastatud vektori katkestuskontrolleris freq = 60; // lähtestada sagedus 60Hz eelseadistatud = 21; // massiiviindeksi kasv 21 proovi võrra = 256; // väljundproovid 256/tsükli intervall = 42000000/(sagedus*proovid); // katkestuste loendamine TC_SetRC (TC2, 1, intervall); // käivita TC Serial.begin (9600); // testi eesmärgil}

void checkFreq ()

{freqNew = 20000;

if (freq == freqNew) {} muu

{freq = freqUus;

kui (sagedus> 20000) {sagedus = 20000; /*maksimaalne sagedus 20 kHz*/};

kui (sagedus <1) {sagedus = 1; /*min sagedus 1Hz*/};

kui (sagedus> 999) {eelseade = 384; proovid = 14;} // sagedusel> = 1 kHz, 14 näidist iga tsükli kohta

muidu kui (sagedus> 499) {eelseade = 84; proovid = 64;} // 500 jaoks <= sagedus99) {eelseade = 42; proovid = 128;} // 100 Hz jaoks <= sagedus <500 Hz, 128 näidist/tsükkel

else {eelseade = 21; proovid = 256;}; // sagedusel <100 Hz, 256 proovi iga tsükli kohta

intervall = 42000000/(sagedus*proovid); t = 0; TC_SetRC (TC2, 1, intervall); }}

void loop () {

checkFreq (); viivitus (100); }

tühine TC7_Handler (tühine)

{TC_GetStatus (TC2, 1);

t = t%proovidest; // kasutage t%näidiseid, et vältida t phaseAInc = (eelseadistatud*t) ületäitumist%5376; // massiiviindeksi ületäitumise vältimiseks kasutage %5376

faasBInc = (faasAInc+1792)%5376;

phaseCInc = (faasAInc+3584)%5376;

p_A = sin768 [faasAInc] << 1; // vt PIOC: PC1 kuni PC8, vastav Arduino täpi tihvt: tihvt 33-40, seega nihe vasakule 1 numbri jaoks

p_B = sin768 [faasBInc] << 12; // vt PIOC: PC12 kuni PC19, vastav Arduino täpi tihvt: tihvt 51-44, seega nihe vasakule 12 numbrit

p_C = sin768 [faasiCInc]; // faasi C väljund kasutab PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 ja PC29, vastav Arduino Due tihvt: digitaalne tihvt: vastavalt 9, 8, 7, 6, 5, 4, 3, 10

p_C2 = (p_C & B11000000) << 22; // see genereerib PC28 ja PC29

p_C3 = (p_C & B00111111) << 21; // see genereerib PC21-PC26 //Serial.println(p_C3, BIN); p_C = p_C2 | p_C3; // see genereerib faasi C paralleelse väljundi

p_A = p_A | p_B | p_C; // 32 -bitine väljund = faas A (8 -bitine) | faas B | faas C //Serial.println(p_A>> 21, BIN); // PIOC-> PIO_ODSR = 0x37E00000;

PIOC-> PIO_ODSR = p_A; // väljundregister = p_A t ++; }

Soovitan: