Bạn có thể định cấu hình Timer 1 để quay vòng ở 25 kHz ở chế độ PWM đúng pha và sử dụng hai đầu ra trên các chân 9 và 10 như sau:
// 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
}
Viết giá trị bằng 0 có analogWrite25k()
nghĩa là pin sẽ luôn ở mức THẤP, trong khi 320 có nghĩa là luôn CAO. Thông thường analogWrite()
sẽ gần như hoạt động, nhưng nó sẽ diễn giải 255 giống như 320 (tức là luôn luôn CAO).
Mã này giả định một Arduino Uno hoặc bảng tương tự (ATmega168 hoặc 328 @ 16 MHz). Phương thức được sử dụng ở đây yêu cầu bộ định thời 16 bit và do đó, nó sử dụng Timer 1 vì đây là phương thức duy nhất có sẵn trên Uno; đó là lý do tại sao chỉ có hai đầu ra có sẵn. Phương pháp này có thể được điều chỉnh phù hợp với các bo mạch dựa trên AVR khác với bộ hẹn giờ 16 bit. Như Gerben đã lưu ý, bộ đếm thời gian đó nên có một thanh ghi ICRx tương ứng. Có 4 bộ tính giờ như vậy trên Arduino Mega, mỗi bộ có 3 đầu ra.