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;
}