Estoy usando un ATtiny85 para generar una salida PWM (usando Timer0 en modo OCR), y esta salida PWM se activa y desactiva a intervalos regulares. Descubro que cuando enciendo la salida PWM, hay un retraso antes de que realmente comience a emitir.
Mire la captura de pantalla a continuación, la línea verde muestra el estado en el que estoy poniendo el PWM (ya sea encendido o apagado a través de TCCR1) y, sin embargo, hay un retraso de lo que parece ser un ciclo completo antes de que comience. También intenté restablecer TCNT0 a 0, pero esto no tuvo ningún efecto.
(La base de tiempo es 20 µs.)
SET(DDRB, PB1);
SET(DDRB, PB2);
// Set up PWM for 460 kHz with 8 MHz clock
TCCR1 = (1<<PWM1A) | (1<<COM1A1) | (1<<COM1A0) | (1<<CS10); // Prescaler = none;
GTCCR = (1<<FOC1A);
OCR1A = 9; // 460.750 kHz
OCR1C = 18;
#define BIT_DELAY ((1000000/38400))
while(1) {
SET(TCCR1, PWM1A);
SET(PORTB, PB2);
_delay_us(BIT_DELAY);
CLR(TCCR1, PWM1A);
CLR(PORTB, PB2);
_delay_us(BIT_DELAY);
}
Deshabilitar el modo PWM de TIMER1 no detiene TCNT
el conteo, solo detiene la salida del PWM.
Entonces, cuando deshabilita la salida usando CLR(TCCR1, PWM1A)
, TCNT1
sigue contando alegremente y no se reinicia 0
cuando llega, OCR1C
ya que ya no está en modo PWM. Pasa justo por delante OCR1C
y seguirá contando hasta 255
que se dé la vuelta.
El retraso que está viendo es el tiempo que se tarda TCNT1
en contar desde donde quiera que esté cuando vuelve a habilitar el modo PWM OCR1C
, momento en el que se restablecerá 0
y comenzará a hacer un ciclo PWM normal.
Una forma de controlar cuándo comienza el ciclo PWM después de habilitar el modo PWM es precargar el contador de modo que no tenga que hacer un ajuste antes de iniciar los puntos de comparación PWM normales en y OCR1A
luego OCR1C
. Por ejemplo...
while(1) {
TCNT1=254;
SET(TCCR1, PWM1A);
SET(PORTB, PB2);
_delay_us(BIT_DELAY);
CLR(TCCR1, PWM1A);
CLR(PORTB, PB2);
_delay_us(BIT_DELAY);
}
... genera esta forma de onda...
Tenga en cuenta que este enfoque me parece un truco y que probablemente haya mejores formas de activar la señal PWM que serían más sencillas, pero la mejor opción dependerá de su aplicación.
anishkumar
usuario3780104