Содержание
- Что такое ШИМ и зачем он нужен.
- ШИМ и Ардуино.
- Альтернативы ШИМ, их достоинства и недостатки.
- Вывод.
- FAQ.
Что такое ШИМ и зачем он нужен
Аббревиатура ШИМ расшифровывается как “широтно-импульсная модуляция”, по-английски PWM (pulse-width modulation). Понять, что это значит, можно разобрав слова, входящие в это определение.
Начнем с конца. Модуляция - буквально разбивка сигнала на части - “модули”. Модулирующий сигнал состоит из модулей как поезд из вагонов, которые следуют друг за другом с определенной скоростью. В нашем случае один модуль представляет собой импульс - подъем напряжения с низкого уровня в высокий и обратно, вот так объясняется второе слово в аббревиатуре.
Смысл импульса в том, что он может быть разным - больше или меньше по напряжению, длиннее или короче по времени. В первом случае модуляция называется амплитудной, во втором - широтной. Так как стандартные контроллеры AVR не обладают встроенным ЦАП (цифро-аналоговым преобразователем), амплитудный вариант сразу отпадает. Ну не можем мы “дрыгать ножкой” чипа разным напряжением, а можем только или 0 В или 5 В, говоря иначе - “вкл - выкл” или “ноль - единица”. И остается нам лишь широтная модуляция, то есть процент заполнения импульса. Осталось понять, что значит новое словосочетание. Обратимся к иллюстрации.
На рисунках сверху и снизу изображено по два разных импульса. Расстояние между начальными точками импульсов в обоих случаях одинаково, то есть их частота тоже одинакова. Амплитуда, как мы уже выяснили, у наших импульсов тоже совпадает. Отличие только в их длине на высокой фазе, то есть в “наполненности” импульса положительным состоянием. Верхний рисунок демонстрирует заполнение на 10%, то есть 1/10 импульса положительна, а 9/10 нулевая. На нижнем рисунке время импульса заполнено высоким состоянием уже на 80%.
Ученое название заполнения импульса высоким уровнем - скважность. Может выражаться в процентах, как в нашем примере, а может в долях единицы, то есть 1 = 100%, кому как удобнее.
Очевидно, что ШИМ с нулевой скважностью будет представлять из себя ровную линию низкого уровня, а со 100% скважность - ровную линию высокого уровня.
Здесь у читателя возникает вопрос: а зачем это вообще надо? А у внимательного читателя еще и дополнительный: что это за красная линия на рисунках, подписанная как “Vcp”? Эта линия называется средним напряжением. Общее время импульса, поделенное на время его положительного состояния, прямо пропорционально среднему напряжению импульса относительно максимального напряжения сигнала.
Пример для Ардуино. Максимальное напряжение на ноге контроллера - 5 В. Если организовать ШИМ с 50% заполнением, получим среднее напряжение в размере тех же 50% от максимального, то есть 2,5 В. Таким образом, контроллер, лишенный настоящего ЦАПа может легко имитировать, с разной степенью грубости и точности, напряжение от нуля до максимального.
Подчеркиваю: именно что имитировать, настоящее напряжение все равно будет равно или 0 В или 5 В в каждый конкретный момент времени. Но если импульсы довольно короткие, то есть частота их достаточно высокая, ШИМ вполне может заменить настоящую регулировку напряжения для многих устройств. Например, управление скоростью вращения асинхронных двигателей при помощи ШИМ вообще никак не отличается от более сложного и дорогого изменения напряжения. Яркость освещения часто тоже регулируется скважностью ШИМ, но споры о том, насколько это вредит зрению, не утихают уже не первый десяток лет. ШИМом управляются все аналоговые сервоприводы и много чего еще.
Чем выше частота ШИМ, тем больше сигнал похож на аналоговый, чем мельче шаг изменения скважности, тем точнее задается его среднее напряжение и плавнее рисуются кривые.
ШИМ и Ардуино
Берем самый первый стандартный пример Ардуино, своего рода “Hello World!” - мигание светодиодом:
void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }
Светодиод послушно меняет свое состояние раз в секунду. Несмотря на то, что мигание прекрасно видно невооруженным глазом, это явление уже можно назвать ШИМом с супер низкой частотой 0,5 Гц.
Заменим цифры в строках задержки с 1000 на 10 и посмотрим на светодиод. Глаз уже не замечает отдельных фаз, а видит ровно светящийся светодиод примерно в половину своей максимальной яркости. Вот это уже полноценный ШИМ 50 Гц, задающий яркость свечению.
Интересный эксперимент. Попробуйте, глядя на светодиод, немного покрутить глазами вокруг него, почти сразу вы заметите, что растянувшийся след распадается на части - светлые и темные участки. Таким нехитрым образом можно распознавать ШИМ не только светодиода, но и подсветки монитора, герц до ста.
К счастью, в Ардуино встроен аппаратный генератор ШИМ и нам не нужно каждый раз писать программу для его реализации вручную. К сожалению, не все пины способны генерировать ШИМ, но их хватает для большинства несложных задач. На плате такие пины помечены знаком “тильда”, для Uno это: 3, 5, 6, 9, 10 и 11.
Комплектующие для Arduino и робототехники
В нашем магазине 3DIY вы найдете датчики, дисплеи, механику и другие запчасти. Заказывайте здесь: https://3d-diy.ru/catalog/arduino-and-robotics/ с доставкой по всей России.
Для генерации ШИМ задействованы все три таймера Ардуино. Следует учитывать, что если кроме ШИМ таймер задействован где-то еще, частота может “плавать”, а значит следует избегать подобных коллизий, если они недопустимы.
Для запуска ШИМ на способном к нему пине выполняем команду вида “analogWrite(n, s)”, где n - номер пина, s - коэффициент заполнения от 0 до 255. 255 соответствует 100% скважности.
analogWrite(3, 127); // запускаем на пине 3 ШИМ скважностью примерно 50%
По умолчанию заявленная частота ШИМ у Ардуино на пинах 3, 9, 10 и 11 - 488,28 Гц, а на пинах 5 и 6 - 976,56 Гц, чего достаточно почти всегда и для всего.
На картинке изображен ШИМ скважностью 50% с частотой по умолчанию на пинах 3 и 5, предлагаем самостоятельно догадаться где чей:
Для особых случаев есть возможность поднять или повысить частоту ШИМ в пределах от 15 до 62 500 Гц.
Как это делается и почему, тема не одной дополнительной статьи. Следует изучить, что такое таймер, почитать даташит, научиться выставлять флаги в регистрах, немного вспомнить бинарную арифметику и так далее. Приведем лишь готовое решение для пинов 9 и 10, то есть для первого таймера.
Шим с максимальной частотой (пин 9) на фоне “стандартного” (пин 5):
Если углубиться в изучение таймеров еще сильнее, можно научиться менять разрешение ШИМ со стандартного 8 на 9 (коэффициент 0-512) или 10, чтобы получить еще несколько кратных частот, но в рамках данной статьи так далеко заходить не будем.
Как видим, не без ограничений, но кое-какие инструменты для генерации ШИМ у Ардуино имеются. Радует еще и то, что большинство датчиков, исполнительных устройств и прочих подключаемых к Ардуино девайсов уже рассчитаны на существующие параметры ШИМ, так что трудности и проблемы в этой связи возникают очень редко.
Альтернативы ШИМ, их достоинства и недостатки
Бывает, что доступных шести пинов с ШИМ не хватает, например, если вы создаете робота-паука на сервоприводах, руку манипулятора, плавное последовательное освещение коридора или лестницы и так далее. На помощь придет внешний генератор ШИМ-сигналов. Пожалуй, самым известным для DIY-мастеров на данный момент является контроллер на базе PCA9685.
Подключаясь к Ардуино через I2C, то есть всего два пина, он предоставляет 16 пинов ШИМ с разрешением 12 бит (коэффициент заполнения от 0 до 4095), с возможностью настраивать частоту от 24 до 1526 Гц. Причем таких плат может быть одновременно несколько, достаточно лишь настроить индивидуальные адреса перемычками. Собрать можно не только паука, но и небольшой цех станков ЧПУ.
Плата PCA9685 стоит относительно недорого, подключается просто. Для работы с Ардуино есть готовые библиотеки, позволяющие выставлять нужный ШИМ на нужном выходе в одну команду.
pwm.setPWM(LEDPORT, 0, pulselen);
В особых случаях требуется устанавливать реальное напряжение в рамках рабочего диапазона. Например, для подсветки, если глаза слишком чувствительны даже к высокочастотному мерцанию. Или для получения синусоиды, треугольного сигнала и прочей формы, для управления зеркалами лазера, для воспроизведения звука, который представляет собой сплошную волну переменного напряжения и, разумеется, не может быть повторен никаким ШИМ. В таких ситуациях берем на вооружение настоящий ЦАП - цифроаналоговый преобразователь. Отправляем с Ардуино команду - какое следует установить напряжение - и ЦАП выдаст его на выходе. Микросхем ЦАП и модулей на их базе очень много, они отличаются исполнением, разрядностью, способом подключения и так далее. Подробнее о них можно почитать на нашем сайте в отдельной статье.
Шаговые двигатели, соединительные муфты, фрезы
И многое другое вы можете купить в нашем онлайн магазине https://3d-diy.ru/catalog/cnc-components/ с оплатой онлайн и доставкой от 1 дня.
Наиболее “любимым” нами ЦАП является чип MCP4921.
О нем много и с примерами написано в упомянутой статье, советуем ознакомиться. Он прост в подключении и использовании, неприхотлив, надежен, очень быстр и точен, рекомендуется не только новичкам, но и опытным DIY-мастерам.
ЦАП позволяет получить реальный аналоговый сигнал любого уровня в пределах максимального, с точностью до 0,025%. Однако он одноканален и требует усилителя, так как ток на выходе очень слаб.
Для примера, “треугольник” полученный с помощью ЦАП (шим так не умеет):
В качестве очень упрощенной имитации ЦАП для нетребовательных задач, можно применить RC-цепочку - элементарную схему сглаживания колебаний при помощи связки конденсатора и резистора.
Сглаживание довольно инертно, в десятки раз медленней периода ШИМ, не дает идеально ровной линии напряжения, требует точного расчета и вообще довольно сомнительного качества, но в некоторых случаях вполне работоспособно.
Что именно использовать, встроенный ШИМ, внешний ШИМ, ЦАП или RC-цепочку, решается в индивидуальном порядке в каждом проекте. Следует учитывать требования, возможности, цену и трудоемкость, а также совместимость с подключаемыми устройствами.
Вывод
ШИМ - важный и нужный, а где-то и незаменимый инструмент в работе и эксплуатации электронных устройств. Являясь альтернативой ЦАП, он позволяет сэкономить время и средства, а также существенно упростить схему. К изучению и дальнейшему применению любым DIY-мастером обязателен.
FAQ
Всегда ли верно правило “чем больше частота ШИМ, тем лучше”?В каких-то случаях да, в других нет. Высокая частота сильнее “грузит” контроллер, сбивает другие службы таймеров, некоторые драйверы моторов работают некорректно, двигатели начинают дергаться, сервоприводы вообще движутся хаотично и непредсказуемо. Следует (как и во всем) руководствоваться принципом разумной достаточности.
Можно ли установить любую желаемую частоту ШИМ?
Аппаратными средствами Ардуино нельзя, только выбрать из имеющихся с приличным разбросом. Можно сформировать ШИМ программно, как в примере со светодиодом, если точно рассчитать задержки в мили- и микросекундах, но это займет практически весь ресурс контроллера. Лучше всего использовать внешний ШИМ-генератор, им можно задать ШИМ любой частоты и скважности в рамках предельных возможностей.
Можно ли использовать ШИМ в качестве сигналов управления шаговыми двигателями?
При некоторой ловкости можно, конечно. Проблема возможна в точности, выдать строго отмеренное количество шагов с помощью ШИМ отдельная задача. Если же высокая меткость не нужна, а отгрузка шагов производится в плюс-минус несколько миллисекунд, то запросто, главное подобрать правильную частоту.