AVR PWM retardo de salida antes del inicio

2

Estoy usando un ATtiny85 para generar una salida PWM (usando Timer0 en modo OCR), y esto La salida PWM se enciende y apaga a intervalos regulares. Estoy encontrando que cuando se enciende 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 (activado o desactivado a través de TCCR1) y, sin embargo, hay un retraso de lo que parece un ciclo completo antes de que comience. También he intentado 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);
}
    
pregunta user3780104

1 respuesta

2

La desactivación del modo PWM de TIMER1 no detiene el conteo de TCNT - solo detiene la salida del PWM.

Entonces, cuando deshabilitas la salida usando CLR(TCCR1, PWM1A) , TCNT1 continúa contando alegremente y no se restablece a 0 cuando llega a OCR1C ya que ya no está en el modo PWM . Se ejecuta justo después de OCR1C y seguirá contando hasta 255 cuando se reinicie.

El retraso que está viendo es el tiempo que tarda TCNT1 en contar desde donde se encuentre cuando se habilita el modo PWM nuevamente en OCR1C , momento en el cual se restablecerá a 0 y comenzará a hacer Ciclo normal de PWM.

Una forma de controlar cuándo comienza el ciclo de PWM después de habilitar el modo de PWM es precargar el contador para que no tenga que hacer una vuelta antes de iniciar los puntos de comparación de PWM normales en OCR1A y luego en 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 maneras de controlar la señal PWM que sería más sencilla, pero la mejor opción dependería de su aplicación.

    
respondido por el bigjosh

Lea otras preguntas en las etiquetas