¿Qué frecuencia usan los Arduinos para PWM normal cuando usas analogWrite ()?
Y ¿Es diferente para diferentes modelos de Arduino? Estoy interesado específicamente en el Mega 2560, pero también quiero saber si es consistente entre modelos.
He visto referencias pasajeras al Arduino usando 500 Hz, lo que parece muy lento.
Comentarios
- Eso también depende del pin que estés usando.
Responder
La señal PWM es generada por temporizadores en los chips AVR. Cada temporizador puede generar una señal PWM en dos o tres pines diferentes. Cada pin puede tener su propio ciclo de trabajo, pero comparten la frecuencia PWM. Puede cambiar la frecuencia del PWM cambiando la fuente de reloj de los temporizadores. Por defecto, usan el reloj de la CPU dividido por 64, es decir. tienen su prescaler configurado en 64 por el código de inicialización de Arduino. Para confundir más las cosas, hay dos modos PWM diferentes: PWM rápido y PWM de fase correcta. En PWM rápido, el temporizador cuenta hasta 255, luego se desborda y comienza de nuevo desde 0 (256 estados diferentes). En PWM de fase correcta, el temporizador cuenta hasta 255, luego cambia de dirección y cuenta hacia abajo hasta cero, cambia de dirección, etc. (510 estados diferentes).
El Arduino Mega tiene 5 temporizadores, timer0 – timer4. Debido a que timer0 también se usa para las funciones millis y micros, usa PWM rápido, mientras que los otros temporizadores están configurados para PWM de fase correcta. Esto da como resultado diferentes frecuencias en diferentes pines:
-
Pin 4 y 13, controlados por timer0:
16 Mhz / 64/256 = 976,56 Hz -
Otros pines PWM, controlados por timer1-4:
16 Mhz / 64/510 = 490.20 Hz
El cálculo es: Reloj / Número de estados del modo Prescaler / PWM
La situación es la misma para todas las demás placas Arduino que conozco, excepto que tienen menos temporizadores que se conectan a diferentes pines.
Puede cambiar el Frecuencia PWM cambiando el preescalador del temporizador. Vea esta página: http://playground.arduino.cc/Main/TimerPWMCheatsheet
También es posible hacer que los temporizadores cuenten hasta un valor diferente de 255. En los temporizadores de 8 bits perderá un pin de salida, pero en los temporizadores de 16 bits puede utilizar el registro de captura de entrada para definir un valor TOP. La funcionalidad de captura de entrada es una característica que rara vez se usa en la comunidad de Arduino, por lo que probablemente no la perderá.
Las bibliotecas de Arduino solo le permiten usar una resolución de 8 bits, incluso en los temporizadores de 16 bits. Si desea una resolución más alta, tendrá que escribir su propia escritura analógica o utilizar una biblioteca hecha para ese propósito. En el Arduino Mega timer0 y timer2 son de 8 bits, mientras que el resto son de 16 bits.
Al cambiar el modo de los temporizadores de 16 bits para hacer uso de la resolución completa, en combinación con el cambio del preescalador y el valor TOP, puede lograr un rango muy amplio de frecuencias PWM.
La frecuencia máxima que puede lograr es reloj / 4, configurando el preescalador en 1 y TOP en 3 en el modo PWM rápido; no se permite un valor más bajo. Esto le dará un PWM de 4 MHz con una resolución de 2 bits. Puede estar en 0%, 25%, 50% o 75% del tiempo. Un valor TOP más alto le dará una resolución más alta a una frecuencia más baja.
Para una explicación más larga, lea este artículo o consulte el hoja de datos .
Cambiar el preescaler, el modo PWM o el valor TOP para timer0 provocará problemas con millis()
y micros()
.
Comentarios
- Entiendo, entonces, que la frecuencia más rápida que puede obtener para PWM es 16Mhz / 256 (prescaler = 1), o 62.5Khz?
- Y además, ¿la frecuencia PWM tiene que ser un factor par de 62.5KHz? Alguien en otro hilo quería controlar la velocidad del ventilador de un ventilador de PC de 4 pines. Aparentemente quiere una señal de control PWM de 25KHz. 62.5 / 25 es 2.5, que no es un valor entero.
- Actualicé la respuesta para elaborar más sobre las posibilidades de lograr frecuencias específicas,
- En el extremo de baja frecuencia, podría preescala un temporizador de 16 bits en modo de corrección de fase mediante un preescalador de 1024 para obtener 16e6 / 1024/2 ^ 16/2 = 0.119Hz, o 7.1 ciclos / minuto. Para menores que eso, uno necesitaría alternar los bits basándose en algo como millis (). ¿O tal vez activar el contador en el pin de entrada externo T ?.