Сделать, чтобы 2 выходных контакта работали попеременно

Я задал ШИМ-выход на контакт (9) и хочу, чтобы на контакте (10) был высокий уровень, когда на контакте (9) низкий уровень, и на контакте (10), когда на контакте (9) высокий уровень. Итак, что я должен добавить в свой код?

, 👍2

Обсуждение

«Итак, что я должен добавить в свой код»? Умеете использовать if...else...?, @hcheung

Вас волнует, если на несколько микросекунд они одинаковы?, @Filip Franik

Это зависит от того, как вы добились ШИМ на контакте 9. AnalogWrite? Ручное управление таймером? Я бы установил один из таймеров для ШИМ (режим таймера 1 или 3) и заставил бы его вызывать прерывания (OCIExx). Затем в прерывании вы будете попеременно включать и выключать каждый контакт., @towe


2 ответа


0

будет работать что-то вроде следующего?

digitalWrite(9,  !digitalRead(10)); 

например: https://forum.arduino.cc/index.php?topic=128698.0

,

Ссылка, которую вы дали, установила конкретный контакт в качестве входа, но в моем случае я даю выход ШИМ с контакта 9, и я хочу, чтобы, когда на выходе контакта 9 низкий уровень, другой контакт был высоким, а когда контакт 9 снова становится высоким, поверните контакт 10 на низкий уровень. Но я не могу писать аналоговую запись и аналоговое чтение на одном и том же контакте 9., @Himanshu

похоже, что они предполагают, что вы можете, но также ниже на форуме есть также предложение попробовать и просто использовать скрипт, который устанавливает их как противоположности всякий раз, когда вы их устанавливаете. например. недействительным setLed (bool v) `{ цифровая запись (9, v); цифровая запись(10, !v); }`, @A. Coote


4

Вы можете настроить вывод 10 для работы в режиме инвертированного ШИМ и оставить контакт 9 в неинвертированном режиме по умолчанию. Контакт 9 — это «OC1A». контакт микроконтроллера AVR (выход сравнения Таймера 1, канал A), а контакт 10 — OC1B (канал B того же таймер). Инвертирование режима ШИМ канала B — это вопрос изменения один бит в одном из регистров управления Таймера 1:

TCCR1A |= _BV(COM1B0);

Вы можете сделать это один раз в setup(), настройка должна сохраниться. Тогда просто analogWrite() одинаковое значение для обоих контактов. Для некоторого фона о том, как все это работает, см. даташит на ATmega328P микроконтроллер (микроконтроллер в основе вашего Uno), особенно раздел 16 «16-битный таймер/счетчик 1 с ШИМ» и таблица 16-3 «Сравните режим вывода, коррекцию фазы и коррекцию фазы и частоты». ШИМ».

,