¿Cuál es la frecuencia de salida PWM en Arduino?

22

¿Qué frecuencia usan Arduinos para PWM normal cuando usas analogWrite ()?

¿Y es diferente para un modelo Arduino diferente? Estoy interesado específicamente en el Mega 2560, pero también quiero saber si es consistente entre los modelos.

He visto referencias pasajeras al Arduino usando 500 Hz, lo que parece muy lento.

Duncan C
fuente
Eso también depende del pin que estés usando.
Gerben

Respuestas:

31

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 del reloj para los temporizadores. Por defecto utilizan el reloj de la CPU dividido por 64, es decir. tienen su preescalador establecido 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 la fase correcta PWM, el temporizador cuenta hasta 255, luego cambia de dirección y cuenta hacia abajo a 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, controlado por temporizador0:
    16 Mhz / 64/256 = 976.56 Hz

  • Otros pines PWM, controlados por temporizador 1-4:
    16 Mhz / 64/510 = 490.20 Hz

El cálculo es: número de estados de reloj / preescalador / modo PWM

La situación es la misma para todas las otras placas Arduino que conozco, excepto que tienen menos temporizadores que se conectan a diferentes pines.

Puede cambiar la frecuencia PWM cambiando el preescalador del temporizador. Ver esta página: http://playground.arduino.cc/Main/TimerPWMCheatsheet

También es posible hacer que los temporizadores cuenten con un valor diferente a 255. En los temporizadores de 8 bits, perderá un pin de salida, pero en los temporizadores de 16 bits puede usar el Registro de captura de entrada para definir un valor SUPERIOR. La funcionalidad de captura de entrada es una característica que rara vez se usa en la comunidad Arduino, por lo que es probable que no se la pierda.

Las bibliotecas 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 analogWrite o utilizar una biblioteca creada para tal fin. 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 utilizar 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 clock / 4, configurando el preescalador en 1 y TOP en 3 en modo PWM rápido; no se permite un valor más bajo. Esto le dará un PWM de 4 MHz con 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 la hoja de datos .

Cambiar el preescalador, el modo PWM o el valor SUPERIOR para el temporizador0 interferirá con millis()y micros().

usuario2973
fuente
1
Supongo, entonces, que la frecuencia más rápida que podría obtener para PWM es 16Mhz / 256 (preescaler = 1), o 62.5Khz?
Duncan C
¿Y además que 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.
Duncan C
Actualicé la respuesta para elaborar más sobre las posibilidades de lograr frecuencias específicas,
user2973
En el extremo de baja frecuencia, puede preescalar un temporizador de 16 bits en modo de corrección de fase con un preescalador 1024 para obtener 16e6 / 1024/2 ^ 16/2 = 0.119Hz, o 7.1 ciclos / minuto. Por debajo de eso, uno necesitaría alternar los bits basados ​​en algo como millis (). ¿O tal vez disparar el contador en el pin de entrada externo T ?.
Dave X