Retardo de salida AVR PWM antes del inicio

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.

Ingrese la descripción de la imagen aquí

(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);
}
¿Puedes compartir el fragmento de código?
sí añadido, gracias! Un pin es el verde y el otro es la salida del temporizador.

Respuestas (1)

Deshabilitar el modo PWM de TIMER1 no detiene TCNTel conteo, solo detiene la salida del PWM.

Entonces, cuando deshabilita la salida usando CLR(TCCR1, PWM1A), TCNT1sigue contando alegremente y no se reinicia 0cuando llega, OCR1Cya que ya no está en modo PWM. Pasa justo por delante OCR1Cy seguirá contando hasta 255que se dé la vuelta.

El retraso que está viendo es el tiempo que se tarda TCNT1en contar desde donde quiera que esté cuando vuelve a habilitar el modo PWM OCR1C, momento en el que se restablecerá 0y 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 OCR1Aluego 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...

ingrese la descripción de la imagen aquí

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.

gracias. ¡Nunca habría notado que la comparación ocr1c también estaba deshabilitada!