He estado experimentando con los modos de generación de forma de onda PWM en el ATMega328P. He estado obteniendo algunos resultados extraños y no puedo entender si es un problema con la forma en que escribo el firmware o cómo interpreto el hoja de datos .
Aquí está el primer fragmento de código que escribí para emular la función analogWrite ():
// Waveform Generation Mode 0
// Table 15-4 of the datasheet
void setup()
{
DDRB = (1<<PB1); // set pin 9 as output
TCCR1A |= (1<<COM1A1);
OCR1A = 125;
}
void loop()
{
}
El código anterior produce una salida de voltaje promedio de alrededor de 2.5V (ciclo de trabajo del 49%) fuera del pin 9. Lo extraño (para mí) es que, según la hoja de datos, TIMER1 es un temporizador de 16 bits, por lo que debe desbordarse a 65536 garrapatas. Por lo que entiendo, configurar OCR1A entre 0 y 65535 cambiará el ciclo de trabajo del pulso. Entonces, habiendo establecido el OCR1A en 125, ¿no debería estar obteniendo una salida de alrededor de 0.01 V en lugar de 2.5V? Los resultados parecen implicar que el reloj se está desbordando en 255.
Para mi segunda incursión en tierra PWM, quise intentar crear una señal de 2.5V usando el modo rápido PWM de ATMega. Esto es lo que obtuve:
// Waveform Generation Mode 14
// Table 15-4 of the datasheet
void setup()
{
DDRB = (1<<PB1);
TCCR1A |= (1<<COM1A1) | (1<<WGM11);
TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS10);
ICR1 = 19999;
OCR1A = 10000;
}
void loop()
{
}
Establecí ICR1 (el valor de desbordamiento) arbitrariamente en 20000 tics, luego establecí OCR1A (el valor de comparación) en aproximadamente la mitad. Establecí el canal A en modo no inversor, pero (creo) no habría hecho una diferencia si lo configurara en modo inversor. Cuando envié esto al Arduino, obtuve un promedio de voltaje constante de 5V (100% de ciclo de trabajo) del pin 9, y no puedo por la vida de mí averiguar por qué.
Apreciaría cualquier información que pueda ofrecer.