Recientemente necesité establecer la frecuencia PWM de Arduino a 20KHz, con la capacidad de cambiar la cuadratura (relación entre el período de repetición del pulso y la duración del mismo). Quería hacerlo sin usar las bibliotecas – ajustes del contador de tiempo.
Decidí compartirlo, por si alguien lo necesita.
El código en sí mismo:
cli(); //disconnect interrupts // Non-inverse output mode TCCR1A|=(1<<COM1A1); //1 TCCR1A&=~(1<<COM1A0); //0 // shear mode with exact phase and frequency TCCR1A&=~(1<<WGM10); //0 TCCR1A&=~(1<<WGM11); //0 TCCR1B&=~(1<<WGM12); //0 TCCR1B|=(1<<WGM13); //1 // Dividend 8 TCCR1B|=(1<<CS11); //1 TCCR1B&=~((1<<CS10)|(1<<CS12)); //0 0 OCR1A =25; // 50% pulse duration ICR1=50; // 20kHz sei(); // interrupt resolution
El código debes añadirlo a la configuración. Setup timer – contador 1, sólo el canal A, por lo tanto la señal requerida estará sólo en la clavija D9.
La frecuencia se ajusta por el valor en el registro ICR1. A continuación encontrará los valores probados y su correspondiente frecuencia.
ICR1=10; // 100 kHz
ICR1=20; // 50 kHz
ICR1=30; // 33 kHz
ICR1=40; // 25 kHz
ICR1=50; // 20 kHz
ICR1=60; // 16.6 kHz
ICR1=70; // 14.3 kHz
ICR1=80; // 12.5 kHz
ICR1=90; // 11.1 kHz
ICR1=100; // 10 kHz
Si se cambia la preselección, las frecuencias serán diferentes, por ejemplo, con la preselección 64 y ICR1=50, la frecuencia será de 2,5 kHz.
El cociente se controla por el valor en el registro OCR1A, depende del valor en ICR1, de modo que el valor máximo de OCR1A es igual al valor en ICR1, si son iguales a una señal constante. Si OCR1A = ICR1 / 2, se obtiene el meandro (la duración del pulso y la longitud de la pausa entre los pulsos son iguales). Otro ejemplo: Con ICR1 = 50 (20kHz) y OCR1A = 10, la longitud del pulso es del 20%.
Se puede cambiar el valor de OCR1A en el bucle y el factor de carga cambiará en consecuencia.
Probado en Proteus, y luego ejecutado en Arduino Nano, todo funciona.
P.D. Si alguien mas sabe cómo cambiar la frecuencia de la PWM y el factor de carga, especialmente en el temporizador de tiempo 2, se agradecería la ayuda.