Sisukord:
- Samm: looge siinusandmete massiiv
- Samm 2: Paralleelväljundi lubamine
- Samm: katkestamise lubamine
- 4. samm: R/2R DAC
- Samm: täielik kood
Video: 3 faasi siinuslainegeneraator Arduino tõttu: 5 sammu
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:48
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:
Taaskasutatud Kuu faasi lamp: 15 sammu
Taaskasutatud Kuu faasi lamp: see lamp on valmistatud plastpurgist ja süttib kaane pingutamisel. Kuu erinevate faaside kuvamiseks saate muuta siluetti
Akustiline levitatsioon Arduino Unoga samm-sammult (8 sammu): 8 sammu
Akustiline levitatsioon Arduino Uno abil samm-sammult (8 sammu): ultraheliheli muundurid L298N DC-naissoost adapteri toiteallikas isase alalisvoolupistikuga Arduino UNOBreadboard ja analoogpordid koodi teisendamiseks (C ++)
Tulekahjusignalisatsioon Arduino abil [paar lihtsat sammu]: 3 sammu
Arduino kasutav tulekahjusignalisatsioon [paar lihtsat sammu]: Kas soovite Arduinoga teha lihtsa ja huvitava projekti, mis võiks samal ajal olla tõesti kasulik ja potentsiaalselt elupäästev? Kui jah, siis olete jõudnud õigesse kohta õppima midagi uut ja uuenduslikku. Selles postituses läheme
Odavaim Arduino -- Väikseim Arduino -- Arduino Pro Mini -- Programmeerimine -- Arduino Neno: 6 sammu (piltidega)
Odavaim Arduino || Väikseim Arduino || Arduino Pro Mini || Programmeerimine || Arduino Neno: …………………………. Palun TELLI minu YouTube'i kanalile, et saada rohkem videoid ……. .See projekt käsitleb kõigi aegade väikseima ja odavaima arduino liidestamist. Väikseim ja odavaim arduino on arduino pro mini. See sarnaneb arduinoga
Kuidas saada oma iPod Touch (või iPhone, kui olete selle tõepoolest segi ajanud), et mälu puudumise tõttu krahh lõpetada: 3 sammu
Kuidas panna oma iPod Touch (või Iphone, kui see tõesti segi ajas) mälu puudumise tõttu krahhist loobuma: Tere, siin, ipod touchi ja iPhone'i kasutajad. Ok, nii et ma olen üsna kindel, et teil kõigil on natuke elementaarne arusaam sellest, kuidas Apple ipod töötab, eks? Avate rakenduse. See rakendus kasutab ipod touch 1G kõikjal vahemikus 5–30 MB saadaolevast