Широтно-импульсная модуляция
При управлении нагрузками с помощью микроконтроллеров, мы не можем выдавать произвольное напряжение с пинов. Например, Arduino, может выдать на свои пины или напряжение в 5 В (HIGH) или замкнуть их на землю (LOW). По сути, мы можем лишь “включать” и “выключать” пины микроконтроллера. А что же делать в ситуациях, когда необходимо подать на нагрузку неполное напряжение, например 2,5 В?
В таких случаях используется широтно-импульсная модуляция (ШИМ, англ. Pulse Width Modulation или просто PWM). Вся суть ШИМ заключается в том, что микроконтроллер способен очень-очень быстро “включать” и “выключать” свои пины, подавая на них попеременно сигналы 5 В и GND (Землю, 0 В). Скорость такого переключения составляет тысячи Герц, т.е. тысячи раз в секунду. При подключении к пину микроконтроллера светоиода и подачи на него такого сигнала, светодиод начнёт быстро-быстро мерцать, тем не менее наш глаз не будет замечать этого мерцания из-за очень большой её частоты, и нам будет казаться, что светодиод горит вполсилы. Изменяя длину сигналов включения и выключения можно добиться разной яркости светодиода.
Если мы найдём отношение времени включения светодиода ко времени его выключения, то получим скважность (англ. duty cycle): | \(\mathrm{S=\frac{T}{\tau}}\) |
где, T – период импульсов (время между двумя HIGH-сигналами), τ – длительность одного импульса. S – безразмерная величина, которая может изменяться в диапазоне [0 … 1] или [0% … 100%].
Ниже, мы можете увидеть графики, которые показывают величину яркости светодиода, при использовании ШИМ различной скважности:
Скважность – 15% | Скважность – 50% | Скважность – 75% |
Скважность ШИМ и видимая яркость светодиода |
Широтно-импульсную модуляцию можно использовать не только для управления яркостью светодиодов, но и для регулировки скорости моторов, а также для управления транзисторами. Для того, чтобы подать ШИМ сигнал с платы Arduino Uno, необходимо подключить нагрузку к одному из пинов, поддерживающих ШИМ. Такие пины обозначены значком ~. Это пины 3, 5, 6, 9, 10, 11. Для подачи ШИМ-сигнала используется команда вида:
analogWrite(pin, value);
где:
- pin: порт вход/выхода на который подаем ШИМ сигнал.
- value: период рабочего цикла значение между 0 (полностью выключено) и 255 (сигнал подан постоянно).
Таким образом, при использовании команды
analogWrite(3, 255);
мы зажжём светодиод, подключенный к 3-му пину на 100% яркости. Если же нам нужно зажечь светодиод наполовину его максимальной яркости, то следует уменьшить скважность до 50%, т.е. в 2 раза:
analogWrite(3, 122);
В случае, когда светодиод нужно полностью погасить, следует уменьшить значение скважности до нуля:
analogWrite(3, 0);