Использование ШИМ в Raspberry Pi – руководство для начинающих


ШИМ (широтно-импульная модуляция, в англ. PWM – pulse width modulation) – весьма популярный инструмент в цифровой схемотехнике, позволяющий плавно управлять какими либо процессами: управление яркостью свечению светодиода, скоростью вращения двигателя постоянного тока или вентилятора и т.д. Фактически, ШИМ – это способ получения изменяющегося напряжения на выходе при постоянном напряжении источника питания.

Внешний вид проекта для демонстрации использования ШИМ в Raspberry Pi

Ранее на нашем сайте мы уже рассматривали использование ШИМ в микроконтроллерах AVR, в платах Arduino Uno и Arduino Due. В этой же статье мы рассмотрим использование ШИМ в Raspberry Pi, с помощью которой мы будем управлять яркостью свечения светодиода, подключенного к плате.

Принципы ШИМ

Для формирования ШИМ в Raspberry Pi используется один из цифровых выходов, на котором генерируется серия импульсов высого и низкого уровня. Управляя долей времени, в течение которого подаются импульсы высокого уровня, можно управлять общей подачей мощности на интересующее нас устройство (например, двигатель или светодиод).

Принцип ШИМ (широтно-импульсной модуляции) показан на следующем рисунке.

Схема для пояснения принципа работы ШИМ

Если выключатель на этой схеме будет постоянно замкнут, то светодиод в схеме будет постоянно гореть. Если выключатель будет замкнут первые полсекунды, а вторые полсекунды будет разомкнут, то светодиод будет гореть только первые полсекунды. Отношение длительности импульса к периоду его следования называется коэффициентом заполнения (duty cycle). В некоторых источниках его также называют скважностью или рабочим циклом. Его можно рассчитать по следующей формуле:

Duty Cycle =Turn ON time/ (Turn ON time + Turn OFF time)

 Если импульсы соответствуют включенному состоянию на протяжении лишь 5% всего времени цикла (коэффициент заполнения равен 5%), то на двигатель будет поступать не слишком много энергии, и он станет вращаться очень медленно (либо светодиод будет светить тускло). Стоит повысить коэффициент заполнения до 50% - и двигатель или светодиод получат половину мощности, соответственно, скорость вращения или яркость составят примерно половину от максимума. Если коэффициент заполнения возрастет до 90% , то двигатель будет вращаться почти с полной скоростью, а светодиод - светить в полную силу.

Более красочно принципы работы ШИМ показаны на следующих рисунках.

ШИМ с коэффициентом заполнения 50%

ШИМ с коэффициентом заполнения 10%

ШИМ с коэффициентом заполнения 90%

Чтобы выключить двигатель или светодиод, достаточно лишь снизить коэффициент заполнения до 0, а для разгона на полную мощность - поднять его до 100% . Удержание контакта GPIO постоянно в состоянии high и обеспечит коэффициент заполнения 100%.

Контакты ввода/вывода в плате Raspberry Pi

Внешний вид и распиновка контактов ввода/вывода (GPIO) платы Raspberry Pi показаны на следующих рисунках.

Местоположение контактов ввода/вывода (GPIO) на плате Raspberry Pi

Распиновка контактов ввода/вывода (GPIO) платы Raspberry Pi

Как показано на представленном рисунке, у платы Raspberry Pi имеется 40 контактов ввода/вывода. Но однако не все эти контакты доступны для программирования. На самом деле для программирования доступны только 26 контактов ввода/вывода (GPIO), которые обозначены на представленном рисунке с GPIO2 до GPIO27.

Эти контакты вы можете программировать по своему усмотрению. Некоторые из этих контактов могут также выполнять специальные функции (последовательный порт, интерфейсы SPI и I2С и т.д.). Если не учитывать контакты, которые могут выполнять специальные функции, то остается 17 программируемых контактов общего назначения, на следующем рисунке они обозначены кружками зеленого цвета.

Каждый из этих 17 контактов может выдерживать ток до 15mA, а суммарный ток от всех контактов ввода/вывода не должен превышать 50mA. Таким образом, если мы задействуем все эти 17 контактов, то в среднем на каждый контакт должен приходиться ток не более 3mA.

Расширенная распиновка контактов ввода/вывода (GPIO) платы Raspberry Pi

Необходимые компоненты

  1. Плата Raspberry Pi 2 Model B или другая аналогичная (купить на AliExpress).
  2. Резистор 220 Ом или 1 кОм (купить на AliExpress).
  3. Светодиод (купить на AliExpress).
  4. Макетная плата.
  5. Соединительные провода.

Схема проекта

Схема для демонстрации использования ШИМ в Raspberry Pi представлена на следующем рисунке.

Схема для демонстрации использования ШИМ в Raspberry PiКак показано на схеме, мы подключили светодиод между контактами PIN35 (GPIO19) и PIN39 (ground). Поскольку, как мы уже рассмотрели ранее, через контакт нельзя пропускать ток более 15mA, то последовательно со светодиодом мы подключили резистор (сопротивлением 220 Ом или 1 кОм).

Объяснение программы для Raspberry Pi

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
После того, как все необходимые соединения в схеме сделаны, мы можем подать питание на Raspberry Pi и после загрузки ее операционной системы можно начать писать программу в ней на Python. Подробнее о том, как это можно сделать, можно прочитать в статье про мигание светодиода с помощью Raspberry Pi.

В программе нам первым делом необходимо подключить (импортировать) библиотеку для работы с контактами ввода/вывода. Также мы импортируем эту библиотеку RPi.GPIO под именем “IO” (то есть переименовываем ее для использования в программе), то есть далее в программе всегда, когда мы захотим обратиться к контактам ввода/вывода, мы будем использовать слово ‘IO’.

Иногда контакты ввода/вывода (GPIO pins), которые мы собираемся использовать в программе, могут выполнять другие функции. В этом случае во время исполнения программы мы будем получать предупреждения (warnings). Следующей командой мы укажем плате Raspberry Pi на то, чтобы она игнорировала эти предупреждения и продолжала исполнение программы.

Мы можем обращаться к контактам ввода/вывода (GPIO pins) платы Raspberry Pi используя либо номер контакта на плате, либо его функциональный номер. В представленной выше распиновке контактов ввода/вывода можно увидеть, к примеру, что обозначение GPIO19 соответствует контакту PIN 35. То есть в зависимости от того, какой способ обращения к контактам мы выбрали, мы можем обращаться к рассмотренному контакту либо по номеру ‘35’, либо по номеру ‘19’. В данном проекте мы выберем способ обращения к контактам по их функциональным номерам, поэтому используем следующую команду:

Далее мы сконфигурируем контакт GPIO19 (PIN35) в качестве цифрового выхода поскольку на этом контакте мы будем формировать сигнал ШИМ (широтно-импульсной модуляции).

После конфигурации контакта в качестве цифрового выхода нам необходимо настроить его как выходной контакт формирования ШИМ.

Представленная команда определяет канал для формирования ШИМ и устанавливает частоту формируемого ШИМ сигнала. В качестве канала ШИМ в нашем проекте мы будем использовать контакт GPIO19, а в качестве частоты ШИМ сигнала мы зададим значение 100 – при этой частоте мы не будем видеть мерцание светодиода.

Но ШИМ-контакт не начнет работать, пока не будет вызвана функция start(). Ее параметр – это исходное значение коэффициента заполнения (duty cycle). Если мы зададим его равным 0, то светодиод будет все время выключен, если мы зададим его 30 – светодиод будет гореть на 30% от максимальной мощности, если мы зададим его 100 – светодиод будет непрерывно гореть с максимальной мощностью.

Следующая команда представляет собой цикл, который исполнится 50 раз, в нем переменная x будет инкрементироваться от 0 до 49.

Затем в программе мы будем использовать команду "While 1:" – она будет формировать бесконечный цикл. Внутри этого цикла все команды будут исполняться непрерывно.

Во время исполнения программы коэффициент заполнения ШИМ сигнала будет сначала увеличиваться, а потом уменьшаться. Соответствующим образом будет изменяться и яркость свечения светодиода.

Исходный код программы

Комментарии к коду программы поясняют смысл отдельных команд.

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
2 020 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *