Sisällysluettelo:
- Vaihe 1: Luo Sine Data Array
- Vaihe 2: Rinnakkaislähdön ottaminen käyttöön
- Vaihe 3: Keskeytyksen ottaminen käyttöön
- Vaihe 4: R/2R DAC
- Vaihe 5: Koko koodi
Video: 3 -vaiheinen siniaaltogeneraattori Arduinon perusteella: 5 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 09:01
Tämän jaon tarkoitus on auttaa jotakuta, joka yrittää hyödyntää Due: n parempaa suorituskykyä + viittauksen puute + ei-hyödyllinen tietolomake.
Tämä projekti pystyy tuottamaan jopa 3 vaiheen siniaaltoa @ 256 näytettä / sykli alhaisilla taajuuksilla (<1 kHz) ja 16 näytettä / sykli @ korkeilla taajuuksilla (jopa 20 kHz), mikä on riittävän hyvä yksinkertaisten LPF: ien ja lähtö on lähes täydellinen.
liitteenä oleva tiedosto ei ollut lopullinen versio, koska lisäsin lisäominaisuuden, mutta ydin on sama. Huomaa, että näytteet/sykli on asetettu alemmaksi kuin yllä oleva lausunto.
koska suorittimen kapasiteetti maksimoidaan liitteenä olevassa tiedostossa esitetyn lähestymistavan avulla, käytin ohjausyksikkönä Arduino Unoa, joka käyttää Arduino Due: n ulkoista keskeytystä välittääkseen taajuusarvon Arduino Due -laitteelle. Taajuuden ohjauksen lisäksi Arduino Uno ohjaa myös amplitudia (digitaalisen potentiaalimittarin + OpAmpin kautta) sekä I/O --- siellä on paljon tilaa pelata.
Vaihe 1: Luo Sine Data Array
Koska reaaliaikainen laskeminen vaatii CPU: ta, suorituskyvyn parantamiseksi tarvitaan sinidataryhmä
uint32_t sin768 OHJELMA =…. samalla x = [0: 5375]; y = 127+127*(sin (2*pi/5376/*tai jokin #, jonka haluat, riippuu vaatimuksesta*/))
Vaihe 2: Rinnakkaislähdön ottaminen käyttöön
Toisin kuin Uno, Due: lla on rajoitettu viittaus. Kuitenkin, jotta voidaan luoda 3 -vaiheinen siniaalto Arduino Unon perusteella, 1. suorituskyky ei ole arvokas sen alhaisen MCLK -arvon (16 MHz, kun taas on 84 MHz) vuoksi, toiseksi, rajoitettu GPIO voi tuottaa enintään 2 -vaiheisen ulostulon ja tarvitset lisää analoginen piiri tuottaa kolmannen vaiheen (C = -AB).
GPIO: n käyttöönotto perustui enimmäkseen kokeiluun+ei hyödylliseen SAM3X: n tietolomakkeeseen
PIOC-> PIO_PER = 0xFFFFFFFE; // PIO-ohjaimen PIO-käyttöönottorekisteri (katso ATMEL SAM3X -esitteen p656) ja https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due nastat 33-41 ja 44-51 otettiin käyttöön
PIOC-> PIO_OER = 0xFFFFFFFE; // PIO-ohjaimen ulostulon sallimisrekisteri, katso ATMEL SAM3X -lehden PIOC-> PIO_OSR = 0xFFFFFFE; // PIO -ohjaimen ulostulon tilarekisteri, katso ATMEL SAM3X -lehden p658
PIOC-> PIO_OWER = 0xFFFFFFFE; // PIO -lähdön kirjoituskäyttörekisteri, katso ATMEL SAM3X -lehden p670
// PIOA-> PIO_PDR = 0x30000000; // valinnainen vakuutuksena, ei näytä vaikuttavan suorituskykyyn, digitaalinen nasta 10 yhdistetään sekä PC29: ään että PA28: een, digitaalinen nasta 4 yhdistetään sekä PC29: ään että PA28: een, poista tämä käytöstä poistamalla PIOA #28 & 29 käytöstä
Vaihe 3: Keskeytyksen ottaminen käyttöön
Suorittimen kuormituksen tulisi olla mahdollisimman alhainen suorituskyvyn maksimoimiseksi. Kuitenkin, koska CPU-nastan ja Due-nastan välinen vastaavuus ei ole 1-1, bittitoiminto on välttämätön.
Voit optimoida algoritmin edelleen, mutta huone on hyvin rajallinen.
void TC7_Handler (void) {TC_GetStatus (TC2, 1);
t = t%näytteitä; // käytä t%näytteitä 'if': n sijasta välttääksesi t: n ylivuoto
phaseAInc = (esiasetettu*t)%5376; // käytä %5376 välttääksesi taulukkoindeksin ylivuoto
phaseBInc = (vaiheAInc+1792)%5376;
phaseCInc = (vaiheAInc+3584)%5376;
p_A = sin768 [phaseAInc] << 1; // viittaa PIOC: PC1-PC8, vastaava Arduino Due -tappi: nasta 33-40, joten siirrä vasemmalle 1 numero
p_B = sin768 [vaiheBInc] << 12; // viittaa PIOC: PC12-PC19, vastaava Arduino Due -tappi: nasta 51-44, joten siirrä vasemmalle 12 numeroa
p_C = sin768 [vaiheCInc]; // vaiheen C lähtö käyttää PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 ja PC29, vastaava Arduino Due -nasta: digitaalinen nasta: 9, 8, 7, 6, 5, 4, 3, 10, vastaavasti
p_C2 = (p_C & B11000000) << 22; // tämä luo PC28 ja PC29
p_C3 = (p_C & B00111111) << 21; // tämä luo PC21-PC26
p_C = p_C2 | p_C3; // tämä tuottaa vaiheen C rinnakkaislähdön
p_A = p_A | p_B | p_C; // 32 -bittinen lähtö = vaihe A (8 -bittinen) | vaihe B | vaihe C
PIOC-> PIO_ODSR = p_A; // lähtörekisteri = p_A
t ++; }
Vaihe 4: R/2R DAC
rakentaa 3x8bit R/2R DAC, paljon ref Google.
Vaihe 5: Koko koodi
#define _BV (x) (1 << (x)); uint32_t sin768 OHJELMA = /* x = [0: 5375]; y = 127+127*(syn (2*pi/5376))*/
uint32_t p_A, p_B, p_C, p_C2, p_C3; // vaiheen A vaihe B vaiheen C arvo-vaikka ulostulo on vain 8 bittiä, p_A- ja p_B-arvoa käytetään luomaan uusi 32-bittinen arvo 32-bittisen PIOC-lähdön kanssa
uint16_t phaseAInc, phaseBInc, phaseCInc, freq, freqNew; uint32_t väli; uint16_t näytteet, esiasetettu; uint32_t t = 0;
void setup () {
// rinnakkaislähtö PIOC-asetus: Arduino Due -nasta 33-40 käytetään vaiheen A ulostulona, kun taas nasta 44-51 toimii vaiheen B ulostulossa
PIOC-> PIO_PER = 0xFFFFFFFE; // PIO-ohjaimen PIO-käyttöönottorekisteri (katso ATMEL SAM3X -esitteen p656) ja https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due nastat 33-41 ja 44-51 otettiin käyttöön
PIOC-> PIO_OER = 0xFFFFFFFE; // PIO -ohjaimen ulostulon sallimisrekisteri, katso ATMEL SAM3X -lehden p657
PIOC-> PIO_OSR = 0xFFFFFFFE; // PIO -ohjaimen ulostulon tilarekisteri, katso ATMEL SAM3X -lehden p658
PIOC-> PIO_OWER = 0xFFFFFFFE; // PIO -lähdön kirjoituskäyttörekisteri, katso ATMEL SAM3X -lehden p670
// PIOA-> PIO_PDR = 0x30000000; // valinnainen vakuutuksena, ei näytä vaikuttavan suorituskykyyn, digitaalinen nasta 10 yhdistetään sekä PC29: een että PA28: een, digitaalinen nasta 4 yhdistetään sekä PC29: ään että PA28: een, tässä voit poistaa käytöstä PIOA #28 & 29 // ajastimen asetukset, katso https://arduino.cc/en/Hacking/PinMappingSAM3X, pmc_set_writeprotect (epätosi); // poista virranhallinnan ohjausrekisterien kirjoitussuojaus käytöstä
pmc_enable_periph_clk (ID_TC7); // ottaa käyttöön oheislaitteen kelloajan laskuri 7
TC_Configure (/ * kello */TC2,/ * kanava */1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); // TC -kello 42MHz (kello, kanava, vertailutilan asetus) TC_SetRC (TC2, 1, interval); TC_Start (TC2, 1);
// ota ajastin keskeytykset käyttöön ajastimessa TC2-> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS; // IER = keskeytyskäyttörekisteri TC2-> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS; // IDR = keskeytä käytöstä poistava rekisteri
NVIC_EnableIRQ (TC7_IRQn); // Ota keskeytys käyttöön sisäkkäisessä vektorikeskeytysohjaimessa freq = 60; // alustetaan taajuus 60Hz esiasetettuna = 21; // array -indeksin nousu 21 näytteellä = 256; // ulostulonäytteet 256/jaksoväli = 42000000/(taajuus*näytteet); // keskeytyslaskut TC_SetRC (TC2, 1, interval); // käynnistä TC Serial.begin (9600); // testausta varten}
void checkFreq ()
{freqNew = 20000;
jos (freq == freqNew) {} muu
{freq = freqNew;
jos (taajuus> 20000) {taajuus = 20000; /*maks. taajuus 20 kHz*/};
jos (taajuus <1) {taajuus = 1; /*min taajuus 1 Hz*/};
jos (taajuus> 999) {esiasetus = 384; näytteet = 14;} // taajuudelle> = 1 kHz, 14 näytettä jokaiselle jaksolle
muuten jos (taajuus> 499) {esiasetus = 84; näytteet = 64;} // 500 <= taajuus99) {esiasetettu = 42; näytteet = 128;} // 100 Hz <= taajuus <500 Hz, 128 näytettä/sykli
else {esiasetus = 21; näytteet = 256;}; // taajuudelle <100 Hz, 256 näytettä kutakin sykliä kohden
väli = 42000000/(taajuus*näytteet); t = 0; TC_SetRC (TC2, 1, väli); }}
void loop () {
checkFreq (); viive (100); }
void TC7_Handler (mitätön)
{TC_GetStatus (TC2, 1);
t = t%näytteitä; // käytä t%näytteitä välttääksesi t phaseAInc = (esiasetettu*t)%5376; // käytä %5376 välttääksesi taulukkoindeksin ylivuoto
phaseBInc = (vaiheAInc+1792)%5376;
phaseCInc = (vaiheAInc+3584)%5376;
p_A = sin768 [phaseAInc] << 1; // viittaa PIOC: PC1-PC8, vastaava Arduino Due -tappi: nasta 33-40, joten siirrä vasemmalle 1 numero
p_B = sin768 [vaiheBInc] << 12; // viittaa PIOC: PC12-PC19, vastaava Arduino Due -tappi: nasta 51-44, joten siirrä vasemmalle 12 numeroa
p_C = sin768 [vaiheCInc]; // vaiheen C lähtö käyttää PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 ja PC29, vastaava Arduino Due -nasta: digitaalinen nasta: 9, 8, 7, 6, 5, 4, 3, 10, vastaavasti
p_C2 = (p_C & B11000000) << 22; // tämä luo PC28 ja PC29
p_C3 = (p_C & B00111111) << 21; // tämä luo PC21-PC26 //Serial.println(p_C3, BIN); p_C = p_C2 | p_C3; // tämä tuottaa vaiheen C rinnakkaislähdön
p_A = p_A | p_B | p_C; // 32 -bittinen lähtö = vaihe A (8 -bittinen) | vaihe B | vaihe C //Serial.println(p_A>> 21, BIN); // PIOC-> PIO_ODSR = 0x37E00000;
PIOC-> PIO_ODSR = p_A; // tulostusrekisteri = p_A t ++; }
Suositeltava:
Automaattinen sisätilojen kasvihuone Ikea Sockerin perusteella: 5 vaihetta
Automaattinen sisätilojen kasvihuone Ikea Sockerin perusteella: Hei, tämä on ensimmäinen ohjeeni. Olen oppinut paljon tästä yhteisöstä, ja mielestäni on aika palauttaa nöyrät ideani. Olen pahoillani englannista, se on huono, mutta teen kaikkeni
Arduinon ohjelmointi toisen Arduinon avulla vieritettävän tekstin näyttämiseksi ilman kirjastoa: 5 vaihetta
Arduinon ohjelmointi toisen Arduinon avulla vieritettävän tekstin näyttämiseksi ilman kirjastoa: Sony Spresense tai Arduino Uno eivät ole niin kalliita eivätkä vaadi paljon virtaa. Jos projektillasi on kuitenkin virtaa, tilaa tai jopa budjettia, voit harkita Arduino Pro Minin käyttöä. Toisin kuin Arduino Pro Micro, Arduino Pro Mi
Langaton kaukosäädin käyttäen 2,4 GHz: n NRF24L01 -moduulia Arduinon kanssa - Nrf24l01 4 -kanavainen / 6 -kanavainen lähettimen vastaanotin nelikopterille - Rc -helikopteri - Rc -taso Arduinon avulla: 5 vaihetta (kuvilla)
Langaton kaukosäädin käyttäen 2,4 GHz: n NRF24L01 -moduulia Arduinon kanssa | Nrf24l01 4 -kanavainen / 6 -kanavainen lähettimen vastaanotin nelikopterille | Rc -helikopteri | Rc -lentokone Arduinon avulla: Rc -auton käyttö | Nelikopteri | Drone | RC -taso | RC -vene, tarvitsemme aina vastaanottimen ja lähettimen, oletetaan, että RC QUADCOPTER -laitteelle tarvitaan 6 -kanavainen lähetin ja vastaanotin, ja tämäntyyppinen TX ja RX on liian kallista, joten teemme sellaisen
Edullinen näköratkaisu robottivarsilla Arduinon perusteella: 19 vaihetta (kuvilla)
Edullinen näköratkaisu robottivarteen perustuen Arduinoon: Kun puhumme konenäöstä, se tuntuu aina niin saavuttamattomalta. Teimme avoimen lähdekoodin demon, joka olisi erittäin helppo tehdä kaikille. Tässä videossa OpenMV -kameralla, missä tahansa punainen kuutio on, robotti on
Valon seuranta ja välttäminen Arduinon perusteella: 5 vaihetta
Arduinoon perustuva valon seuranta ja välttäminen: Tämä on yksinkertainen projekti, joka seuraa tai välttää valoa. Tein tämän simulaation Proteus 8.6 pro -laitteessa. Vaadittavat komponentit: -1) Arduino uno.2) 3 LDR.3) 2 Dc -moottorit. 4) Yksi servo. 5) Kolme 1k vastusta. 6) yksi H-silta l290D7) yksi päällä Poiskytkin [f