ШИМ сигнал

Очень часто в робототехнике возникает необходимость плавно управлять каким-то процессом, будь то яркость светодиода, мощность обогревателя или скорость вращения моторчика. Вполне очевидно, что управление напрямую связано с изменением напряжения на потребителе: и светодиод будет по-другому светить, и моторчик крутиться с другой скоростью. Но проблема в том, что управлять напряжением может только такая штука, как ЦАП – цифро-аналоговый преобразователь, а в нашем микроконтроллере встроенного ЦАПа нет, у нас есть только цифровой сигнал, т.е. либо вкл, либо выкл: Можно ли добиться плавного управления цифровым сигналом? Можно! Представьте себе вентилятор, вращающийся на полной мощности, напряжение постоянное. Представим теперь, что секунду напряжение подаётся, и секунду – нет, и так продолжается “по кругу”. Вентилятор начнёт крутиться в два раза медленнее, но мы скорее всего будем замечать моменты включения и выключения, особенно если вентилятор маленький и быстро останавливается. Теперь давайте включать напряжение на 0.5 секунды, а на остальные 1.5 секунды – выключать. Вентилятор будет крутиться со скоростью 25% от максимальной. Мы с вами смогли представить так называемый ШИМ сигнал, широтно-импульсную модуляцию:
С лампочкой накаливания оно тоже будет работать, она ведь весьма инертна, но вот со светодиодом мы будем видеть, как он включается и выключается, потому что он практически не имеет задержки включения/выключения. Что же делать? Всё очень просто, поднять частоту. В мысленном эксперименте у нас был период 2 секунды, что есть 0.5 Гц. А теперь представьте себе такой сигнал с частотой скажем 1000 Гц. Или 25’000 Гц (25 кГц). Теперь роль играет инертность глаза, он не заметит вспышек на такой частоте, для него это будет просто уменьшение яркости.

Задача решена! Изменяя так называемое “заполнение” ШИМ сигнала можно менять “суммарное” (интегрированное) напряжение за некоторый период. Чем больше заполнение ШИМ, тем выше напряжение. Но не выше напряжения, которое мы “ШИМим”: При помощи ШИМ сигнала можно даже модулировать сложные аналоговые сигналы, например – синусоиду. На картинке ниже показан ШИМ (снизу) и этот же ШИМ после фильтров: Вот таким образом кстати и работают инвертеры DC-AC. Возвращаясь к свойствам ШИМ сигнала, их всего два: частота (frequency) и заполнение (duty), с ними мы разобрались. Давайте перейдём к генерации ШИМ при помощи Arduino.

ШИМ пины


Взглянем на распиновку популярных плат Arduino Nano и Wemos Mini:

Пины, на которых можно запустить ШИМ сигнал стандартными средствами Arduino, помечены как PWM:

  • На Arduino Nano есть 6 таких пинов. Дело в том, что ШИМ сигнал генерируется отдельными аппаратными блоками (таймерами), поэтому их количество ограничено. В то же время генерация ШИМ на повышенной частоте не нагружает микроконтроллер, сигнал генерируется самостоятельно.
  • На Wemos Mini можно запустить ШИМ на любом пине, кроме GPIO16. Здесь генерация ШИМ реализована программно, поэтому работает на любом пине, но использование одновременно нескольких пинов на повышенной частоте будет тормозить работу микроконтроллера.

Включаем ШИМ


Для генерации ШИМ у нас есть готовая функция analogWrite(pin, duty):

  • pinPWM пин (см. распиновку выше). Нумерация пинов такая же, как в уроке про цифровые пины.
  • duty – заполнение ШИМ сигнала. По умолчанию имеет разрядность 8 бит, то есть принимает значение 0.. 255. Примечание: у esp8266 на версии ядра до 3.0 разрядность была 10 бит, то есть 0.. 1023.

Совместим эти знания с прошлым уроком и попробуем менять яркость светодиода, подключенного через резистор к пину D3 (Arduino Nano). Потенциометр подключен к пину A0:

void setup() {
}

void loop() {
  // ШИМ на 3 пин, 1023/4 = 255 - перевели диапазон
  analogWrite(3, analogRead(0) / 4);
}

Рассмотренный пример меняет яркость светодиода в зависимости от положения рукоятки потенциометра.

Особенности Arduino Nano


Стандартные параметры ШИМ сигнала:

Таймер Пины Частота Разрядность
Timer 0 D5 и D6 976 Гц 8 бит (0.. 255)
Timer 1 D9 и D10 488 Гц 8 бит (0.. 255)
Timer 2 D3 и D11 488 Гц 8 бит (0.. 255)

Про изменение частоты и разрядности мы поговорим в отдельном уроке.

Особенности Wemos Mini


Частота ШИМ по умолчанию 1 кГц.

  • Частоту можно настроить в analogWriteFreq(100.. 40000 Гц).

Разрядность ШИМ по умолчанию 8 бит (0.. 255) на версиях ядра 3.x. На ранних версиях – 10 бит (0.. 1023). Скажем спасибо индусам за совместимость.

  • Разрядность можно настроить в analogWriteResolution(4...16 бит).

Программный ШИМ


ШИМ сигнал необязательно запускать стандартными средствами Arduino, можно сделать это вручную на любом пине. Подробности в видео уроке:

Видео


Полезные страницы


  • Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
  • Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
  • Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
  • Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
  • Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
  • Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
  • Поддержать автора за работу над уроками
  • Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту (alex@alexgyver.ru)
4.9/5 - (17 голосов)
Назад Аналоговые пины
Вперёд Аппаратные прерывания
Подписаться
Уведомить о
guest
14 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии