Actualmente puedo configurar cuatro pines PWM a alrededor de 31 kHz con el siguiente código:
void setup()
{
TCCR1B = TCCR1B & B11111000 | B00000001; // Set PWM frequency for D9 & D10:
pinMode(pwmPin9, OUTPUT); // Sets the pin as output
pinMode(pwmPin10, OUTPUT); // Sets the pin as output
TCCR2B = TCCR2B & B11111000 | B00000001; // Set PWM for D3 & D11
pinMode(pwmPin3, OUTPUT); // Sets the pin as output
pinMode(pwmPin11, OUTPUT); // Sets the pin as output
}
Encontré esta configuración en alguna parte, pero no sé cómo puedo configurar estos cuatro pines PWM a alrededor de 25 kHz. ¿Cómo es eso posible?
Respuestas:
Estoy publicando esta segunda respuesta ya que me di cuenta de que es posible tener 4 canales PWM a 25 kHz con 161 pasos en un solo Arduino Uno. Esto implica cambiar la frecuencia del reloj principal a 8 MHz , lo que tiene algunos efectos secundarios ya que todo el programa se ejecutará la mitad de rápido. También implica la reconfiguración de los tres contadores de tiempo, lo que significa que pierden las funciones de temporización Arduino (
millis()
,micros()
,delay()
ydelayMicroseconds()
). Si estas compensaciones son aceptables, así es como funciona:A diferencia de la otra respuesta , esta no necesita una versión modificada de
analogWrite()
: la estándar funcionará bien. Solo se debe tener cuidado de que:analogWrite()
pines 6 u 11 no solo fallará en entregar una salida PWM, sino que también cambiará la frecuencia en el pin 5 o 3 respectivamente.fuente
Puede configurar el Temporizador 1 para realizar un ciclo a 25 kHz en el modo PWM de fase correcta, y usar sus dos salidas en los pines 9 y 10 de esta manera:
Escribir un valor de 0 con
analogWrite25k()
significa que el pin siempre será BAJO, mientras que 320 significa siempre ALTO. El regularanalogWrite()
debería casi funcionar, pero interpretará 255 igual que 320 (es decir, siempre ALTO).Este código supone una placa Arduino Uno o similar (ATmega168 o 328 @ 16 MHz). El método utilizado aquí requiere un temporizador de 16 bits y, por lo tanto, utiliza el temporizador 1, ya que es el único disponible en el Uno; Es por eso que solo hay dos salidas disponibles. El método podría adaptarse a otras placas basadas en AVR con un temporizador de 16 bits. Como señaló Gerben, ese temporizador debe tener un registro ICRx correspondiente. Hay 4 temporizadores de este tipo en el Arduino Mega, cada uno con 3 salidas.
fuente
ICRx
registro. Como máximo, solo puede tener un pin PWM por temporizador, para los temporizadores 0 y 2.COM4C1
enTCCR4A
? 2. Si ese no es el problema, lea ¿Cómo hago una buena pregunta? , luego actualice su pregunta incluyendo su código fuente completo e indicando claramente lo que espera que haga el programa y lo que hace en su lugar ("No veo ningún éxito" no se considera una declaración de problema válida).