Você pode configurar o Timer 1 para pedalar a 25 kHz no modo PWM de fase correta e usar suas duas saídas nos pinos 9 e 10 da seguinte maneira:
// 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
}
Escrever um valor de 0 com analogWrite25k()
significa que o pino será sempre BAIXO, enquanto 320 significa sempre ALTO. O regular analogWrite()
deve quase funcionar, mas interpretará 255 o mesmo que 320 (ou seja, sempre ALTO).
Este código pressupõe uma placa Arduino Uno ou similar (ATmega168 ou 328 a 16 MHz). O método usado aqui requer um timer de 16 bits e, portanto, usa o Timer 1, pois é o único disponível no Uno; é por isso que apenas duas saídas estão disponíveis. O método pode ser adaptado a outras placas baseadas em AVR com um temporizador de 16 bits. Como Gerben observou, esse timer deve ter um registro ICRx correspondente. Existem 4 desses temporizadores no Arduino Mega, cada um com 3 saídas.