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()
.