Таймеры, выводы ШИМ и цифровые выходы на Arduino Mega

Я использую Arduino Mega для управления двигателями через ШИМ и драйверы двигателя Adafruit DRV8871. Я также использую TIMER1 для прерывания по времени. После добавления прерывания TIMER1 я обнаружил, что у меня есть проблемы с управлением двигателем, которые я, наконец, отследил до использования контактов 11 & 12 для PWM одновременно с использованием TIMER1 для прерываний по времени.

Моя первоначальная мысль состояла в том, чтобы изменить таймер, используемый для ISR, чтобы избежать конфликта контактов 11/12, но теперь я не уверен, какие ограничения существуют для использования контактов, связанных с таймерами. Теперь я понимаю, что контакты, связанные с прерыванием таймера, не могут использоваться для ШИМ с помощью AnalogWrite(int val), но могут ли они использоваться как цифровые выходы общего назначения?

Например, если я заменю TIMER1 на TIMER0 для прерывания таймера, это, по-видимому, изменит зависимость контактов с 11/12 на 13/4. Я не использую контакт 13, но использую контакт 4 в качестве цифрового выхода. Будет ли нормально работать контакт 4 в качестве цифрового выхода?

ТИА

Фрэнк

, 👍1

Обсуждение

Вы уверены, что используете Arduino Mega? контакты 11 и 12 не являются контактами ШИМ на мега. Только на УНО. В Mega есть около 6 таймеров, поэтому у вас будет из чего выбирать, чтобы избежать конфликтов., @Gerben


1 ответ


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

2

Вы можете использовать их для любых целей, кроме ШИМ. Вы даже можете использовать их для ШИМ, если настройки таймера позволяют вам создавать желаемую форму волны.

Причина поломки PWM заключалась в том, что вы изменили настройки таймера. Таймер - это то, что управляет ШИМ. Когда вы меняли эти настройки, вы либо отключали функцию ШИМ, либо устанавливали некоторые настройки, при которых она не работала. Затем контакты, связанные с этим таймером, больше не получали ШИМ. Вы можете делать что угодно, не связанное с таймером, включая использование вывода для ввода или вывода или любую другую специальную функцию, не связанную с таймером.

Если вы измените прерывание таймера на TIMER0, вы рискуете задержкой, миллисекунды и микросекунды перестанут работать правильно. Они зависят от прерывания переполнения TIMER0, работающего с заданным интервалом для подсчета времени. Это зависит от того, как вы настроили таймер.

Я бы посоветовал вам прочитать, как работают эти таймеры. Техническое описание микросхемы ATMega328P — отличное место для начала.

,