В данной статье мы рассмотрим использование широтно-импульсной модуляции (ШИМ) в плате Raspberry Pi Pico. Мы будем постепенно изменять яркость светодиода с помощью программирования. Поскольку пульсирующий свет похож на дыхание, мы даем ему магическое название – дышащий светодиод. Мы достигнем этого эффекта с помощью широтно-импульсной модуляции (ШИМ).
Широтно-импульсная модуляция или ШИМ — это распространенная техника, используемая для изменения ширины импульсов в последовательности импульсов. ШИМ имеет множество применений, таких как управление сервоприводами и контроллерами скорости, ограничение эффективной мощности двигателей и светодиодов.
Необходимые компоненты
- Плата Raspberry Pi Pico (купить на AliExpress).
- Светодиод любого цвета (купить на AliExpress).
- USB-кабель.
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Широтно-импульсная модуляция (ШИМ)
Широтно-импульсная модуляция (ШИМ, в англ. Pulse width modulation, PWM) — это метод получения аналоговых результатов цифровыми средствами. Цифровое управление используется для создания прямоугольной волны, сигнала, переключаемого между включенным и выключенным состояниями. Этот шаблон включения-выключения может имитировать напряжения между полным включением (5 В) и выключением (0 В), изменяя часть времени, которое сигнал проводит во включенном состоянии, по сравнению со временем, которое сигнал проводит в выключенном состоянии.
Длительность «времени включения» называется шириной импульса. Чтобы получить различные аналоговые значения, вы изменяете или модулируете эту ширину. Если вы достаточно быстро повторите этот шаблон включения-выключения с каким-либо устройством, например, светодиодом, то это будет выглядеть так: сигнал представляет собой постоянное напряжение от 0 до 5 В, управляющее яркостью светодиода.
Вы увидите, что чем меньше значение ШИМ, тем меньше будет значение после преобразования в напряжение. Тогда светодиод соответственно становится тусклее. Таким образом, мы можем управлять яркостью светодиода, управляя значением коэффициента заполнения/шириной импульса ШИМ.
ШИМ-контакты платы Raspberry Pi Pico
Микроконтроллер RP2040 в ядре Raspberry Pi Pico имеет 8 слайсов ШИМ, и каждый слайс независим от других. Это просто означает, что мы можем установить параметры каждого слайса, не влияя на другие слайсы.
Блок ШИМ RP2040 имеет 8 идентичных слайсов (срезов) ШИМ, каждый с двумя выходными каналами (A/B), где вывод B также может использоваться как вход для измерения частоты и рабочего цикла. Это означает, что каждый слайс может управлять двумя выходными сигналами ШИМ или измерять частоту или рабочий цикл входного сигнала. Это дает в общей сложности до 16 управляемых выходов ШИМ. Все 30 выводов GPIO платы Raspberry Pi Pico могут управляться блоком ШИМ.
Интересно вспомнить в этот момент о такой возможности ШИМ на RP2040, как изменение значения коэффициента заполнения (Duty Cycle) на 0% и на 100% без ложных пиков, как это происходит на большинстве других микроконтроллеров. Кроме того, можно иметь два выхода одного и того же слайса Slice с инвертированными фазовыми сигналами.
На приведенной выше схеме контактов контакты 21/GP16 и 22/GP17 относятся к одному и тому же срезу: GP16 — это выход A, а GP17 — это выход B.
Использование ШИМ в Raspberry Pi Pico
В этом примере мы будем использовать вывод ШИМ платы Raspberry Pi Pico со светодиодом. Благодаря широтно-импульсной модуляции яркость свечения светодиода будет управляться таким образом, чтобы он постепенно загорался, а затем постепенно выключался, чтобы сформировать эффект дышащего света в цикле.
Подключите положительный контакт светодиода к контакту Pi Pico GP2, а отрицательный контакт — к GND.
Код программы на MicroPython
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from machine import Pin, PWM import utime led = PWM(Pin(2)) led.freq(1000) # Set the frequency value led_value = 0 #LED brightness initial value led_speed = 5 # Change brightness in increments of 5 if __name__ == '__main__': while True: led_value += led_speed led.duty_u16(int(led_value * 500)) # Set the duty cycle, between 0-65535 utime.sleep_ms(100) if led_value >= 100: led_value = 100 led_speed = -5 elif led_value <= 0: led_value = 0 led_speed = 5 |
Скопируйте приведенный выше код и запустите скрипт.
Светодиод, подключенный к Raspberry Pi Pico, будет вести себя как «дышащий» светодиод, поскольку его освещенность и яркость будут меняться через равные промежутки времени.
Частота (led.freq) сообщает Raspberry Pi Pico, как часто включать и выключать светодиод. Рабочий цикл сообщает светодиоду, как долго он должен быть включен каждый раз. Для Raspberry Pi Pico в MicroPython это может быть в диапазоне от 0 до 65025. 65025 будет соответствовать 100% времени, поэтому светодиод будет оставаться все время ярким. Значение около 32512 будет означать, что он должен быть включен половину времени.
12 просмотров