¿Cómo puedo manipular timer1 / timer2 en arduino nano para obtener HS PWM?

0

Soy nuevo en arduino pero he codificado algunos proyectos en AVR ASM hace años.

Ahora me gustaría manipular t1 / t2 para obtener pwm de alta velocidad. Puedo reducir la resolución de 511 (?) A 63. Y tal vez meterme con el prescaler. Sería bueno si millis () se dejan intactos. ¿Se puede hacer o tengo que salir del paraguas de arduino?

    
pregunta user247245

1 respuesta

1

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

    
respondido por el jms

Lea otras preguntas en las etiquetas