Attiny4 - Posibles erratas encontradas con PWM

0

He buscado en la hoja de datos de AtTiny y no he encontrado nada sobre esto. Estoy experimentando un error PWM extraño. Cuando espero el 100% de lo que estoy recibiendo menos. Estoy usando un esquema PWM invertido, por lo que establecerlo en 0 debe estar completo, pero mi alcance muestra un ~ 95% de pulso de servicio.

A continuación, publiqué el código de configuración aplicable, luego la función a la que llamo ocasionalmente en mi main () para cambiar la frecuencia de PWM ... Cuando configuro el OCR0B = 0, no obtengo un PWM completo.

También observaré que todas las demás configuraciones de PWM parecen funcionar correctamente, el ciclo de trabajo coincide con lo que se espera.

¿Alguien quiere echar un vistazo para comprobar que estoy cuerdo antes de quejarme a Microchip / Atmel?

//Setup Pins:
DDRB =  DDRB |  0b00000010;     //set B1 output and B2 to input.
PUEB = PUEB |   0b00000100;     //Pullup on B2

//Setup Timer:
//output pin is OC0B (PB1)
//Set PWM Fast Mode 8 Bit, enable output on all PWM pins (only 1 on tiny5).
TCCR0A = 1<<COM0A1 | 1<<COM0B1 | 1<<COM0A0 | 1<<COM0B0 | 1<<WGM01;  //COM0A0 COM0B0 set to 1 for inverting PWM.
//Set PWM top [ICR0] to 5bit (this allows effective 31khz pwm)
ICR0 = TOP_PWM; //Set TOP...
//Set PWM Mode Fast 8 bit & No pre-scaler.
TCCR0B =  1<<CS00 | 1<<WGM02 | 1<<WGM03;
OCR0B = TOP_PWM; //Start with 0 output.

//Setup INO0 (External Interrupt):
EICRA = 1<<ISC00 | 1<<ISC01;    //Enable rising edge interrupt
EIMSK = 1<<INT0;                //Enable INT0

 ----------------------------------------------------------------

/******************************************
* Function to decide what speed to set.
* NOTE: All alterations to motor speed should
*       be done in this function!
* Also note that inverse PWM is used,
* so 0 is full speed, and TOP_PWM is stopped.
******************************************/
void speedLogic()
{
    //Speed logic
    if      (speed_state == 0)
        speed = TOP_PWM;//Off
    else if (speed_state == 1)
        speed = 24;     //Slow
    else if (speed_state == 2)
        speed = 16;     //Med
    else if (speed_state == 3)
        speed = 0;      //Fast (3=91% Otherwise 0=100%)
    else
        speed = TOP_PWM;

    //Set PWM Reg
    OCR0B = speed;

    //Increment State Variable
    speed_state++;
    if (speed_state > 3)
        speed_state = 0;
}
    
pregunta MadHatter

1 respuesta

2

Creo que es una característica, no un error. Citado en el hoja de datos < a> (página 94):

  

Los valores extremos para los registros OCR0x representan casos especiales   cuando se genera una salida de forma de onda PWM en el modo PWM rápido. Si el   OCR0x se establece igual a BOTTOM (0x0000) la salida será estrecha   pico para cada TOP + 1 temporizador ciclo de reloj. Ajustando el OCR0x igual a TOP   dará como resultado una salida alta o baja constante (dependiendo de la   polaridad de la salida controlada por COM0x [1: 0]).

Esto describe tu observación bastante bien. Con PWM de 5 bits (32 pasos, ¿no?) El ciclo de trabajo debe ser del 97% (no del 95%), pero probablemente sea lo suficientemente bueno para aproximadamente .

    
respondido por el Martin

Lea otras preguntas en las etiquetas