คุณสามารถกำหนดค่าตัวจับเวลา 1 เพื่อวนที่ 25 kHz ในโหมด PWM ที่ถูกต้องในเฟสและใช้เอาต์พุตสองตัวบนพิน 9 และ 10 ดังนี้:
// 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
}
การเขียนค่า 0 ด้วยanalogWrite25k()
หมายความว่าหมุดจะต่ำเสมอในขณะที่ 320 หมายถึงสูงเสมอ ปกติanalogWrite()
ควรเกือบทำงาน แต่มันจะตีความ 255 เช่นเดียวกับ 320 (เช่นเสมอสูง)
รหัสนี้จะถือว่า Arduino Uno หรือบอร์ดที่คล้ายกัน (ATmega168 หรือ 328 @ 16 MHz) วิธีที่ใช้ในที่นี้ต้องใช้ตัวจับเวลา 16 บิตและดังนั้นจึงใช้ตัวจับเวลา 1 เนื่องจากเป็นตัวเดียวที่มีอยู่ใน Uno นั่นเป็นเหตุผลที่มีเพียงสองเอาต์พุต วิธีนี้สามารถนำไปปรับใช้กับบอร์ด AVR ที่ใช้ตัวจับเวลา 16 บิตได้ ตามที่ Gerben ตั้งข้อสังเกตว่าตัวจับเวลานั้นควรมีการลงทะเบียน ICRx ที่เกี่ยวข้อง มีตัวจับเวลาดังกล่าว 4 ตัวบน Arduino Mega แต่ละตัวมีเอาต์พุต 3 ตัว