Anda dapat mengkonfigurasi Timer 1 untuk siklus pada 25 kHz dalam mode PWM fase yang benar, dan menggunakannya dua output pada pin 9 dan 10 seperti:
// 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
}
Menulis nilai 0 dengan analogWrite25k()
berarti pin akan selalu RENDAH, sedangkan 320 berarti selalu TINGGI. Biasa analogWrite()
harus hampir bekerja, tetapi itu akan menafsirkan 255 sama dengan 320 (yaitu selalu TINGGI).
Kode ini mengasumsikan Arduino Uno atau papan serupa (ATmega168 atau 328 @ 16 MHz). Metode yang digunakan di sini memerlukan timer 16-bit, dan karenanya menggunakan Timer 1 karena itu hanya satu-satunya yang tersedia di Uno; itu sebabnya hanya dua output yang tersedia. Metode ini dapat disesuaikan dengan papan berbasis AVR lainnya dengan timer 16-bit. Seperti yang dicatat Gerben, timer itu harus memiliki register ICRx yang sesuai. Ada 4 timer seperti itu di Arduino Mega, masing-masing dengan 3 output.