Ви можете налаштувати Таймер 1 для циклічного руху на 25 кГц у фазовому режимі ШІМ та використовувати два виходи на штифтах 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()
означає, що PIN-код буде завжди НИЗКОМ, тоді як 320 означає ВИСОКИЙ. Регулярний analogWrite()
повинен майже працювати, але він буде тлумачити 255 так само, як 320 (тобто завжди ВИСОКИЙ).
Цей код передбачає Arduino Uno або подібну плату (ATmega168 або 328 @ 16 МГц). Метод, який використовується тут, вимагає 16-бітного таймера, і тому він використовує Таймер 1, оскільки це єдиний доступний в Uno; тому доступні лише два виходи. Метод може бути адаптований до інших плат на основі AVR з 16-бітовим таймером. Як зазначив Гербен, цей таймер повинен мати відповідний регістр ICRx. У Arduino Mega є 4 таких таймера, кожен з яких має 3 виходи.