Как получить 2 ШИМ-вывода с обратным битовым диапазоном при 25 кГц на Nano?

Мне нужны 2 ШИМ-вывода для колебаний на частоте 25 кГц, но они должны колебаться обратно пропорционально друг другу. Когда один высокий, другой должен быть низким, и наоборот.

Я хочу сделать это с помощью Нано.

, 👍3

Обсуждение

используйте один вывод и инвертируйте его с помощью аппаратного обеспечения, @jsotola

Используйте два таймера с одинаковыми настройками, запущенные одновременно., @towe

@towe: Как вы запускаете их одновременно?, @Edgar Bonet

@EdgarBonet Установил свой выбор часов сразу после друг друга, разница должна составлять всего пару тактов., @towe


1 ответ


Лучший ответ:

8

Существуют различные решения. Я предлагаю использовать два канала ШИМ, управляемых одним таймером. Таким образом, вам не придется беспокоиться о синхронизации двух таймеров. Вы можете настроить каналы одинаково, за исключением того, что один из них будет находиться в “неинвертирующем” режиме ШИМ, в то время как другой будет находиться в режиме “инвертирования”.

Вот как я бы это сделал: используйте таймер 1 для управления контактами 9 (PB1, OC1A) и 10 (PB2, OC1B) в режиме быстрой ШИМ.

void setup() {
    // Configure Timer 1 for complementary PWM @ 25 kHz.
    DDRB  |= _BV(PB1);    // set pin 9 = PB1 = OC1A as output
    DDRB  |= _BV(PB2);    // set pin 10 = PB2 = OC1B as output
    TCCR1A = 0;           // undo the Arduino timer initialization
    TCCR1B = 0;           // ditto
    ICR1   = 640 - 1;     // period = 640 CPU cycles = 40 us
    OCR1A  = 320 - 1;     // OC1A HIGH for 320 CPU cycles = 20 us
    OCR1B  = 320 - 1;     // OC1B LOW for 320 CPU cycles = 20 us
    TCCR1A = _BV(COM1A1)  // non-inverting PWM on OC1A
           | _BV(COM1B0)  // inverting PWM on OC1B
           | _BV(COM1B1)  // ditto
           | _BV(WGM11);  // fast PWM, TOP = ICR1
    TCCR1B = _BV(WGM12)   // ditto
           | _BV(WGM13)   // ditto
           | _BV(CS10);   // clock at F_CPU
}
,

Ах, это то, что я имел в виду в первую очередь, но меня раздражал второй режим вывода сравнения, который вел себя по-разному для OC1A и OC1B, и я думал, что они привязаны друг к другу. +1, @towe

Это прекрасно работает. Я не мог бы и мечтать о более простом и точном решении !!!, @Curtis