Satura rādītājs:
- 1. darbība: ģenerējiet sinusa datu masīvu
- 2. darbība. Paralēlās izvades iespējošana
- 3. darbība. Pārtraukšanas iespējošana
- 4. darbība: R/2R DAC
- 5. darbība. Pilns kods
Video: 3 fāžu sinusa viļņu ģenerators, pamatojoties uz Arduino Due: 5 soļi
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:56
šī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:
Tīrs sinusa viļņu invertors: 8 soļi
Tīrs sinusa viļņu invertors: mans pētījums
DIY funkcija/viļņu formas ģenerators: 6 soļi (ar attēliem)
DIY funkcija/viļņu formas ģenerators: Šajā projektā mēs īsumā apskatīsim komerciālos funkciju/viļņu formu ģeneratorus, lai noteiktu, kādas funkcijas ir svarīgas DIY versijai. Pēc tam es jums parādīšu, kā izveidot vienkāršu funkciju ģeneratoru, analogo un ciparu
Arduino viļņu formas ģenerators: 5 soļi (ar attēliem)
Arduino viļņu ģenerators: 2021. gada februāra atjauninājums: pārbaudiet jauno versiju ar 300x paraugu ņemšanas ātrumu, pamatojoties uz Raspberry Pi Pico. Laboratorijā bieži vien ir nepieciešams atkārtots noteiktas frekvences, formas un amplitūdas signāls. Tas var būt, lai pārbaudītu pastiprinātāju, pārbaudītu ķēdi
Zemu izmaksu viļņu formas ģenerators (0 - 20 MHz): 20 soļi (ar attēliem)
Zemu izmaksu viļņu formas ģenerators (0 - 20MHz): ABSTRATH Šis projekts izriet no nepieciešamības iegūt viļņu ģeneratoru ar joslas platumu virs 10 Mhz un harmonisku izkropļojumu zem 1%, un tas viss ir par zemu pašizmaksu. Šajā dokumentā ir aprakstīts viļņu ģeneratora dizains ar joslas platumu virs
Ātrās malas kvadrātveida viļņu impulsu ģenerators: 4 soļi
Ātrās malas kvadrātveida viļņu impulsu ģenerators: Ātrās malas impulsu ģenerators - īpaši ātrs kvadrātveida viļņu impulsu ģenerators Šī vienkāršā shēma, izmantojot 74HC14N (sešus TTL invertorus ar zemu griešanās ātrumu), spēj ģenerēt kvadrātveida viļņu signālus līdz 10 MHz. Ideāli piemērots dažām elektronikas pārbaudēm. Ar puvi