Supongo que "un arduino" se refiere a un tablero de arduino basado en ATmega328.
El arduino inicializa el temporizador 0 para mantener la cuenta de los microsegundos / milisegundos transcurridos, lo que nos permite usar el temporizador 1 y el temporizador 2 como nos plazca.
Ya que preguntó si la resolución se puede establecer en 511, tenemos que usar el temporizador 1 de 16 bits que puede contar de 0 a 65535 (en realidad 65536 pasos, no 65535 como parece implicar su pensamiento). El temporizador 2 es un temporizador de 8 bits, por lo que solo puede contar de 0 a 255 (256 pasos). Puede configurar cualquier temporizador para reiniciar el conteo en cualquier valor arbitrario.
//the timer outputs have to be set explicitly as outputs
pinMode(9, OUTPUT);
//pinMode(10, OUTPUT);
TCCR1B = (1 << WGM13) | (1 << WGM12);//waveform generation mode 1110: fast (single
TCCR1A = (1 << WGM11) | (0 << WGM10) //..slope) PWM, counter TOP (resolution) = 1 + ICR1
| (0b10 << COM1A0) //output compare A PWM output enabled, non-inverting (pin ~9)
| (0b00 << COM1B0); //output compare B output disabled (pin ~10)
TCNT1 = 0; //reset the current count to 0, just in case
ICR1 = 510; //set the timer TOP value (resolution to 510 + 1)
OCR1A = 0; //set the output compare unit A duty cycle to 0
//OCR1B = 0; //set the output compare unit B duty cycle to 0.
//Finally start the timer by selecting a clock sourve
TCCR1B |= (0b001 << CS10); //timer 1 clock source = CLKio / 1 (no prescaling), 16 MHz
En esta configuración, el temporizador está en modo PWM rápido. El temporizador cuenta desde 0. Después de que el valor del contador coincida con TOP (ICR1 en esta configuración), el siguiente ciclo configurará el temporizador en 0 en lugar de incrementarlo.
La configuración actual produciría una salida PWM de 31311.15 kHz. Si desea una frecuencia más baja, podría configurar el prescaler en un valor más alto, pero disminuiría la resolución. Tiene más sentido simplemente aumentar el valor TOP. Por ejemplo, ICR1 = 15999
produciría una salida de 1 kHz con una resolución de 16000 pasos, sin que sea necesario realizar un preescalado.
El ciclo de trabajo de salida está controlado por los respectivos registros de comparación de salida. El valor puede oscilar entre 0 y TOP (inclusive), pero al subir, la salida nunca se restablecerá. Por ejemplo, para generar un ciclo de trabajo del 10% a 20 kHz, debe establecer ICR1
en 799 y OCR1A
en 80.
Para obtener información más detallada, consulte hoja de datos