До сих пор мы управляли GPIO-пинами в цифровом, бинарном режиме: они были либо полностью включены (HIGH
), либо полностью выключены (LOW
). Однако многие устройства, такие как светодиоды, моторы или вентиляторы, требуют не простого включения/выключения, а плавной регулировки мощности. Для решения этой задачи с помощью цифровых сигналов используется техника, называемая широтно-импульсной модуляцией (ШИМ), или PWM (Pulse-Width Modulation).
Что такое ШИМ? Иллюзия аналогового сигнала
Суть ШИМ заключается в очень быстром переключении цифрового сигнала между состояниями HIGH
и LOW
. Если делать это достаточно быстро, для инерционных устройств (как человеческий глаз или электромотор) это будет выглядеть не как мигание, а как постоянный сигнал с уменьшенной мощностью.
Представьте, что вы очень быстро щелкаете выключателем света. Если свет горит половину времени, комната будет казаться освещенной наполовину. ШИМ работает по тому же принципу, но выполняет эти "щелчки" тысячи раз в секунду.
Для описания ШИМ-сигнала используются два ключевых параметра:
- Частота (Frequency): Как часто повторяется цикл включения-выключения. Измеряется в Герцах (Гц). Для управления яркостью светодиода достаточно частоты в 100-200 Гц, для моторов могут потребоваться килогерцы (кГц).
- Коэффициент заполнения (Duty Cycle): Самый важный параметр. Это процент времени внутри одного цикла, в течение которого сигнал находится в состоянии
HIGH
. Именно он определяет "мощность" сигнала.- Duty Cycle = 0%: Сигнал всегда
LOW
. Светодиод не горит. - Duty Cycle = 25%: Сигнал
HIGH
четверть времени. Светодиод горит тускло. - Duty Cycle = 50%: Сигнал
HIGH
половину времени. Светодиод горит вполнакала. - Duty Cycle = 100%: Сигнал всегда
HIGH
. Светодиод горит на полную мощность.
- Duty Cycle = 0%: Сигнал всегда
Аппаратный ШИМ в Repka Pi
ШИМ можно реализовать двумя способами: программно (заставляя процессор вручную переключать пин) и аппаратно. Программный метод неточен, нестабилен и сильно нагружает процессор.
Repka Pi, благодаря процессору Allwinner, оснащена аппаратным ШИМ-контроллером. Это специальный блок внутри чипа, который способен генерировать идеально стабильный ШИМ-сигнал на определенных пинах без какого-либо участия центрального процессора.
Класс PWM_A
в библиотеке RepkaPi.GPIO
предназначен для работы именно с этим аппаратным контроллером, что обеспечивает высокую производительность и точность.
Практическое применение: Плавное управление яркостью светодиода
Давайте используем ШИМ для создания эффекта "дыхания" светодиода — плавного загорания и затухания.
1. Аппаратная часть и схема:
-
Важно: Аппаратный ШИМ доступен не на всех пинах. Необходимо использовать пин, специально предназначенный для этого.
- На Repka Pi 3 это, как правило, пин №33 (PL10).
- На Repka Pi 4 это, как правило, пин №32 (PL8).
- Всегда сверяйтесь со схемой распиновки (pinout) для вашей модели платы.
-
Схема: Соберите простую цепь, как в главе "Первые шаги", но подключите светодиод (через резистор) к одному из указанных выше ШИМ-пинов. Для примера возьмем пин №33 (Repka Pi 3).
2. Программный код (pwm_fade.py
) В этом коде мы создадим объект ШИМ, а затем в цикле будем плавно изменять его коэффициент заполнения.
# -*- coding: utf-8 -*-
import RepkaPi.GPIO as GPIO
from time import sleep
# --- 1. Настройка ---
# ВАЖНО: При работе с ШИМ через класс PWM_A нет необходимости вызывать setmode() или setup()
# для этого пина, так как класс напрямую работает с системными файлами PWM-контроллера.
# Определяем параметры для ШИМ-контроллера
PWM_CHIP = 0 # Номер ШИМ-контроллера (обычно 0)
PWM_PIN_IN_CHIP = 0 # Номер канала внутри контроллера (обычно 0)
# Эти параметры соответствуют физическому пину PWM0 на плате.
FREQUENCY_HZ = 100 # Частота 100 Гц, комфортная для глаз
# --- 2. Создание и запуск ШИМ-объекта ---
try:
print("Программа запущена. Светодиод начнет плавно мигать.")
print("Нажмите CTRL+C для выхода.")
# Создаем объект PWM. Начальная яркость 0%.
pwm = GPIO.PWM_A(PWM_CHIP, PWM_PIN_IN_CHIP, FREQUENCY_HZ, duty_cycle_percent=0)
# Запускаем генерацию сигнала. Пока что он будет постоянно LOW (яркость 0).
pwm.start_pwm()
# --- 3. Основной цикл: эффект "дыхания" ---
while True:
# Плавное увеличение яркости (от 0 до 100%)
for duty_cycle in range(0, 101, 5):
pwm.duty_cycle(duty_cycle)
sleep(0.05)
# Плавное уменьшение яркости (от 100 до 0%)
for duty_cycle in range(100, -1, -5):
pwm.duty_cycle(duty_cycle)
sleep(0.05)
# --- 4. Корректное завершение ---
except KeyboardInterrupt:
print("\nЗавершение работы.")
finally:
# Важно корректно остановить ШИМ и освободить ресурсы
if 'pwm' in locals():
pwm.stop_pwm() # Устанавливаем яркость в 0
pwm.pwm_close() # Удаляем объект из sysfs
del pwm # Удаляем объект из памяти
3. Запуск и результат
Запустите скрипт: python3 pwm_fade.py
. Вы увидите, как светодиод на пине №33 начнет плавно загораться и гаснуть, создавая красивый эффект "дыхания". Это наглядно демонстрирует, как ШИМ позволяет добиться аналогового управления с помощью цифрового инструментария.
Помимо управления яркостью, ШИМ является основой для:
- Регулировки скорости вращения DC-моторов: Больше коэффициент заполнения — быстрее вращается мотор.
- Управления сервоприводами: Положение вала сервопривода задается шириной импульса (конкретным значением duty cycle).
- Генерации звуковых сигналов: Подавая ШИМ-сигнал определенной частоты на динамик, можно генерировать звуки разной высоты.