tone() искажает ШИМ на другом выводе
Мне приходится использовать ШИМ для управления некоторыми источниками света. Я делаю это успешно с:
analogWrite(11, 127);
для импульса ШИМ 50% на pin 11
.
Теперь мне также нужна поддержка tone()
в моем коде. Когда я делаю:
тон (10, melodyArray[thisNote], noteDuration);
Я вызываю функцию tone()
на контакте 10
.
Когда я это делаю, импульс ШИМ искажается. Поскольку у меня нет осциллографа, я не могу точно понять, что происходит.
Но по влиянию на свет я могу предположить, что контакт ШИМ (контакт 11
) всегда HIGH
или всегда LOW
.
Очевидно, что вывод ШИМ и вывод tone()
отличаются.
Почему это происходит? Возможно, tone()
использует какие-то таймеры, которые мешают ШИМ?
Когда я комментирую строку tone()
, ШИМ работает как положено.
Есть ли решение этой проблемы? Могу ли я использовать функцию tone() и при этом иметь поддержку PWM
(на другом выводе)?
@user1584421, 👍-1
1 ответ
Лучший ответ:
Цитата из документации Arduino для tone( )
:
Использование функции tone() будет мешать выходу ШИМ на контактах 3 и 11 (на платах, отличных от Mega).
Так что да, для analogWrite()
следует использовать другой контакт, а не 3 или 11. Это связано с тем, что tone()
настроит аппаратный Timer2 для вывода этих синхронизированных сигналов через оборудование. ШИМ на этих контактах также привязан к Timer2. Когда обе функции пытаются настроить Timer2 по-разному, возникнут конфликты.
Примечание. В документации говорится о «платах, отличных от Mega», что было правдой, когда не было других плат Arduino, кроме старых Uno/Nano/Mini (на основе Atmega328p). В настоящее время существует так много плат, которые все можно запрограммировать с помощью среды Arduino, что это предложение является настоящей натяжкой. Вместо этого я бы сказал "на платах на базе Atmega328p". В зависимости от вашей подержанной платы ваш пробег может очень сильно отличаться. Проверьте техническое описание микроконтроллеров, чтобы узнать, какие аппаратные таймеры и их контакты подключены.
- Транзисторный усилитель для управления динамиком с использованием ШИМ Arduino
- Выполнить регулировку громкости на динамике arduino
- Можно ли использовать Arduino PWM для аудио с усилителем PAM8493?
- Как определить частоту среза для фильтра нижних частот?
- Использование ШИМ-выводов на UNO для создания стереозвука
- Установите частоту ШИМ на 25 кГц.
- Какова частота PWM-выхода на Arduino
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
«на платах, отличных от Mega». похоже, это было написано давным-давно, когда у каждого Arduino был классический микроконтроллер ATmega, @Juraj
@Juraj Да, очень. Хотя Uno/Nano по-прежнему широко используется. Я добавлю предложение, чтобы прокомментировать это, @chrisl
Большое спасибо! К своему стыду, я провел месяцы, застряв на этом..., @user1584421