3 fas sinus våg generator baserat på Arduino förfallodatumet (5 / 5 steg)
Steg 5: Full koden
#define _BV(x) (1 << (x));
uint32_t sin768 [] PROGMEM = / * x = [0:5375]; y = 127+127*(sin(2*pi/5376)) * /
uint32_t p_A, p_B, p_C, p_C2, p_C3; fas A fas B fas C värde--men produktionen är 8bits endast, p_A och p_B värde kommer att drivas att generera ett nytt 32-bitars värde för att cop med 32-bitars PIOC utgång
uint16_t phaseAInc, phaseBInc, phaseCInc, freq, freqNew; uint32_t intervall. uint16_t prover, förinställda; uint32_t t = 0;
void setup() {
parallell utgång PIOC setup: Arduino vederbörlig pin33-40 anställda som fas A utgång samtidigt pin 44-51 arbete för fas B utgång
PIOC -> PIO_PER = 0xFFFFFFFE; PIO controller PIO aktiverar register (hänvisa till p656 av ATMEL SAM3X datablad) och http://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino vederbörlig pin 33-41 och 44-51 var aktiverad
PIOC -> PIO_OER = 0xFFFFFFFE; PIO controller utdata aktiverar register, hänvisa till p657 av ATMEL SAM3X datablad
PIOC -> PIO_OSR = 0xFFFFFFFE; PIO controller produktionen ställningen register, hänvisa till p658 av ATMEL SAM3X datablad
PIOC -> PIO_OWER = 0xFFFFFFFE; PIO utdata skriva aktiverar register, hänvisa till p670 av ATMEL SAM3X datablad
PIOA -> PIO_PDR = 0x30000000; tillval som försäkring, inte tycks påverka prestanda, digital stift 10 ansluta till både PC29 och PA28, digital stift 4 ansluta till både PC29 och PA28, här för att inaktivera inaktivera PIOA #28 & 29 //timer setup, hänvisa till http://arduino.cc/en/Hacking/PinMappingSAM3X,
pmc_set_writeprotect(false); Inaktivera skrivskyddet av Power Management Control register
pmc_enable_periph_clk(ID_TC7); Aktivera perifera klocka tid counter 7
TC_Configure (/ * klocka * / TC2, / * kanal * / 1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); TC klocka 42MHz (klocka, kanal, jämför läge inställning) TC_SetRC (TC2, 1, intervall); TC_Start (TC2, 1);
Aktivera timern avbrott på timern TC2 -> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS; IER = avbrott aktivera registrera TC2 -> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS; IDR = avbrott inaktivera register
NVIC_EnableIRQ(TC7_IRQn); Aktiverar avbrottet i kapslade vektor interrupt controller freq = 60. initiera frekvens som 60Hz förinställda = 21; array index ökning av 21 prover = 256; output prover 256/cykel intervall = 42000000/(freq*samples); avbryta räknar TC_SetRC (TC2, 1, intervall); Starta TC Serial.begin(9600); för test}
void checkFreq()
{freqNew = 20000;
om (freq == freqNew) {} annat
{freq = freqNew;
om (freq > 20000) {freq = 20000; / * max frekvens 20 kHz * /};
om (freq < 1) {freq = 1; / * min frekvensen 1 Hz * /};
om (freq > 999) {förinställda = 384; prover = 14.} //for frekvens > = 1kHz, 14 prover för varje cykel
annars om (freq > 499) {förinställda = 84; prover = 64;} //for 500 < = frekvens < 1000Hz, 64 prover för varje cykeln annars om (freq > 99) {förinställda = 42; prover = 128;} //for 100Hz < = frekvens < 500Hz, 128 prover/cykel
annat {förinställda = 21; prover = 256;}; för frekvens < 100hz, 256 prover för varje cykel
intervall = 42000000/(freq*samples); t = 0; TC_SetRC (TC2, 1, intervall); } }
void loop() {
checkFreq(); Delay(100); }
void TC7_Handler(void)
{TC_GetStatus(TC2,1);
t = t % prov; Använd t % prov till avoild översvämningen av t phaseAInc = (förinställda * t) % 5376; Använd % 5376 för att undvika array index overflow
phaseBInc = (phaseAInc + 1792) % 5376;
phaseCInc = (phaseAInc + 3584) % 5376;
p_A = sin768 [phaseAInc] << 1; hänvisa till PIOC: PC1 till PC8, motsvarande Arduino vederbörlig pin: pin 33-40, därav flytta vänster för 1 siffra
p_B = sin768 [phaseBInc] << 12; hänvisa till PIOC: PC12 till PC19, motsvarande Arduino vederbörlig pin: pin 51-44, därav flytta vänster 12 tal
p_C = sin768 [phaseCInc]; fas C utgång Employé PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 och PC29, motsvarande Arduino vederbörlig pin: digital pin: 9,8,7,6,5,4,3,10, respektive
p_C2 = (p_C & B11000000) << 22; Detta genererar PC28 och PC29
p_C3 = (p_C & B00111111) << 21; Detta genererar PC21-PC26 / / Serial.println(p_C3,BIN); p_C = p_C2|p_C3; Detta genererar parallella produktionen av fas C
p_A = p_A|p_B|p_C; 32 bitars utdata = fas A (8 bitar) |phase B|phase C //Serial.println (p_A >> 21, BIN); PIOC -> PIO_ODSR = 0x37E00000;
PIOC -> PIO_ODSR = p_A; utgång register = p_A t ++; }