Вы можете настроить таймер 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()
означает, что вывод будет всегда НИЗКИМ, тогда как 320 означает всегда ВЫСОКИЙ. Регулярное число analogWrite()
должно почти работать, но оно будет интерпретировать 255 так же, как 320 (то есть всегда ВЫСОКОЕ).
Этот код предполагает использование Arduino Uno или аналогичной платы (ATmega168 или 328 @ 16 МГц). Используемый здесь метод требует 16-битного таймера, и, таким образом, он использует таймер 1, поскольку это единственный доступный на Uno; поэтому доступны только два выхода. Метод может быть адаптирован для других плат на базе AVR с 16-битным таймером. Как отметил Гербен, этот таймер должен иметь соответствующий регистр ICRx. На Arduino Mega есть 4 таких таймера, каждый с 3 выходами.