位相補正PWMモードで25 kHzでサイクルするようにタイマー1を構成し、ピン9と10で2つの出力を使用することができます。
// 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()
と、ピンは常にLOWになりますが、320は常にHIGHを意味します。レギュラーanalogWrite()
はほぼ機能するはずですが、255は320と同じように解釈されます(つまり、常にHIGH)。
このコードは、Arduino Unoまたは同様のボード(ATmega168または328 @ 16 MHz)を想定しています。ここで使用する方法には16ビットタイマーが必要です。そのため、Unoで使用できるのはタイマー1だけなので、タイマー1を使用します。そのため、2つの出力しか使用できません。この方法は、16ビットタイマーを備えた他のAVRベースのボードに適応できます。Gerbenが述べたように、そのタイマーには対応するICRxレジスタが必要です。Arduino Megaには4つのタイマーがあり、それぞれに3つの出力があります。