위상 보정 PWM 모드에서 타이머 1을 25kHz로 순환하도록 타이머 1을 구성 할 수 있으며 핀 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과 동일하게 해석합니다 (즉, 항상 HIGH).
이 코드는 Arduino Uno 또는 이와 유사한 보드 (ATmega168 또는 328 @ 16 MHz)를 가정합니다. 여기에 사용 된 방법에는 16 비트 타이머가 필요하므로 Uno에서 유일하게 사용할 수있는 타이머 1을 사용합니다. 그렇기 때문에 두 개의 출력 만 사용할 수 있습니다. 이 방법은 16 비트 타이머를 사용하여 다른 AVR 기반 보드에 적용 할 수 있습니다. Gerben이 지적했듯이 타이머에는 해당 ICRx 레지스터가 있어야합니다. Arduino Mega에는 각각 3 개의 출력을 가진 4 개의 타이머가 있습니다.