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


9

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

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

Ответы:


6

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


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

5

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

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

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


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

Это очень хороший момент, и я всегда избегал его изменения, но нет никаких причин, если вы действительно хотите / должны это делать. Другой момент заключается в том, что если вы изменили его, вы уже знаете новый прескалер и, в свою очередь, можете написать обертки для millis ()или в delay ()любом случае
Мадивад
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.