Étape 3: PWM Code
La première étape consiste à créer la table de la vague. La table est enregistrée dans la RAM Atmega328 à l’aide de la bibliothèque de pgmspace. Chaque table de la vague a 256 valeurs allant de 0 à 255, donc chaque valeur peut être mappé à un type de données byte. La définition de l’onde sinusoïdale est illustrée ci-dessous. Chaque valeur est l’amplitude de l’onde à un moment précis. Il s’agit d’une période de l’onde. Plus la fréquence qui est joué, plus vite les programmation des étapes à travers la table.#include « avr/pgmspace.h »
Définitions de forme d’onde
PROGMEM prog_uchar waveTable [] = {}
onde sinusoïdale
0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,
15,16,18,20,21,23,25,27,29,31,33,35,37,39,
42,44,46,49,51,54,56,59,62,64,67,70,73,76,
78,81,84,87,90,93,96,99,102,105,108,111,115,
118,121,124,127,130,133,136,139,143,146,149,
152,155,158,161,164,167,170,173,176,178,181,
184,187,190,192,195,198,200,203,205,208,210,
212,215,217,219,221,223,225,227,229,231,233,
234,236,238,239,240,242,243,244,245,247,248,
249,249,250,251,252,252,253,253,253,254,254,
254,254,254,254,254,253,253,253,252,252,251,
250,249,249,248,247,245,244,243,242,240,239,
238,236,234,233,231,229,227,225,223,221,219,
217,215,212,210,208,205,203,200,198,195,192,
190,187,184,181,178,176,173,170,167,164,161,
158,155,152,149,146,143,139,136,133,130,127,
124,121,118,115,111,108,105,102,99,96,93,90,
87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,
46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,
16,15,14,12,11,10,9,7,6,5,5,4, 3,2,2,1,1,1,0,0,0,
};
Pour obtenir l’Arduino pour créer le signal PWM, la minuterie doit être correctement initialisé. Pour cela j’ai utilisé la méthode C configurer le minuteur pour que je peux mieux contrôler. La minuterie est créée pour que nous avons un taux d’échantillonnage de 32 kHz pour notre audio et la sortie du signal est mises sur 11 de l’Arduino. J’ai également permettre une interruption de débordement, afin que lorsque la valeur de la minuterie va plus de 255, l’interruption déclenche.
void Setup_timer2() {}
Diviseur d’horloge TIMER2 pour: 1
SBI (TCCR2B, CS20) ;
CBI (TCCR2B, CS21) ;
CBI (TCCR2B, CS22) ;
TIMER2 PWM Mode de réglage de Phase PWM Correct
CBI (TCCR2A, COM2A0) ; effacer le Match comparer
SBI (TCCR2A, COM2A1) ;
SBI (TCCR2A, WGM20) ; Mode 1 / Phase PWM Correct
CBI (TCCR2A, WGM21) ;
CBI (TCCR2B, WGM22) ;
}
Il s’agit de l’interruption de dépassement de capacité. Lorsque l’interruption survient je calcule la valeur suivante qui doit être extraites de la table d’ondes et écrire cette valeur dans la broche 11. Une variable appelée l’accumulateur de phase assure le suivi de dont le programme est dans le tableau.
ISR(TIMER2_OVF_vect)
{
phaccu = phaccu + tword_m ; DDS douces, phase accu avec 32 bits
icnt = phaccu >> 24 ; utiliser supérieures 8 bits pour accu de phase comme information de fréquence
lire la valeur table ROM sinus fron et envoyer à PWM DAC
OCR2A = pgm_read_byte_near (waveTable + icnt + (waveSelect << 8)) ;
Si (icnt1 ++ == 125) {/ / incrémenter la variable c4ms tous les 4 millisecondes
c4ms ++ ;
icnt1 = 0 ;
}
}
Que valeur est calculée à l’aide d’un mot de réglage qui se trouve en divisant la fréquence souhaitée par une horloge de référence, dans ce cas la référence 32kHz horloge.
const double refclk = 31376.6 ; mesurée
tword_m = pow (2,32) * dfreq/refclk ; calculer le nouveau réglage mot DDS