tone() искажает ШИМ на другом выводе

Мне приходится использовать ШИМ для управления некоторыми источниками света. Я делаю это успешно с: analogWrite(11, 127); для импульса ШИМ 50% на pin 11.

Теперь мне также нужна поддержка tone() в моем коде. Когда я делаю: тон (10, melodyArray[thisNote], noteDuration); Я вызываю функцию tone() на контакте 10.

Когда я это делаю, импульс ШИМ искажается. Поскольку у меня нет осциллографа, я не могу точно понять, что происходит. Но по влиянию на свет я могу предположить, что контакт ШИМ (контакт 11) всегда HIGH или всегда LOW.

Очевидно, что вывод ШИМ и вывод tone() отличаются.

Почему это происходит? Возможно, tone() использует какие-то таймеры, которые мешают ШИМ? Когда я комментирую строку tone(), ШИМ работает как положено.

Есть ли решение этой проблемы? Могу ли я использовать функцию tone() и при этом иметь поддержку PWM (на другом выводе)?

, 👍-1


1 ответ


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

4

Цитата из документации Arduino для tone( ):

Использование функции tone() будет мешать выходу ШИМ на контактах 3 и 11 (на платах, отличных от Mega).

Так что да, для analogWrite() следует использовать другой контакт, а не 3 или 11. Это связано с тем, что tone() настроит аппаратный Timer2 для вывода этих синхронизированных сигналов через оборудование. ШИМ на этих контактах также привязан к Timer2. Когда обе функции пытаются настроить Timer2 по-разному, возникнут конфликты.

Примечание. В документации говорится о «платах, отличных от Mega», что было правдой, когда не было других плат Arduino, кроме старых Uno/Nano/Mini (на основе Atmega328p). В настоящее время существует так много плат, которые все можно запрограммировать с помощью среды Arduino, что это предложение является настоящей натяжкой. Вместо этого я бы сказал "на платах на базе Atmega328p". В зависимости от вашей подержанной платы ваш пробег может очень сильно отличаться. Проверьте техническое описание микроконтроллеров, чтобы узнать, какие аппаратные таймеры и их контакты подключены.

,

«на платах, отличных от Mega». похоже, это было написано давным-давно, когда у каждого Arduino был классический микроконтроллер ATmega, @Juraj

@Juraj Да, очень. Хотя Uno/Nano по-прежнему широко используется. Я добавлю предложение, чтобы прокомментировать это, @chrisl

Большое спасибо! К своему стыду, я провел месяцы, застряв на этом..., @user1584421