Влияет ли millis () на выводы PWM, связанные с таймером 0?

9

Я читал, что millis()функция использует тот же таймер, что и пара выводов ШИМ.

Если вы используете эти выводы ШИМ, все millis()равно вернете правильное значение?

Aurast
источник

Ответы:

6

Они не конфликтуют, так как millis()строго считывают непосредственное значение, TCNT0тогда как ШИМ через таймер 0 использует способность оборудования сравнивать значение TCNT0со значениями, OCR0xне влияя на значение любого из них.

Игнасио Васкес-Абрамс
источник
millis()просто использует счетчик переполнения таймера 0 micros()читает непосредственное значение в TCNT0.
Ник Гэммон
5

Просто чтобы добавить к ответу @ Игнасио, который прямо ответил на ваш вопрос. «Конфликт», о котором вы говорите, Timer0связан с прескалером России.

По большей части вы можете использовать эти выводы (между прочим, контакты 5 и 6 в UNO) с ШИМ без проблем и прочитать правильное значение millis()(а также получить ожидаемую задержку от delay)

Проблемы возникают в том случае, если вы хотите изменить прескалер (обычно для изменения частоты сигнала ШИМ). Если вы измените это, то вы будете напрямую влиять на расчет, отчетность millis()и продолжительность delay(x).

Madivad
источник
Вы можете прочитать прескалер вашего таймера по нижним битам Serial.println (TCCR0A, BIN); Если они равны 11, то ваш прескалер - clk / 64. Затем вы можете рассчитать коэффициент для изменения параметров millis () и delay ().
Дэйв Икс,
Это очень хороший момент, и я всегда избегал его изменения, но нет никаких причин, если вы действительно хотите / должны это делать. Другой момент заключается в том, что если вы изменили его, вы уже знаете новый прескалер и, в свою очередь, можете написать обертки для millis ()или в delay ()любом случае
Мадивад