ESP32: УПРАВЛЯЕМ СКОРОСТЬЮ МОТОРА С ПОМОЩЬЮ ШИМ (PWM)
Что нам понадобится?
- плата ESP32 DEVKIT V1
- драйвер двигателей L293D
- мотор FA-130 3-6 В (с редуктором или без него)
- две макетные платы
- отсек для четырех батареек AA
- соединительные проводники
- кабель micro USB для подключения ESP32 к компьютеру
Регулировка тока с помощью ШИМ (PWM)
Широтно-импульсная модуляция (ШИМ, англ. Pulse-Width Modulation (PWM)) — это способ управления мощностью электрического тока с помощью его пульсирующего включения и выключения. Практически любым электрическим устройством, имеющим определённую инерцию, можно управлять с помощью широтно-импульсной модуляции (ШИМ).Если изменять время включения и длину паузы между включениями, то можно регулировать скорость вращения мотора или яркость свечения светодиода. Таким образом, имея в распоряжении лишь два значения напряжения (высокий уровень и низкий уровень), можно получить любое промежуточное значение напряжения. Подробнее о ШИМ можно прочитать в статье "ШИМ и PWM – что это такое?"
Частота и скважность ШИМ (PWM)
Насколько часто будет происходить пульсирующее включение и выключение, определяется частотой ШИМ (англ. frequency), которая в свою очередь определяет период импульса, то есть сколько времени будет занимать одно включение вместе с выключением.Еще одним важным параметром является время включения (ширина импульса) в одном периоде ШИМ. Отношение периода импульса к ширине импульса называют скважностью, а обратную величину – коэффициентом заполнения или рабочим циклом (англ. duty cycle).
На рисунке приведены примеры напряжений для заполнения 100% (скважность 1), 75% (скважность 4/3), 50% (скважность 2) и 25% (скважность 4).
ESP32 позволяет работать с диапазоном частот для ШИМ (PWM) от 1 Гц до 40 МГц. Для разных устройств частота следования импульсов ШИМ должна быть различной. Для светодиодов частота ШИМ может лежать в диапазоне 100-500 Гц, хотя мерцание перестает быть заметным уже на частоте 60 Гц.
Для моторов частота должна быть намного меньше, иначе мы получим падение мощности. В таблице ниже приведены примерные соотношения коэффициента заполнения (duty cycle) и частоты ШИМ для мотора FA-130 с редуктором 1:48.
duty cycle (%) | frequency (Hz) |
25 | 15 |
30 | 20 |
45 | 20-30 |
50 | 20-40 |
75 | 20-50 |
100 | 20-50 |
Схема подключения мотора
Для управления мотором с помощью ESP32 будем использовать, например, выводы платы микроконтроллера D32 (GPIO32) и D33 (GPIO33). На вход ENABLE2 микросхемы драйвера моторов L293D подадим ШИМ сигнал, например, с вывода D27 (GPIO27).Входы ENABLE1 и ENABLE2 служат для включения H-мостов драйвера и используются для управления скоростью вращения электромоторов с помощью широтно-модулированного сигнала (ШИМ).
Схема подключения очень похожа на схему из примера "ESP32: Управление мотором" и представлена на рисунке ниже.
Пример монтажа схемы на макетных платах приведен в начале статьи.
Программа для управления скоростью мотора с помощью ШИМ (PWM)
Для работы с ШИМ нам понадобится класс PWM из модуля machine. Объект PWM создается на основе объекта Pin. Поэтому сначала создадим объект Pin для вывода GPIO27 (режим Pin.OUT указывать не нужно).Для установки частоты и коэффициента заполнения используем методы freq(frequency) и duty(duti_cycle). Значение frequency и duti_cycle должны быть целочисленными. Величина duti_cycle может лежать в пределах от 0 до 1023. Если задавать скорость мотора (speed) в процентах, то duti_cycle можно легко вычислить по формуле speed * 1023 / 100. Для скорости 50% значение duti_cycle будет 511.
Для отключения выхода ШИМ используется метод deinit(). Деинициализируем ШИМ в обработчике исключения KeyboardInterrupt. Там же остановим мотор.
Объект PWM можно создавать и с помощью конструктора, например так:
motor_pwm = PWM(Pin(27), freq=30, duty=512)
Для установки duti cycle можно также использовать методы:
duty_u16 — устанавливает рабочий цикл с 16-битной точностью в диапазоне 0–65535,
duty_ns — задает ширину импульса в наносекундах.
Программа на языке MicroPython может выглядеть следующим образом:
# из модуля machine импортируем классы Pin и PWM
from machine import Pin, PWM
# из модуля time импортируем функцию задержки sleep
from time import sleep
# функция для управления мотором
def motor(a, b):
motor_pin1.value(a)
motor_pin2.value(b)
# создаем объекты Pin для мотора
motor_pin1 = Pin(32, Pin.OUT)
motor_pin2 = Pin(33, Pin.OUT)
# создаем объекты Pin для ШИМ
motor_pin3 = Pin(27)
# создаем объекты ШИМ
motor_pwm = PWM(motor_pin3)
# зададим скорость мотора 50%
speed = 50
# вычисляем величину коэффициента заполнения для ШИМ
duty = int(speed * 1023 / 100)
# устанавливаем частоту для ШИМ
motor_pwm.freq(30)
# устанавливаем величину коэффициента заполнения для ШИМ
motor_pwm.duty(duty)
# организуем блок try для основного кода
try:
# организуем бесконечный цикл
while True:
# включаем мотор
# передаем в функцию motor 0 и 1
motor(0, 1)
# ждем 2 секунды
sleep(2)
# делаем реверс мотора
# передаем в функцию motor 1 и 0
motor(1, 0)
# ждем 2 секунды
sleep(2)
# останавливаем мотор
motor(0, 0)
# ждем 1 секунду
sleep(1)
# задаем обработку исключения для блока try, которое
# возникает при завершении программы пользователем
except KeyboardInterrupt:
# останавливаем мотор
motor_pin1.value(0)
motor_pin2.value(0)
# деинициализируем объект ШИМ
motor_pwm.deinit()
Запустим Iguana IDE – среду программирования для MicroPython. Скопируем в нее текст программы. Подключимся к микроконтроллеру с помощью USB-кабеля или по Wi-Fi и запустим программу. Вал мотора начнет вращаться со скоростью 50%, меняя направление вращения каждые 2 секунды и останавливаясь на 1 секунду.
Поэкспериментируем со значением переменной speed, наблюдая за скоростью вращения мотора.
Подробнее о загрузке и запуске программ можно прочитать в статьях "Первый проект на микроконтроллере ESP32" и "Программируем микроконтроллер ESP32 по Wi-Fi".
Удачный Вам экспериментов!
Хотите узнать больше об использовании и программировании микроконтроллеров? Попробуйте посмотреть другие статьи в разделе "Шаг за шагом" для создания полезных и забавных проектов!
ПОПУЛЯРНЫЕ СТАТЬИ |
Драйвер двигателей L293D
Для управления двигателями мини робота необходимо устройство, которое бы преобразовывало управляющие сигналы малой мощности в токи, достаточные для управления моторами. Такое устройство называют драйвером двигателей.
Как сделать простейшего робота
О том, как сделать робота в домашних условиях, используя лишь микросхему драйвера моторов и пару фотоэлементов. В зависимости от способа соединения моторов, микросхемы и фотоэлементов робот будет двигаться на свет или, наоборот, прятаться в темноту, следовать по линии или бежать за вашей рукой.
Первые проекты на микроконтроллере ESP32
В качестве первых проектов на ESP32 рассмотрим примеры мигания светодиодами и напишем программу "бегущие огни". Это классика при изучении микроконтроллеров.
Как сделать простого робота на микроконтроллере (Часть 1). Управляем электромоторами
Как самому сделать робота, используя драйвер управления двигателями L293D и микроконтроллер ATmega8. Схема робота и примеры простейших программ для управления моторами.
НОВЫЕ СТАТЬИ |
Можно ли сделать BEAM-робота на Raspberry Pi?
Ответ Марка Тилдена с уникальной фотографией одной из новых работ маэстро.
Изучаем Python: TOP-5 лучших сайтов для изучения Питона
Самоучитель, интерактивный учебник, наглядные задачи и примеры программ.
Роботы на одной микросхеме своими руками
Подборками статей myROBOT.ru. Практика создания роботов: схемы и советы по изготовлению. Чтобы сделать роботов, нет необходимости даже писать программы. Все роботы начнут работать сразу же, как только Вы подключите к ним питание.
ПОПУЛЯРНОЕ НА САЙТЕ |
Драйвер программатора USBASP для Windows 7, 8, 10
Универсальный драйвер программатора USBasp v 2.0 USB ISP без необходимости принудительного отключения сертификата драйвера или использования Zadig, достаточно скачать драйвер USBasp и запустить файл InstallDriver.exe.
Учимся программировать.
Среда программирования на ЛОГО
GAME LOGO — бесплатная среда программирования для увлекательного путешествия в мир программирования и информатики. Программирование на русском языке, удобный и красивый интерфейс, продуманный синтаксис.