Stap 5: Volledige code
#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; fase A fase B fase C waarde--hoewel zijn uitvoer 8bits alleen, p_A en p_B waarde zal worden beheerd voor het genereren van een nieuwe 32-bits waarde om cop met 32-bits PIOC uitgang
uint16_t phaseAInc, phaseBInc, phaseCInc, freq, freqNew; uint32_t-interval; uint16_t monsters, preset; uint32_t t = 0;
VOID Setup {}
parallel output PIOC setup: Arduino Due pin33-40 werkzaam zijn zoals fase A uitgang terwijl pin 44-51 werk voor fase B-uitgang
PIOC -> PIO_PER = 0xFFFFFFFE; PIO controller PIO inschakelen register (Zie p656 van ATMEL SAM3X gegevensblad) en http://arduino.cc/en/Hacking/PinMappingSAM3X, inachtneming van de Arduino pin 33-41 en 44-51 werden ingeschakeld
PIOC -> PIO_OER = 0xFFFFFFFE; PIO controller uitvoer inschakelen register, verwijzen naar p657 van ATMEL SAM3X gegevensblad
PIOC -> PIO_OSR = 0xFFFFFFFE; PIO controller output status registreren, verwijzen naar p658 van ATMEL SAM3X gegevensblad
PIOC -> PIO_OWER = 0xFFFFFFFE; PIO uitvoer schrijven inschakelen register, verwijzen naar p670 van ATMEL SAM3X gegevensblad
PIOA -> PIO_PDR = 0x30000000; optionele "insurance", doet niet lijken de prestaties negatief beïnvloeden, digitale pin 10 verbinden met zowel PC29 als PA28, digitale pin 4 verbinden van beide PC29 en PA28, hier uitschakelen uitschakelen PIOA #28 & 29 //timer instelling, verwijzen naar http://arduino.cc/en/Hacking/PinMappingSAM3X,
pmc_set_writeprotect(false); uitschakelen schrijf bescherming van Power Management Control registers
pmc_enable_periph_clk(ID_TC7); inschakelen van de teller van de tijd van de perifere klok 7
TC_Configure (/ * klok * / TC2, / * zender * / 1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); TC klok 42MHz (klok, kanaal, vergelijk modus instellen) TC_SetRC (TC2, 1, interval); TC_Start (TC2, 1);
Enable timer interrupts op de timer TC2 -> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS; IER = interrupt enable Registreer TC2 -> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS; IDR = onderbreken uitschakelen Registreer
NVIC_EnableIRQ(TC7_IRQn); Inschakelen van de interrupt in de geneste vector interrupt controller freq = 60; initialiseren van frequentie als voorinstelling voor 60Hz = 21; verhoging van de index array door 21 monsters = 256; uitvoer monsters 256/cyclus interval = 42000000/(freq*samples); Interrupt telt TC_SetRC (TC2, 1, interval); Start van de TC de Serial.begin(9600); voor test doel}
VOID checkFreq()
{freqNew = 20000;
Als (freq == freqNew) {} anders
{freq = freqNew;
Als (freq > 20000) {freq = 20000; / * max frequentie 20 kHz * /};
Als (freq < 1) {freq = 1; / * min frequentie 1 Hz * /};
Als (freq > 999) {vooraf ingestelde = 384; monsters = 14;} //for frequentie > = 1kHz, 14 monsters voor elke cyclus
anders als (freq > 499) {vooraf ingestelde = 84; monsters = 64;} //for 500 < = frequentie < 1000Hz, 64 monsters voor elke cyclus anders als (freq > 99) {vooraf ingestelde = 42; monsters = 128;} //for 100Hz < = frequentie < 500Hz, 128 monsters/cyclus
else {vooraf ingestelde = 21; monsters = 256;}; voor frequentie < 100hz, 256 monsters voor elke cyclus
interval = 42000000/(freq*samples); t = 0; TC_SetRC (TC2, 1, interval); } }
void loop {}
checkFreq(); delay(100); }
VOID TC7_Handler(void)
{TC_GetStatus(TC2,1);
t = t % monsters; gebruik avoild overloop van t phaseAInc monsters t % = (vooraf ingestelde * t) % 5376; % 5376 gebruiken om te voorkomen dat array index overloop
phaseBInc = (phaseAInc + 1792) % 5376;
phaseCInc = (phaseAInc + 3584) % 5376;
p_A = sin768 [phaseAInc] << 1; verwijzen naar PIOC: PC1 te PC8, corresponderende pin van de Arduino Due: pin 33-40, vandaar verschuiving links voor 1 cijfer
p_B = sin768 [phaseBInc] << 12; verwijzen naar PIOC: PC12 naar PC19, corresponderende pin van de Arduino Due: pin 51-44, vandaar verschuiving links 12 cijfers
p_C = sin768 [phaseCInc]; fase C medewerker PIOC uitgang: PC21, PC22, PC23, PC24, PC25, PC26, PC28 en PC29, corresponderende pin van de Arduino Due: digitale pin: 9,8,7,6,5,4,3,10, respectievelijk
p_C2 = (p_C & B11000000) << 22; Dit leidt tot PC28 en PC29
p_C3 = (p_C & B00111111) << 21; Dit genereert PC21-PC26 / / Serial.println(p_C3,BIN); p_C = p_C2|p_C3; Dit genereert parallelle uitvoer van fase C
p_A = p_A|p_B|p_C; 32 bit output = fase A (8 bits) |phase B|phase C //Serial.println (p_A >> 21, BIN); PIOC -> PIO_ODSR = 0x37E00000;
PIOC -> PIO_ODSR = p_A; uitgang register = p_A t ++; }