Ардуино регулировка оборотов двигателя постоянного тока
Управление скоростью вращения двигателя постоянного тока с помощью Arduino
Двигатель постоянного тока – это наиболее часто используемый тип двигателя в робототехнике и электронных устройствах. Для управления скоростью вращения такого двигателя можно использовать различные методы, но в этом проекте мы будем использовать для этой цели широтно-импульсную модуляцию (ШИМ). Управлять скоростью вращения двигателя постоянного тока мы будем с помощью потенциометра, поворачивая его ручку.
Общий принцип использования ШИМ
Управляя скоростью модуляции ШИМ (Pulse Width Modulation, PWM) можно регулировать, к примеру, силу свечения светодиода – данный принцип пояснен на следующем рисунке. Аналогичный механизм используется и для управления скоростью вращения двигателя.
Если на представленном рисунке выключатель будет замкнут на протяжении некоторого времени, то на протяжении этого же времени лампочка будет гореть. Если переключатель будет замкнут в течение 8ms и будет разомкнут 2ms в течение интервала 10ms, тогда лампочка будет гореть только в течение интервала 8ms. В рассмотренном примере можно сказать, что среднее выходное напряжение (на лампочке) будет составлять 80% от напряжения батареи.
В другом случае выключатель замыкается на 5ms и размыкается на эти же самые 5ms в течение интервала 10ms, таким образом среднее напряжение на лампочке будет составлять 50% от напряжения батареи. Принято говорить, что если напряжение батареи 5В и цикл занятости составляет 50%, то среднее напряжение на оконечном устройстве (лампочке) будет составлять 2.5В.
В третьем рассмотренном на рисунке случае цикл занятости составляет 20% и поэтому среднее напряжение на оконечном устройстве (лампочке) будет составлять 20% от напряжения батареи.
Применяя все сказанное к рассматриваемому нами примеру управления скоростью вращения двигателем можно сказать, что чем больше будет коэффициент заполнения ШИМ (отношение длительности ON состояния к периоду), тем выше будет скорость вращения двигателя.
Необходимые компоненты
- Плата Arduino UNO (купить на AliExpress).
- Двигатель постоянного тока.
- Транзистор 2N2222 (купить на AliExpress).
- Потенциометр 100 кОм (купить на AliExpress).
- Конденсатор 0.1 нФ (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Схема устройства
Представлена на следующем рисунке.
Объяснение работы программы
Полный текст программы приведен в конце статьи, в этом разделе объяснено назначение ключевых элементов кода.
В ниже представленных строчках кода мы инициализируем переменные c1 и c2 и назначаем аналоговый контакт A0 выходу потенциометра, а 12-й контакт будем использовать для ШИМ.
Arduino.ru
Уважаемые Гуру программирования для Ардуино, помогите пожалуйста разобраться вот с какой пробемой — у меня есть купленный из китая Ардуино УНО, есть оптический датчик (использую как датчик оборотов), блок реле (2 шт) и собственного производства PowerShield, питающий всю схему, плюс на нем разъемы для подключения дисплея, датчика, блока реле. Задача тривиальная — регистрируем обороты с помощью оптического датчика, если они отклоняются от заданных, подаем сигнал на реле, которое включает моторчик, передвигающий ползунок реасата, который в свою очередь изменяет скорость вращения двигателя. Вот код:
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
А вместо связки реле-моторчик-реостат, транзистор и ШИМ нельзя применить? Или мощность двигателя не позволяет.
А то эта связка каким-то электро-панком попахивает, но выглядит наверное довольно зрелещно.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Все куда как круче: «ардуино-реле-моторчик-реостат-мотор»:)
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
точно high должно быть? И вставьте код по-человечески, пожалуйста
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Да, такая связка необходима, потому как последний моторчик в этой цепи на 7,5 кВт, соответственно реастат установлен в цепи параллельной обмотки возбуждения. Это что касается объекта управления. Реле действительно управляются сигналом низкого уровня. А вот как вставить код по человечески, немного не разобрался
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Уважаемые Гуру программирования
Как-то пропустил этот момент, подумалось что ТС школьник, которому я в силах помочь. Ну да ладно, хотя бы тему апнул.
Реле действительно управляются сигналом низкого уровня.
Да это понятно. Логика странная по-моему.
Могу посоветовать Вам стандартную процедуру дебага — выводить переменные в последовательный порт. Pulses не переполняется? И еще рпм = 1300 выкинули из условий
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Спасибо за совет, буду побывать различные варианты. Жаль, вот только, что программатор на плате спалил случайно.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Еще могу порекомендовать использовать внешние прерывания для подсчета импульсов. volatile Вы для чего использовали? И delay лучше на заменить на millis
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
volatile взял из примера с внешним прерыванием, однако, вне зависимости от того, считал ли я импульсы по нарастанию фронта или по спаду, ардуино мне выдавал что Бог надушу положет. поэтому пришлось отказаться и сделать счет импульсов в коде, при этом, чтобы защититься от ложных срабатываний, поставил защелку lock
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Код в человеческом виде 🙂
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Да, вот еще.
Когда реле не срабатывают, т.е. с оборотами все Ок, на дисплее всякая ересь не вылезает. Т.е. могу сделать вывод, что возможно какой-то косяк происходит при работе реле. Переменная rpm, такое ощущение, принимает случайное значение от 0 до 100, и конечно же реле отключаются. Вот только в коде у меня нет даже места, где бы я обнулял это значение
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Переменная rpm, такое ощущение, принимает случайное значение от 0 до 100, и конечно же реле отключаются. Вот только в коде у меня нет даже места, где бы я обнулял это значение
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Код в человеческом виде 🙂
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
заказывайте с запасом, это не последний трупик :))))
уверены, что помехи ему не мешают. энкодеры штука капризная, навык нужен.
ИМХО. код полная шляпа — в лупе два digitalRead(PIN_DO) , а потом работа с релюхами, да еще delay вешает контроллер периодически. Определение t=3 секунды ,за это время код в лупе проскакивает много раз и строки 47-72 исполняются много чаще чем требуется на определение влияния предыдущего воздействия. релюхи, как и Text(); необходимо засунуть перед строками 48-49 timeOld = millis(); pulses = 0;
и вообще энкодер необходимо посадить на прерывания, чтоб импульсы не терять, а уже после замеров корректировать и показывать индикацию.
7,5 кВт — ни о чем , какой ток и напруга обмотки возбуждения.
и вообще так писать (строки 31 и 36 ) очень глупо за это время состояние может измениться и оба неравенства будут не выполнены. для таких дел есть переменная boolean i == 0 или i != 0 или byte
ЗЫ сперва измерьте, потом посчитайте, потом запишите, потом измените, потом обнулите и начните с начала.
Регулятор скорости вращения двигателя постоянного тока на Attiny13
Не так давно возникла необходимость регулировать скорость вращения достаточно мощного двигателя постоянного тока. В связи с этим на микроконтроллере Attiny13 был разработан данный регулятор скорости, который с успехом может быть использован и в качестве диммера для светодиодов.
Контроллер работает на основе ШИМ, который является одним из лучших способов управления двигателем постоянного тока. В качестве драйвера использован полевой транзистор IRF540N, позволяющий управлять двигателем с током до 33 А при наличии большого радиатора.
Изменение рабочего цикла ШИМ и, следовательно, оборотов двигателя производиться с помощью поворотного энкодера.
Схема устройства
Для большей наглядности всю схему можно поделить на несколько частей:
Блок питания
Это типовой источник питания на стабилизаторе напряжения LM7805, который обеспечивает стабильное напряжение на уровне 5 В для питания микроконтроллера ATtiny13 и индикаторных светодиодов.
Индикаторные светодиоды
Для индикации значения рабочего цикла ШИМ используются 3 светодиода:
- LED1 — текущее значение
- LED2 — максимум
- LED3 — минимум
Светодиоды LED2 и LED3 через токоограничивающие резисторы подключены непосредственно к выводам ATtiny13. Светодиод LED1, который указывает на текущее значение рабочего цикла ШИМ, управляется посредством транзистора T1 (BC337).
Поворотный энкодер
Для правильной работы энкодера добавлены несколько компонентов. Резисторы R6 и R5 — это подтягивающие резисторы, которые «подтягивают» контакты A и B к шине питания. Контакт C напрямую подключен к GND. Конденсаторы C4 и C3 предназначены для фильтрации шума.
Драйвер на полевом транзисторе
Для управления двигателем использован N-канальный MOSFET IRF540N, который может обеспечить ток до 33A. Диод D2 предназначен для защиты транзистора от ЭДС самоиндукции, возникающей при выключении двигателя. Конденсатор C1 необходим для фильтрации помех, создаваемых двигателем. Если вы не установите этот конденсатор, то на энкодере могут возникнуть помехи и он не будет работать должным образом.
Убедитесь, что вы установили IRF540N на радиатор, потому что при высоких токах он становится очень горячим!
Урок 73. ПИД-регулятор скорости вращения двигателя постоянного тока. Разработка аппаратной части.
Первый из серии уроков, посвященных разработке регулятора скорости вращения коллекторного двигателя постоянного тока. Рассматривается аппаратное подключение двигателя к плате Ардуино.
Игорь из Москвы заказал мне разработку контроллера- регулятора скорости вращения двигателя постоянного тока.
Это продолжение бесконечной разработки интеллектуального сверлильного станка. Сначала я написал для него общую управляющую программу. Затем мы создали электронный прицел для станка на OSD-генераторе. Пришла очередь до двигателя, который вращает шпиндель.
Используется коллекторный двигатель постоянного тока мощностью 500 Вт и номинальным напряжением 100 В. Необходимо задавать и стабилизировать его скорость вращения.
Тема показалась мне очень интересной, и я решил в качестве уроков описать последовательность своих действий по разработке контроллера двигателя. Тем более в интернете эта тема ограничивается теоретическими рассуждениями.
Должен получиться учебный материал на несколько разных тем:
- аппаратное подключение двигателя постоянного тока к Ардуино;
- измерение частоты и периода сигнала ;
- управление нагрузкой с помощью ШИМ;
- ПИД-регулятор;
- этапы разработки подобных устройств.
Кроме того, я надеюсь, что получится законченный аппаратно-программный блок – ПИД-регулятор скорости вращения двигателя постоянного тока. Его можно будет использовать в различных приложениях.
У Игоря используется достаточно мощный мотор 500 Вт, с номинальным напряжением питания 100 В. У меня такого двигателя нет. Поэтому я проведу разработку и испытания на компьютерном вентиляторе с номинальным напряжением 12 В. Не сомневаюсь, что все написанное и разработанное будет справедливо и для гораздо более мощных устройств. По крайней мере, Игорь проверит контроллер на 500 ваттном моторе.
Аппаратное подключение двигателя постоянного тока к Ардуино.
Существуют две основные задачи:
- Необходимо управлять двигателем, изменяя на нем напряжение, а значит и мощность. Т.е. нужно создать регулирующий элемент, с помощью которого регулятор будет изменять состояние двигателя, увеличивать или уменьшать его скорость вращения.
- Надо измерять скорость вращения двигателя, чтобы регулятор мог ее контролировать.
Сошлюсь на Урок 39, раздел ”Общие сведения о регуляторах”. Там написано, что необходимо выделить:
- регулируемый параметр – что мы регулируем;
- регулирующий элемент – с помощью чего мы регулируем.
Аппаратную часть этих компонентов регулятора и будем разрабатывать в этом уроке.
Подключение двигателя к ШИМ Arduino.
Естественно для управления двигателем будем использовать ШИМ. Это значительно упростит схему, повысит КПД. Практически, независимо от мощности и напряжения мотора, для управления им достаточно одного ключа. Конечно, передельно-допустимые параметры ключа должны соответствовать двигателю. Для моего двигателя-вентилятора я выбрал такие элементы.
ШИМ с выхода Ардуино открывает и закрывает ключ, собранный на MOSFET-транзисторе. Можно, конечно, использовать и биполярный транзистор, но:
- полевым проще управлять;
- у него меньше падение напряжения в открытом состоянии, а значит он меньше греется;
- в отличие от биполярного транзистора, он работает на высоких частотах 100 кГц и выше.
Я выбрал MOSFET-транзистор IRF7341: N-канал, 55 В, 4 А. Кроме предельно-допустимых параметров необходимо учитывать то, что транзистор должен быть низкопороговым, т.е. открываться при небольшом напряжении (не более 5 В). Иначе необходимо использовать дополнительный элемент – драйвер.
Диод в схеме абсолютно необходим. Двигатель – это индуктивная нагрузка, а иногда и электрогенератор. Поэтому при закрытии транзистора на выводах двигателя могут возникать броски высокого напряжения. Они должны замыкаться через диод, чтобы не сжечь транзистор.
В некоторых подобных схемах используют низкочастотные выпрямительные диоды, например, 1N4007. Это допустимо только для дискретного управления двигателем: включить или выключить. При управлении с помощью ШИМ, особенно с высокой частотой, диод должен быть высокочастотным, лучше с барьером Шоттки.
При закрытом транзисторе диод находится в открытом состоянии, через него течет ток размагничивания обмотки двигателя. Затем транзистор открывается. А диод закрывается только через время восстановления обратного сопротивления. Даже у “быстрых” (FR307) диодов это время составляет 150-500 нс, у “супербыстрых” 35 нс, а у выпрямительных 1N4007 этот параметр не нормируется. Представьте себе, что при частоте ШИМ 100 кГц 100000 раз в секунду будет происходить короткое замыкание. Это приведет к жутким помехам, уменьшению КПД и нагреву диода и транзистора.
При высоком напряжении все значительно усугубиться. В общем рекомендации по выбору диода:
- Лучше всего диод Шоттки.
- Если высокое напряжение (более 150 В) не позволяет использовать диод Шоттки, то лучшим вариантом будет карбидокремиевые диоды Шоттки.
- Следующим приемлемым вариантом могут быть HEXFRED-диоды с ограничением обратного тока обратного восстановления;
- На крайний случай остаются супербыстрые и ультрабыстрые диоды.
У меня напряжение всего 12 В. Я выбрал диод Шоттки SS16.
Наверное, понятно, что меняя коэффициент заполнения ШИМ, мы будем изменять среднее напряжения на двигателе, я значит, и его мощность. Частоту ШИМ определим экспериментально.
Измерение скорости вращения.
Традиционным компонентом для измерения числа оборотов мотора служит датчик Холла. Это датчик, который показывает наличие магнитного поля, например, присутствие рядом с ним постоянного магнита. Для наших целей необходимы цифровые или дискретные датчики Холла. В отличие от аналоговых они срабатывают при превышении магнитным полем определенного порога и имеют гистерезис.
Конструкции измерителей скорости могут быть самыми разными. Можно закрепить на валу двигателя металлический диск с радиальными прорезями и использовать автомобильный датчик Холла.
Диск будет прерывать магнитное поле между датчиком Холла и постоянным магнитом. На прорезях магнитное поле будет проходить к датчику и таким образом, при вращении, будут формироваться импульсы.
Я поступил проще. Использовал дешевый, миниатюрный датчик Холла TLE4905L. В самых дорогих магазинах он стоит до 50 руб, а на АлиЭкспресс от 25 руб.
Это цифровой датчик Холла, настроенный на определенный порог магнитного поля. Он прекрасно срабатывает на расстоянии 8 мм от миниатюрного магнита диаметром 5 мм и толщиной 1 мм.
Конструкция измерителя очевидна. Я приклеил 2 магнита к диску вентилятора и над линией, по которой они двигаются при вращении, расположил датчик Холла.
Когда магниты проходят под датчиком, на его выходе формируются импульсы. Измерив частоту этих импульсов можно определить скорость вращения двигателя. На один оборот вырабатываются 2 импульса. Я использовал 2 магнита для того чтобы не нарушить балансировку вентилятора. Возможно, хватило бы и одного.
Как у датчика, так и у магнитов есть полярности. Поэтому перед тем, как устанавливать эти компоненты надо проверить в каком положении срабатывает датчик.
Датчик TLE4905L имеет выход с открытым коллектором. Он не формирует напряжение на выходе, а только замыкает или размыкает выход на землю. Со стороны приемника необходим внешний подтягивающий резистор.
Подключение датчика необходимо производить отдельными проводами. Все связи должны соединяться непосредственно на плате Ардуино. С точки зрения помехозащищенности это самое узкое место в системе.
Для задания скорости будем использовать переменный резистор. Подключим его к аналоговому входу платы Ардуино. Добавим еще сигнал включения/выключения двигателя и выход для тестовых импульсов. С помощью него будем проверять работу устройства без мотора.
С учетом всего вышесказанного окончательная схема контроллера-регулятора оборотов двигателя будет выглядеть так.
В реальных приложениях обороты можно задавать напряжением на аналоговом входе A0. Получится стандартный аналоговый интерфейс 0…5 В. Если необходим диапазон 0…10 В, то достаточно добавить резисторный делитель напряжения.
Состояние контроллера для отладки ПИД-регулятора будем передавать на компьютер через последовательный порт. Я разработаю программу верхнего уровня с регистрацией данных и отображением их в графическом виде. Регистратор значительно облегчает настройку любого ПИД-регулятора.