Satura rādītājs:

3 fāžu sinusa viļņu ģenerators, pamatojoties uz Arduino Due: 5 soļi
3 fāžu sinusa viļņu ģenerators, pamatojoties uz Arduino Due: 5 soļi

Video: 3 fāžu sinusa viļņu ģenerators, pamatojoties uz Arduino Due: 5 soļi

Video: 3 fāžu sinusa viļņu ģenerators, pamatojoties uz Arduino Due: 5 soļi
Video: Дональд Садовэй: Недостающее звено на пути к возобновляемой энергии 2024, Novembris
Anonim
3 fāžu sinusa viļņu ģenerators, pamatojoties uz Arduino Due
3 fāžu sinusa viļņu ģenerators, pamatojoties uz Arduino Due

šīs koplietošanas mērķis ir palīdzēt kādam, kurš cenšas izmantot Due lielāku sniegumu + atsauces trūkums + nelietderīga datu lapa.

šis projekts spēj ģenerēt līdz 3 fāžu sinusa viļņus @ 256 paraugus ciklā ar zemu frekvenci (<1 kHz) un 16 paraugus / ciklu @ augstu frekvenci (līdz 20 kHz), kas ir pietiekami labs, lai to izlīdzinātu ar vienkāršiem LPF un izvade ir gandrīz perfekta.

pievienotais fails nebija mana galīgā versija, jo es pievienoju kādu papildu funkciju, bet kodols tam ir tāds pats. Ņemiet vērā, ka paraugi/cikls ir iestatīts zemāk nekā iepriekš.

tā kā CPU jauda tiek maksimāli palielināta, izmantojot pievienotajā failā parādīto pieeju, es kā vadības bloku izmantoju Arduino Uno, kas izmanto Arduino Due ārējo pārtraukumu, lai nodotu frekvences vērtību Arduino Due. Papildus frekvences vadībai Arduino Uno kontrolē arī amplitūdu (izmantojot digitālo potenciāla mērītāju + OpAmp), kā arī I/O-būs daudz vietas, kur spēlēties.

1. darbība: ģenerējiet sinusa datu masīvu

Tā kā reālā laika aprēķins prasa CPU, labākai veiktspējai ir nepieciešams sinusa datu masīvs

uint32_t sin768 PROGMĒMA =…. kamēr x = [0: 5375]; y = 127+127*(sin (2*pi/5376/*vai daži #, kas jums patīk, ir atkarīgs no prasības*/))

2. darbība. Paralēlās izvades iespējošana

Atšķirībā no Uno, Due ir ierobežota atsauce. Tomēr, lai ģenerētu trīsfāzu sinusa viļņus, pamatojoties uz Arduino Uno, pirmkārt, veiktspēja nav apbrīnojama, jo ir zems MCLK (16 MHz, bet termiņš ir 84 MHz), otrkārt, ierobežotais GPIO var radīt maksimāli 2 fāžu izvadi, un jums ir nepieciešams papildu analogā ķēde, lai iegūtu 3. fāzi (C = -AB).

GPIO iespējošana galvenokārt balstījās uz izmēģinājumu un izmēģinājumu+nav noderīga SAM3X datu lapa

PIOC-> PIO_PER = 0xFFFFFFFE; // PIO kontrolieris PIO iespējošanas reģistrs (skatiet ATMEL SAM3X datu lapas 656. lpp.) Un https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due 33-41 un 44-51 tika iespējoti

PIOC-> PIO_OER = 0xFFFFFFFE; // PIO kontrollera izejas iespējošanas reģistrs, skatiet ATMEL SAM3X datu lapas PIOC-> PIO_OSR = 0xFFFFFFFE p657. // PIO kontrollera izejas statusa reģistrs, skatiet ATMEL SAM3X datu lapas p658

PIOC-> PIO_OWER = 0xFFFFFFFE; // PIO izvades rakstīšanas iespējošanas reģistrs, skatiet ATMEL SAM3X datu lapas p670

// PIOA-> PIO_PDR = 0x30000000; // pēc izvēles kā apdrošināšana, šķiet, neietekmē veiktspēju, digitālā tapa 10 tiek savienota gan ar PC29, gan ar PA28, digitālā tapa 4 savienojas gan ar PC29, gan ar PA28, šeit, lai atspējotu PIOA #28 & 29 atspējošanu

3. darbība. Pārtraukšanas iespējošana

Lai maksimāli palielinātu veiktspēju, CPU slodzei jābūt pēc iespējas zemākai. Tomēr, tā kā CPU kontakts un Due pin neatbilst 1-1, bitu darbība ir nepieciešama.

Jūs varat vēl vairāk optimizēt algoritmu, taču telpa ir ļoti ierobežota.

void TC7_Handler (void) {TC_GetStatus (TC2, 1);

t = t%paraugu; // lai lietotu t%paraugus, ja nav, lai izvairītos no t pārpildes

phaseAInc = (iepriekš iestatīts*t)%5376; // izmantojiet %5376, lai izvairītos no masīva indeksa pārpildes

phaseBInc = (phaseAInc+1792)%5376;

phaseCInc = (phaseAInc+3584)%5376;

p_A = sin768 [phaseAInc] << 1; // skatiet PIOC: PC1-PC8, atbilstošo Arduino Due tapu: 33-40. tapa, tāpēc pāreja pa kreisi par 1 ciparu

p_B = sin768 [fāzeBInc] << 12; // skatīt PIOC: PC12 uz PC19, atbilstošo Arduino Due tapu: pin 51-44, līdz ar to nobīdi pa kreisi 12 cipari

p_C = sin768 [fāzeCInc]; // C fāzes izejā tiek izmantots PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 un PC29, atbilstošā Arduino Due tapa: digitālā tapa: attiecīgi 9, 8, 7, 6, 5, 4, 3, 10

p_C2 = (p_C & B11000000) << 22; // tas ģenerē PC28 un PC29

p_C3 = (p_C & B00111111) << 21; // tas ģenerē PC21-PC26

p_C = p_C2 | p_C3; // tas ģenerē C fāzes paralēlo izvadi

p_A = p_A | p_B | p_C; // 32 bitu izeja = A fāze (8 bitu) | B fāze | C fāze

PIOC-> PIO_ODSR = p_A; // izvades reģistrs = p_A

t ++; }

4. darbība: R/2R DAC

veidot 3x8bit R/2R DAC, daudz ref.

5. darbība. Pilns kods

#define _BV (x) (1 << (x)); uint32_t sin768 PROGMĒMA = /* x = [0: 5375]; y = 127+127*(grēks (2*pi/5376))*/

uint32_t p_A, p_B, p_C, p_C2, p_C3; // A fāzes B fāzes C vērtība-lai gan izeja ir tikai 8 biti, p_A un p_B vērtība tiks darbināta, lai ģenerētu jaunu 32 bitu vērtību, lai tiktu galā ar 32 bitu PIOC izvadi

uint16_t phaseAInc, phaseBInc, phaseCInc, freq, freqNew; uint32_t intervāls; uint16_t paraugi, iepriekš iestatīti; uint32_t t = 0;

void setup () {

// paralēlās izvades PIOC iestatīšana: Arduino Due tapa 33-40 tiek izmantota kā A fāzes izeja, bet 44-51 tapa darbojas B fāzes izejai

PIOC-> PIO_PER = 0xFFFFFFFE; // PIO kontrolieris PIO iespējošanas reģistrs (skatiet ATMEL SAM3X datu lapas 656. lpp.) Un https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due 33-41 un 44-51 tika iespējoti

PIOC-> PIO_OER = 0xFFFFFFFE; // PIO kontrollera izejas iespējošanas reģistrs, skatiet ATMEL SAM3X datu lapas 655. lpp

PIOC-> PIO_OSR = 0xFFFFFFFE; // PIO kontrollera izejas statusa reģistrs, skatiet ATMEL SAM3X datu lapas p658

PIOC-> PIO_OWER = 0xFFFFFFFE; // PIO izvades rakstīšanas iespējošanas reģistrs, skatiet ATMEL SAM3X datu lapas p670

// PIOA-> PIO_PDR = 0x30000000; // pēc izvēles kā apdrošināšana, šķiet, neietekmē veiktspēju, digitālā tapa 10 tiek savienota gan ar PC29, gan ar PA28, digitālā tapa 4 savienojas gan ar PC29, gan ar PA28, šeit, lai atspējotu PIOA #28 & 29 // taimera iestatīšanu, skatiet https://arduino.cc/en/Hacking/PinMappingSAM3X, pmc_set_writeprotect (nepatiesa); // atspējot strāvas pārvaldības vadības reģistru rakstīšanas aizsardzību

pmc_enable_periph_clk (ID_TC7); // iespējot perifērijas pulksteņa laika skaitītāju 7

TC_Configure (/ * pulkstenis */TC2,/ * kanāls */1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); // TC pulkstenis 42MHz (pulkstenis, kanāls, salīdzināšanas režīma iestatījums) TC_SetRC (TC2, 1, intervāls); TC_Start (TC2, 1);

// iespējot taimera pārtraukumus taimerī TC2-> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS; // IER = pārtraukt iespējošanas reģistru TC2-> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS; // IDR = pārtraukt atspējošanas reģistru

NVIC_EnableIRQ (TC7_IRQn); // Iespējot pārtraukumu ligzdotajā vektorā pārtraukuma kontrolieris freq = 60; // inicializēt frekvenci kā 60Hz preset = 21; // masīva indeksa pieaugums par 21 paraugu = 256; // izvades paraugi 256/cikla intervāls = 42000000/(biežums*paraugi); // pārtraukumu skaits TC_SetRC (TC2, 1, intervāls); // sākt TC Serial.begin (9600); // testa nolūkā}

void checkFreq ()

{freqNew = 20000;

ja (freq == freqJauns) {} cits

{freq = freqJauns;

ja (biežums> 20000) {freq = 20000; /*maksimālā frekvence 20kHz*/};

ja (biežums <1) {frekvence = 1; /*min frekvence 1Hz*/};

ja (biežums> 999) {iepriekš iestatīts = 384; paraugi = 14;} // frekvencei> = 1kHz, 14 paraugi katram ciklam

cits if (biežums> 499) {iepriekš iestatīts = 84; paraugi = 64;} // 500 <= frekvence99) {iepriekš iestatīts = 42; paraugi = 128;} // 100 Hz <= frekvence <500 Hz, 128 paraugi ciklā

cits {iepriekš iestatīts = 21; paraugi = 256;}; // frekvencei <100hz, 256 paraugi katram ciklam

intervāls = 42000000/(freq*paraugi); t = 0; TC_SetRC (TC2, 1, intervāls); }}

void loop () {

checkFreq (); kavēšanās (100); }

void TC7_Handler (anulēts)

{TC_GetStatus (TC2, 1);

t = t%paraugu; // izmantot t%paraugus, lai izvairītos no t fāzes AInc pārplūdes = (iepriekš iestatīts*t)%5376; // izmantojiet %5376, lai izvairītos no masīva indeksa pārpildes

phaseBInc = (phaseAInc+1792)%5376;

phaseCInc = (phaseAInc+3584)%5376;

p_A = sin768 [phaseAInc] << 1; // skatīt PIOC: PC1-PC8, atbilstošo Arduino Due tapu: 33-40. tapa, līdz ar to pāreja pa kreisi par 1 ciparu

p_B = sin768 [fāzeBInc] << 12; // skatīt PIOC: PC12 uz PC19, atbilstošo Arduino Due tapu: pin 51-44, līdz ar to nobīdi pa kreisi 12 cipari

p_C = sin768 [fāzeCInc]; // C fāzes izejā tiek izmantots PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 un PC29, atbilstošā Arduino Due tapa: digitālā tapa: attiecīgi 9, 8, 7, 6, 5, 4, 3, 10

p_C2 = (p_C & B11000000) << 22; // tas ģenerē PC28 un PC29

p_C3 = (p_C & B00111111) << 21; // tas ģenerē PC21-PC26 //Serial.println(p_C3, BIN); p_C = p_C2 | p_C3; // tas ģenerē C fāzes paralēlo izvadi

p_A = p_A | p_B | p_C; // 32 bitu izvade = fāze A (8 bitu) | fāze B | fāze C //Serial.println(p_A>>21, BIN); // PIOC-> PIO_ODSR = 0x37E00000;

PIOC-> PIO_ODSR = p_A; // izvades reģistrs = p_A t ++; }

Ieteicams: