ШИМ-вывод Arduino против моделирования ШИМ с цифровым выводом

Правильно ли я понял из этой ветки, почему у некоторых контактов есть знаки `~` рядом с их номерами? , что контакты ШИМ генерируют сигнал прямоугольной формы независимо от того, что делает код, загруженный в чип, после запуска вывода ШИМ? Другими словами, если мой код содержит всевозможные delay()функции, которые делают паузу дольше, чем период сигнала ШИМ, сигнал ШИМ все равно будет генерироваться правильно, верно?

С другой стороны, если бы я решил реализовать свой собственный ШИМ на цифровом выводе вместо того, чтобы переключать состояние между ВЫСОКИМ и НИЗКИМ в моем коде через регулярные промежутки времени, наличие других вызовов delay()в других частях кода напрямую повлияло бы на мою способность генерировать желаемый последовательный сигнал ШИМ. Это верно? Я надеюсь, что этот вопрос имеет смысл (немного сложно задать вопрос).

Ответы (1)

Вы правильно поняли. Выводы с символом тильды (~) — это выводы, которые связаны с аппаратным модулем ШИМ (т. е. таймером). Поскольку это аппаратный модуль, он не зависит от того, что делает ваш процессор. Таким образом, если вы застряли в задержке, ваш аппаратный PWM все равно будет продолжать генерировать правильный выходной сигнал. С другой стороны, программный ШИМ (тот, который вы сгенерируете с помощью ручного переключения контактов) будет прерван вашей задержкой.

Большую часть времени вы должны предпочесть аппаратную ШИМ программной ШИМ по многим причинам:

  1. Это более надежно;
  2. Он потребляет меньше энергии (вы можете перевести микроконтроллер в спящий режим, продолжая генерировать ШИМ);
  3. Позволяет вместо обслуживания коммутации заняться чем-то другим;
  4. Это позволяет использовать более высокие частоты, потому что обычно вы можете получить частоты до рабочей частоты вашего MCU, в то время как программная эмуляция включает в себя несколько операций, поэтому вы не можете идти в ногу;
  5. Это более точно: аппаратный ШИМ — это просто делитель рабочей частоты вашего микроконтроллера, а программный ШИМ использует инструкции ЦП, которые требуют ветвления. Поскольку это скомпилированный код, он более или менее детерминирован, поэтому ваш рабочий цикл не будет точно таким, как вы ожидаете (почти, но не идеально и не стабильно, если вы одновременно делаете что-то еще).
У меня вопрос вдогонку. Если бы я использовал регистры для переключения цифрового порта HIGH и LOW, например PORTB = 0b00000001;, будет ли это также проходить через ЦП, как если бы я использовал цифровую запись (1, HIGH), или это было бы так же эффективно, как использование порта PWM? Я предполагаю, что это также неэффективно, верно?
Это на самом деле использует процессор! Когда вы используете встроенные библиотеки из стека Arduino, вы используете регистры для переключения ввода/вывода. Этот факт только абстрагируется от вас библиотеками. Именно поэтому библиотеки Arduino (и в основном любой уровень аппаратной абстракции высокого уровня) работают намного медленнее, чем переключение GPIO с использованием таких назначений. Когда вы читаете техническое описание, если вы чувствуете, что перевод MCU в спящий режим помешает вам это сделать, то, скорее всего, это связано с процессором. Таймеры и DMA (на других микроконтроллерах), даже когда процессор находится в спящем режиме. Надеюсь, это поможет вам.
Имеет смысл. Я узнал важные вещи от вас! Спасибо!