TAMBIÉN VEA:
Rrecuencia en los pines PWM de Arduino en este caso para el UNO
Arduino Uno es uno de los tableros de desarrollo más utilizados en estos días. Se puede utilizar para casi cualquier aplicación. Una de esas aplicaciones es en circuitos de alta frecuencia.
"Hay una cierta frecuencia predeterminada para cada pin PWM, que se llama cuando se usa el comando analogWrite en ese pin. Y esta frecuencia predeterminada se puede cambiar a un valor tan alto como 65Khz y tan bajo como 30Hz usando solo un código de línea”.
Registro en cuestión TCCR2B para el caso de nuestro Ejemplo con PIN3
Aquí está la frecuencia predeterminada de cada pin PWM de Arduino UNO:
Frecuencia PWM para D3 y D11: 490.20 Hz (El DEFAULT)
Frecuencia PWM para D5 y D6: 976.56 Hz (El DEFAULT)
Frecuencia PWM para D9 y D10: 490.20 Hz (El DEFAULT)
Si requerimos pulsos de alta frecuencia. Uno de esos proyectos es un convertidor Buck. Entonces, para lograr una frecuencia más baja o más alta que la frecuencia predeterminada en los pines PWM, se puede usar un código de línea antes de inicializar el pin PWM, ya que la salida se muestra a continuación:
Frecuencia de PWM para pines D5 & D6
TCCR0B = TCCR0B & B11111000 | B00000001;
set timer 0 divisor to 1 for PWM frequency of 62500.00 Hz
TCCR0B = TCCR0B & B11111000 | B00000010;
set timer 0 divisor to 8 for PWM frequency of 7812.50 Hz
TCCR0B = TCCR0B & B11111000 | B00000011;
set timer 0 divisor to 64 for PWM frequency of 976.56 Hz (The DEFAULT)
TCCR0B = TCCR0B & B11111000 | B00000100;
set timer 0 divisor to 256 for PWM frequency of 244.14 Hz
TCCR0B = TCCR0B & B11111000 | B00000101;
set timer 0 divisor to 1024 for PWM frequency of 61.04 Hz
Frecuencia de PWM para pines D9 & D10
TCCR1B = TCCR1B & B11111000 | B00000001;
Set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz
TCCR1B = TCCR1B & B11111000 | B00000010;
set timer 1 divisor to 8 for PWM frequency of 3921.16 Hz
TCCR1B = TCCR1B & B11111000 | B00000011;
set timer 1 divisor to 64 for PWM frequency of 490.20 Hz (The DEFAULT)
TCCR1B = TCCR1B & B11111000 | B00000100;
set timer 1 divisor to 256 for PWM frequency of 122.55 Hz
TCCR1B = TCCR1B & B11111000 | B00000101;
set timer 1 divisor to 1024 for PWM frequency of 30.64 Hz
Frecuencia de PWM para pines D3 & D11
TCCR2B = TCCR2B & B11111000 | B00000001;
set timer 2 divisor to 1 for PWM frequency of 31372.55 Hz
TCCR2B = TCCR2B & B11111000 | B00000010;
set timer 2 divisor to 8 for PWM frequency of 3921.16 Hz
TCCR2B = TCCR2B & B11111000 | B00000011;
set timer 2 divisor to 32 for PWM frequency of 980.39 Hz
TCCR2B = TCCR2B & B11111000 | B00000100;
set timer 2 divisor to 64 for PWM frequency of 490.20 Hz (The DEFAULT)
TCCR2B = TCCR2B & B11111000 | B00000101;
set timer 2 divisor to 128 for PWM frequency of 245.10 Hz
TCCR2B = TCCR2B & B11111000 | B00000110;
set timer 2 divisor to 256 for PWM frequency of 122.55 Hz
TCCR2B = TCCR2B & B11111000 | B00000111;
set timer 2 divisor to 1024 for PWM frequency of 30.64 Hz
EJEMPLO:
Para mostrarle cómo cambia la frecuencia al aplicar el código anterior, se simula el circuito Arduino en Proteus:
Echa un vistazo a: Cómo agregar la biblioteca Arduino a Proteus y simular proyectos Arduino
Se seleccionan dos Arduino y se colocan en el Panel frontal
El pin digital 3 (pin PWM) de cada Arduino está conectado al osciloscopio
Se escriben dos programas separados para cada Arduino:
Programa A - Frecuencia por defecto en el Pin 3
void setup() {
pinMode(3,OUTPUT);
// ponga su código de configuración aquí, para ejecutar una vez:
}
void loop() {
analogWrite(3,155);
// pon tu código principal aquí, para ejecutar repetidamente:
}
Programa B - Frecuencia modificada en el Pin 3
void setup() {
TCCR2B = TCCR2B & B11111000 | B00000111; // for PWM frequency of 30.64 Hz
pinMode(3,OUTPUT);
// ponga su código de configuración aquí, para ejecutar una vez:
}
void loop() {
analogWrite(3,155);
// pon tu código principal aquí, para ejecutar repetidamente:
}
Programa C - Frecuencia modificada en el Pin 3
void setup() {
TCCR2B = TCCR2B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz
pinMode(3,OUTPUT);
// ponga su código de configuración aquí, para ejecutar una vez:
}
void loop() {
analogWrite(3,155);
// pon tu código principal aquí, para ejecutar repetidamente:
}
El archivo hex de los programas anteriores se entrega a Arduino.
Ejecutar simulación
Se puede ver claramente en el osciloscopio que la frecuencia es diferente y también tiene otro modo de jemplo de este modo:
Example: DC motor drive on the Arduino UNO, pins 5 and 6
For Fast PWM of 62.500 kHz (prescale factor of 1) Use these two lines in the setup function: TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00); TCCR0B = _BV(CS00); And modify the line in the wiring.c function in the Arduino program files hardware\arduino\cores\arduino\wiring.c : #define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(1 * 256)) For Phase-correct PWM of 31.250 kHz (prescale factor of 1) Use these two lines in the setup function: TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00); TCCR0B = _BV(CS00); And modify the line in the wiring.c function in the Arduino program files hardware\arduino\cores\arduino\wiring.c : #define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(1 * 510))
Más información sobre este artículo aquí https://playground.arduino.cc/Main/TimerPWMCheatsheet