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:
// PWM output @ 25 kHz, only on pins 9 and 10.
// Output value should be between 0 and 320, inclusive.
void analogWrite25k(int pin, int value)
{
switch (pin) {
case 9:
OCR1A = value;
break;
case 10:
OCR1B = value;
break;
default:
// no other pin will work
break;
}
}
void setup()
{
// Configure Timer 1 for PWM @ 25 kHz.
TCCR1A = 0; // undo the configuration done by...
TCCR1B = 0; // ...the Arduino core library
TCNT1 = 0; // reset timer
TCCR1A = _BV(COM1A1) // non-inverted PWM on ch. A
| _BV(COM1B1) // same on ch; B
| _BV(WGM11); // mode 10: ph. correct PWM, TOP = ICR1
TCCR1B = _BV(WGM13) // ditto
| _BV(CS10); // prescaler = 1
ICR1 = 320; // TOP = 320
// Set the PWM pins as output.
pinMode( 9, OUTPUT);
pinMode(10, OUTPUT);
}
void loop()
{
// Just an example:
analogWrite25k( 9, 110);
analogWrite25k(10, 210);
for (;;) ; // infinite loop
}
Escribir un valor de 0 con analogWrite25k()
significa que el pin siempre será BAJO, mientras que 320 significa siempre ALTO. El regular analogWrite()
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.