Sisällysluettelo:

3 -vaiheinen siniaaltogeneraattori Arduinon perusteella: 5 vaihetta
3 -vaiheinen siniaaltogeneraattori Arduinon perusteella: 5 vaihetta

Video: 3 -vaiheinen siniaaltogeneraattori Arduinon perusteella: 5 vaihetta

Video: 3 -vaiheinen siniaaltogeneraattori Arduinon perusteella: 5 vaihetta
Video: Using IRF520 MOSFET Switch Button to Turn ON or OFF DC load 2024, Heinäkuu
Anonim
3 -vaiheinen siniaaltogeneraattori, joka perustuu Arduinoon
3 -vaiheinen siniaaltogeneraattori, joka perustuu Arduinoon

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: