Сделать, чтобы 2 выходных контакта работали попеременно
Я задал ШИМ-выход на контакт (9) и хочу, чтобы на контакте (10) был высокий уровень, когда на контакте (9) низкий уровень, и на контакте (10), когда на контакте (9) высокий уровень. Итак, что я должен добавить в свой код?
@Himanshu, 👍2
Обсуждение2 ответа
будет работать что-то вроде следующего?
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
Вы можете настроить вывод 10 для работы в режиме инвертированного ШИМ и оставить контакт 9 в неинвертированном режиме по умолчанию. Контакт 9 — это «OC1A». контакт микроконтроллера AVR (выход сравнения Таймера 1, канал A), а контакт 10 — OC1B (канал B того же таймер). Инвертирование режима ШИМ канала B — это вопрос изменения один бит в одном из регистров управления Таймера 1:
TCCR1A |= _BV(COM1B0);
Вы можете сделать это один раз в setup()
, настройка должна сохраниться. Тогда просто
analogWrite()
одинаковое значение для обоих контактов. Для некоторого фона о том, как
все это работает, см. даташит на ATmega328P
микроконтроллер (микроконтроллер в основе вашего Uno),
особенно раздел 16 «16-битный таймер/счетчик 1 с ШИМ» и таблица
16-3 «Сравните режим вывода, коррекцию фазы и коррекцию фазы и частоты».
ШИМ».
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
«Итак, что я должен добавить в свой код»? Умеете использовать
if...else...
?, @hcheungВас волнует, если на несколько микросекунд они одинаковы?, @Filip Franik
Это зависит от того, как вы добились ШИМ на контакте 9. AnalogWrite? Ручное управление таймером? Я бы установил один из таймеров для ШИМ (режим таймера 1 или 3) и заставил бы его вызывать прерывания (OCIExx). Затем в прерывании вы будете попеременно включать и выключать каждый контакт., @towe