Étape 5: Code complet
#define _BV(x) (1 << (x)) ;
uint32_t sin768 [] PROGMEM = / * x = [0:5375] ; y = 127+127*(sin(2*pi/5376)) * /
uint32_t p_A, p_C, p_C2, p_B, p_C3 ; phase de phase A valeur de B de la phase C--bien que sortie sont 8bits, p_A et p_B valeur est exploité pour générer une nouvelle valeur de 32 bits afin de flic avec sortie de 32 bits PIOC
uint16_t phaseAInc, phaseBInc, phaseCInc, freq, freqNew ; intervalle d’uint32_t ; échantillons uint16_t, preset ; uint32_t t = 0 ;
void setup() {}
installation PIOC de sortie parallèle : Arduino Due pin33-40 sont employés comme phase A sortie tout en pin de travail 44-51 pour la sortie de la phase B
PIOC -> PIO_PER = 0xFFFFFFFE ; Contrôleur de PIO PIO permettent de Registre (voir p656 d’ATMEL SAM3X feuille de données) et http://arduino.cc/en/Hacking/PinMappingSAM3X, goupille de Arduino Due autorisés au 33-41 et 44-51
PIOC -> PIO_OER = 0xFFFFFFFE ; PIO contrôleur sortie activer le registre, consultez p657 d’ATMEL SAM3X fiche technique
PIOC -> PIO_OSR = 0xFFFFFFFE ; Statut de rendement de contrôleur PIO vous inscrire, consultez p658 d’ATMEL SAM3X fiche technique
PIOC -> PIO_OWER = 0xFFFFFFFE ; PIO sortie écriture permettent de Registre, reportez-vous à p670 d’ATMEL SAM3X fiche technique
PIOA -> PIO_PDR = 0x30000000 ; en option comme l’assurance, ne semble pas affecter les performances, broche numérique 10 brancher à la fois PC29 et PA28, broche numérique 4 se connecter à deux PC29 et PA28, ici pour désactiver désactiver PIOA #28 & 29 //timer installation, se référer à http://arduino.cc/en/Hacking/PinMappingSAM3X,
pmc_set_writeprotect(false) ; désactiver la protection en écriture des registres de contrôle de gestion de puissance
pmc_enable_periph_clk(ID_TC7) ; activer le compteur de temps horloge périphérique 7
TC_Configure (/ * horloge * / TC2, / * canal * / 1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1) ; TC horloge 42MHz (horloge, canal, réglage du mode de comparaison) TC_SetRC (TC2, 1, intervalle) ; TC_Start (TC2, 1) ;
interruptions de minuterie activer la minuterie TC2 -> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS ; IER = interrupt enable Registre TC2 -> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS ; IDR = Registre disable interruption
NVIC_EnableIRQ(TC7_IRQn) ; Activez l’interruption dans le vector imbriqué interrupt controller freq = 60 ; initialiser la fréquence comme préréglage de 60Hz = 21 ; augmentation de l’index de tableau de 21 échantillons = 256 ; intervalle de sortie échantillons 256/cycle = 42000000/(freq*samples) ; Interrupt comtes TC_SetRC (TC2, 1, intervalle) ; commencer Serial.begin(9600) TC ; à des fins de test}
Sub checkFreq()
{freqNew = 20000 ;
Si (freq == freqNew) {else}
{freq = freqNew ;
Si (freq > 20000) {freq = 20000; / * max fréquence 20 kHz * /} ;
Si (freq < 1) {freq = 1; / * min fréquence 1 Hz * /} ;
Si (freq > 999) {préréglée = 384 ; échantillons = 14;} //for fréquence > = 1kHz, 14 échantillons pour chaque cycle
ElseIf (freq > 499) {prédéfini = 84 ; échantillons = 64;} //for 500 < = fréquence < 1000Hz, 64 échantillons pour chaque cycle d’autre si (freq > 99) {préréglée = 42 ; échantillons = 128;} //for 100Hz < = fréquence < 500Hz, 128 échantillons/cycle
else {préréglée = 21 ; échantillons = 256;} ; pour la fréquence < 100hz, 256 échantillons pour chaque cycle
intervalle = 42000000/(freq*samples) ; t = 0 ; TC_SetRC (TC2, 1, intervalle) ; } }
void loop() {}
checkFreq() ; Delay(100) ; }
Sub TC7_Handler(void)
{TC_GetStatus(TC2,1) ;
t = t % échantillons ; utiliser des échantillons de % de t à débordement Evitez de phaseAInc t = (préréglée * t) % 5376 ; permet d’éviter le débordement d’indice de tableau % 5376
phaseBInc = (phaseAInc + 1792) % 5376 ;
phaseCInc = (phaseAInc + 3584) % 5376 ;
p_A = sin768 [phaseAInc] << 1 ; se référer à PIOC : PC1 à PC8, pin Arduino Due correspondant : broche 33-40, donc shift gauche pour 1 chiffre
p_B = sin768 [phaseBInc] << 12 ; se référer à PIOC : PC12 à PC19, pin Arduino Due correspondant : broche 51-44, c’est pourquoi shift gauche à 12 chiffres
p_C = sin768 [phaseCInc] ; tranche C sortie employe PIOC : PC21, PC22, PC23, PC24, PC25, PC26, PC28 et PC29, pin Arduino Due correspondant : broche numérique : 9,8,7,6,5,4,3,10, respectivement
p_C2 = (p_C & B11000000) << 22 ; Cette opération génère PC28 et PC29
p_C3 = (p_C & B00111111) << 21 ; Cette opération génère PC21-PC26 / / Serial.println(p_C3,BIN) ; p_C = p_C2|p_C3 ; Cela génère une sortie parallèle de la phase C
p_A = p_A|p_B|p_C ; sortie 32 bits = phase A (8 bits) |phase B|phase C //Serial.println (p_A >> 21, BIN) ; PIOC -> PIO_ODSR = 0x37E00000 ;
PIOC -> PIO_ODSR = p_A ; Registre de sortie = p_A t ++ ; }