Paso 3: PWM código
El primer paso es crear la tabla de la onda. La tabla se guarda en la RAM del Atmega328 usando la biblioteca pgmspace. Cada tabla de la onda tiene 256 valores de 0 a 255, por lo que cada valor puede asignarse a un tipo de datos byte. A continuación se muestra la definición de onda sinusoidal. Cada valor es la amplitud de la onda en un momento específico. Esto representa un período de la onda. Cuanto mayor sea la frecuencia que se juega, más rápido los pasos de programa a través de la mesa.#include "avr/pgmspace.h"
Definiciones de la forma de onda
PROGMEM prog_uchar tabla de ondas [] = {}
onda de seno
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,
};
Para obtener el Arduino para crear la señal PWM, el temporizador debe ser inicializado correctamente. Para esto utilicé el método C para configurar el temporizador para que mejor puedo controlarlo. El temporizador se crea que tenemos una frecuencia de muestreo de 32 kHz para el audio y la salida de la señal se pone en 11 de Arduino. También habilitar una interrupción desbordamiento, por lo que cuando el valor del temporizador va más 255, provoca la interrupción.
void Setup_timer2() {}
TIMER2 Clock Prescaler para: 1
OSE (TCCR2B, CS20);
CBI (TCCR2B, CS21);
CBI (TCCR2B, CS22);
TIMER2 PWM modo PWM correcta fase
CBI (TCCR2A, COM2A0); claro comparar partido
OSE (TCCR2A, COM2A1);
OSE (TCCR2A, WGM20); Modo 1 trifásico PWM correcta
CBI (TCCR2A, WGM21);
CBI (TCCR2B, WGM22);
}
Se trata de la interrupción de desbordamiento. Cuando la interrupción ocurre calcular el siguiente valor que debe sacarse de la tabla de la onda y escribe ese valor al pin 11. Una variable llamada acumulador fase mantiene un seguimiento de dónde el programa está en la tabla.
ISR(TIMER2_OVF_vect)
{
phaccu = phaccu + tword_m; suave DDS, fase accu con 32 bits
icnt = phaccu >> 24; utilizar 8 bits superiores para fase accu como información de frecuencia
leer tabla valor de ROM seno fron y enviar a DAC PWM
OCR2A = pgm_read_byte_near (tabla de ondas + icnt + (waveSelect << 8));
Si (icnt1 ++ == 125) {/ / incrementar variable c4ms todos 4 milisegundos
c4ms ++;
icnt1 = 0;
}
}
Que valor se calcula usando una palabra tuning que se encuentra dividiendo la frecuencia que desea un reloj de referencia, en este caso la referencia 32kHz reloj.
const doble refclk = 31376.6; mide
tword_m = pow (2,32) * dfreq/refclk; calcular nuevo tuning palabra DDS