- Урок 74. Регулировка скорости вращения двигателя без обратной связи. Измерение периода и частоты сигналов с помощью Ардуино.
- Управление скоростью вращения двигателя постоянного тока с помощью Arduino
- Общий принцип использования ШИМ
- Необходимые компоненты
- Схема устройства
- Объяснение работы программы
- Библиотека для шагового двигателя Arduino v1.15
- ОБНОВЛЕНИЯ
- ТЕОРИЯ
- БИБЛИОТЕКА
- GyverStepper v1.15
- Совместимость
- 📸 Видео
Видео:Уроки Arduino. Управление моторами с библиотекой GyverMotorСкачать
Урок 74. Регулировка скорости вращения двигателя без обратной связи. Измерение периода и частоты сигналов с помощью Ардуино.
Продолжение разработки ПИД-регулятора скорости вращения двигателя постоянного тока. В уроке запустим двигатель без обратной связи. Научимся измерять временные параметры импульсов дискретного сигнала.
Попробуем управлять двигателем только с помощью ШИМ, не используя датчик оборотов.
Регулировка скорости вращения двигателя без обратной связи.
Я написал простую программу, которая формирует ШИМ пропорциональный напряжению на входе A0.
- Измеряет напряжение сигнала на входе A0.
- Усредняет его для защиты от помех.
- Формирует ШИМ с коэффициентом заполнения пропорциональным среднему напряжению на выводе A0.
- При формировании ШИМ учитывает “мертвое время”.
- Выводит значение ШИМ в последовательный порт для контроля.
Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!
Поясню, что такое “мертвое время”. Допустим, ШИМ работает с высокой частотой, например, 62,5 кГц. Если мы зададим ему коэффициент заполнения 1, то это означает, что с периодом 16 мкс будет формироваться импульс длительностью 0,0625 мкс. Импульс такой короткой длительности транзисторный ключ не отработает, не успеет. В результате транзистор будет какое-то время в полуоткрытом режиме и не к чему хорошему это не приведет. Особенно на высоком напряжении.
Поэтому необходимо искусственно ограничивать импульсы минимальной длины. Если значение 1 транзистор не способен отработать, значит, вместо него необходимо формировать 0. Тоже самое в конце диапазона ШИМ. Например, значение 254 необходимо заменить на 255.
Отработку ”мертвого времени» производит следующий блок программы.
#define DEAD_TIME 10 // мертвое время
// мертвое время
if( valPwm
if( valPwm > (MAX_PWM — DEAD_TIME) ) valPwm= MAX_PWM;
Если значение ШИМ меньше заданного, оно заменяется на 0. Если больше, то оно равно максимальному значению ШИМ.
В программе в определенных пределах можно изменять частоту периода ШИМ.
TCCR2B= 1; // 62 500 Гц
//TCCR2B= 2; // 7 812 Гц
// TCCR2B= 3; // 1 953 Гц
// TCCR2B= 4; // 977 Гц
// TCCR2B= 5; // 488 Гц
// TCCR2B= 6; // 244 Гц
// TCCR2B= 7; // 61 Гц
Для формирования ШИМ используется таймер 2 и вывод 11.
Можно переключиться на вывод 3. Изменения коснутся только строки.
Использование других выводов недопустимо.
Загружаем скетч в контроллер, открываем монитор последовательного порта.
Вращаю переменный резистор, подключенный к входу A0. Монитор показывает изменение ШИМ. В положении резистора от 0 до максимума ШИМ равен 0, затем скачком меняется до 10. Дальше плавное изменение до 245 и скачок до 255. Т.е. заданное ”мертвое время” 10 отрабатывается правильно.
Дальше подключаем к схеме питание 12 В и проверяем работу ключа с мотором-вентилятором. Я проверил для разных частот ШИМ. Как не странно, лучше всего работает на низких частотах 244 и 61 Гц. Мотор начинает вращаться с ШИМ равным 30. На частоте 62,5 кГц вентилятор начинает вращаться при значении ШИМ 60. На средних частотах он еще противно пищит.
Когда Игорь проводил эти испытания на мощном двигателе 500 Вт, он категорично выбрал высокую частоту 62,5 кГц. На высоких частотах его двигатель вращается равномерно, без вибраций. Тише работает, начинает крутиться с меньшего значения ШИМ. Т.е. для каждого двигателя лучше выбирать частоту ШИМ экспериментально.
В любом случае регулировка с помощью ШИМ без обратной связи работает, скорость двигателя изменяется плавно. Конечно, частота оборотов непредсказуема и зависит от механической нагрузки.
Измерение периода и частоты входных импульсов с помощью Ардуино.
Чтобы стабилизировать скорость вращения мотора необходимо ее измерять. А скорость в свою очередь определяется частотой импульсов датчика Холла. Об этом сказано в предыдущем уроке. Как следствие возникает задача – измерение периода и частоты импульсов. Давайте на короткое время забудем про двигатель и научимся измерять частоту импульсов дискретного сигнала.
Задача не очень простая. Скорость вращения мотора у Игоря достигает 12000 об/мин. При такой скорости и использовании с датчиком Холла двух магнитов надо измерять временные параметры с периодом 2,5 мс. Если мы хотим обеспечить точность не более 1%, то разрешающая способность измерителя должна быть не более 250 мкс.
Но бывают и более скоростные двигатели. Часто используются датчики, которые формируют более 2 импульсов на оборот. Это еще уменьшает время дискретности измерителя.
А с другой стороны двигатель может вращаться и со скоростью 60 об/мин. Это соответствует периоду импульсов 0,5 сек.
- наш измеритель должен иметь высокую разрешающую способность по времени (не более десятков мкс)
- и широкий диапазон измерения (не менее 1 сек).
Измерять период с точностью десятков микросекунд чисто программными средствами невозможно. Даже если мы подадим измеряемый сигнал на вход внешнего прерывания, вряд ли это позволит решить задачу. Обработка прерывания может задерживаться другими прерываниями, например, счетчиком системного времени. А это будет искажать время измерения.
Поэтому будем использовать аппаратный узел микроконтроллера – таймер в режиме захвата. У микроконтроллера ATmega328 только таймер 1 может работать в этом режиме.
Лучше будет, если вы почитаете об этом режиме в документации на ATmega328. Я расскажу коротко и чисто с практической точки зрения.
Входной сигнал подключаем к входу ICP1 (вывод 8). Использование других выводов недопустимо.
Микроконтроллер выделяет нужный фронт сигнала на входе ICP1 (я задал перепад с высокого уровня на низкий) и по нему перегружает содержимое таймера 1 в специальный регистр ICR1. Можно считать значение этого регистра и тем самым узнать, когда был перепад входного сигнала, даже если чтение произошло позже самого события.
Дальше немного сложно в понимании, но объем информации небольшой. При желании можно разобраться по шагам.
Мы задаем режим работы таймера 1. Переводим его в режим простого счетчика от внутреннего генератора с максимальной частотой. В этом режиме каждые 0,0625 мкс к счетчику прибавляется 1. При достижении максимального значения 65536, он начинает считать с 0. Также задаем режимы для захвата и разрешаем прерывания таймера 1 по захвату и переполнению.
// установка режима захвата таймера 1
pinMode (8, INPUT_PULLUP); // вход сигнала захвата ICP, входные измеряемые импульсы
TCCR1A = 0; // нормальный режим работы таймера 1
TCCR1B = 0; // выбор отрицательного фронта входного сигнала
TCCR1B = (1 включение подавления шума входного сигнала, частота тактирования — внутренний генератор, без деления
TCNT1 = 0; // сброс счетчика
TIMSK1 = (1 разрешения прерываний таймера 1 по захвату и переполнению
Создаем обработчик прерывания по захвату (фронту входного сигнала).
// прерывание по сигналу захват (по отрицательному фронту измеряемого сигнала)
ISR (TIMER1_CAPT_vect)
В нем мы считываем значение регистра ICR1 и сохраняем его в переменной periodTime .
Дальше нам надо сбросить счетчик таймера в 0, чтобы отсчет следующего времени начался с 0. Но с момента, когда реально был захват, прошло неизвестное нам время. Надо было его сбрасывать в 0 в момент захвата. Но тогда мы, возможно, отрабатывали другое прерывание. Поэтому мы вычитаем из счетчика значение его в момент захвата.
Что равносильно сбросу в 0 в момент захвата.
В результате вышеописанных действий в переменной periodTime оказывается время между захватами. Т.е. время между отрицательными фронтами входного сигнала. Реальное время будет равно значению periodTime , умноженному на дискретность таймера 0,0625 мкс.
Все было бы хорошо, но при периоде сигнала более 4096 мкс ( 65536 * 0,0625 мкс) таймер 1 переполнится. Значит, нам надо считать еще и переполнения таймера 1.
Для этого создаем обработчик прерываний по переполнению таймера.
// прерывание по переполнению таймера 1
ISR (TIMER1_OVF_vect)
И полученное значение прибавляем к periodTime.
periodTime = (unsigned long)ICR1 | (((unsigned long)numOverflowTimer1)
Теперь все. В переменной periodTime получаем период входных импульсов. Для вычисления реального времени необходимо умножить его на 0,0625 мкс.
Пишем программу измерения временных параметров входного сигнала и проверяем ее работу.
Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!
Для проверки формируем на выводе 5 сигнал ШИМ с частотой 976,56 Гц.
analogWrite(5, 200); // формирование тестовых импульсов на выводе 5 (976,56 Гц)
Соединяем вывод 8 с выводом 5. Запускаем монитор последовательного порта.
Тестовый сигнал формируется аппаратным способом, поэтому имеет высокую стабильность.
Надо проверить работу нашего измерителя в полном диапазоне.
Для этого тестовый сигнал на выводе 5 формируем с помощью системного времени Ардуино.
Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!
#define TEST_TIME 10 // время периода тестового сигнала (мс)
Проверяем для периода 10 мс.
Высокой точности от формирования тестового сигнала с помощью системного времени ждать не приходится. Но измеритель работает нормально в широком диапазоне периода входного сигнала.
Такой способ измерения частоты и периода сигналов может использоваться в других приложениях.
В следующем уроке вернемся к двигателю. Будем измерять его скорость вращения.
Видео:Управление скоростью мотора с Arduino | PWM, ШИМ, Транзистор...что?Скачать
Управление скоростью вращения двигателя постоянного тока с помощью Arduino
Двигатель постоянного тока – это наиболее часто используемый тип двигателя в робототехнике и электронных устройствах. Для управления скоростью вращения такого двигателя можно использовать различные методы, но в этом проекте мы будем использовать для этой цели широтно-импульсную модуляцию (ШИМ). Управлять скоростью вращения двигателя постоянного тока мы будем с помощью потенциометра, поворачивая его ручку.
Видео:Управление моторами с ArduinoСкачать
Общий принцип использования ШИМ
Управляя скоростью модуляции ШИМ (Pulse Width Modulation, PWM) можно регулировать, к примеру, силу свечения светодиода – данный принцип пояснен на следующем рисунке. Аналогичный механизм используется и для управления скоростью вращения двигателя.
Если на представленном рисунке выключатель будет замкнут на протяжении некоторого времени, то на протяжении этого же времени лампочка будет гореть. Если переключатель будет замкнут в течение 8ms и будет разомкнут 2ms в течение интервала 10ms, тогда лампочка будет гореть только в течение интервала 8ms. В рассмотренном примере можно сказать, что среднее выходное напряжение (на лампочке) будет составлять 80% от напряжения батареи.
В другом случае выключатель замыкается на 5ms и размыкается на эти же самые 5ms в течение интервала 10ms, таким образом среднее напряжение на лампочке будет составлять 50% от напряжения батареи. Принято говорить, что если напряжение батареи 5В и цикл занятости составляет 50%, то среднее напряжение на оконечном устройстве (лампочке) будет составлять 2.5В.
В третьем рассмотренном на рисунке случае цикл занятости составляет 20% и поэтому среднее напряжение на оконечном устройстве (лампочке) будет составлять 20% от напряжения батареи.
Применяя все сказанное к рассматриваемому нами примеру управления скоростью вращения двигателем можно сказать, что чем больше будет коэффициент заполнения ШИМ (отношение длительности ON состояния к периоду), тем выше будет скорость вращения двигателя.
Видео:Урок №9 Электромотор (управляем скоростью вращения) | iarduino.ruСкачать
Необходимые компоненты
- Плата Arduino UNO (купить на AliExpress).
- Двигатель постоянного тока.
- Транзистор 2N2222 (купить на AliExpress).
- Потенциометр 100 кОм (купить на AliExpress).
- Конденсатор 0.1 нФ (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Видео:ПОДКЛЮЧАЕМ ШАГОВЫЙ ДВИГАТЕЛЬ К ARDUINO [Уроки Ардуино #14]Скачать
Схема устройства
Представлена на следующем рисунке.
Видео:Уроки Arduino - управление бесколлекторным моторомСкачать
Объяснение работы программы
Полный текст программы приведен в конце статьи, в этом разделе объяснено назначение ключевых элементов кода.
В ниже представленных строчках кода мы инициализируем переменные c1 и c2 и назначаем аналоговый контакт A0 выходу потенциометра, а 12-й контакт будем использовать для ШИМ.
Видео:Регулятор скорости вращения для биполярного шагового двигателя на базе Arduino Nano.Скачать
Библиотека для шагового двигателя Arduino v1.15
Видео:Управление двигателем постоянного тока. Схема управления мотором Ардуино проекты.Скачать
ОБНОВЛЕНИЯ
- v1.13 – исправлены мелкие баги, оптимизация
- v1.14 – исправлены ошибки разгона и торможения в KEEP_SPEED
- v1.15 – оптимизация, исправлены мелкие баги, stop() больше не сбрасывает maxSpeed
Видео:Управление двигателем постоянного тока, линейным приводом. АрдуиноСкачать
ТЕОРИЯ
Для подключения шаговых моторов к Arduino нужно использовать драйверы. Очень дешёвые и популярные моторы 28byj-48-5v часто продаются вместе со своим драйвером (транзисторная сборка ULN2003), подключить можно к любым 4-м пинам Ардуино и использовать.
Для работы с большими шаговиками (типа Nema 17) нужно использовать специализированные драйверы, ниже вы найдёте описания и схемы подключения для A4988, DRV8825 и TMC2208, драйверы такого формата подключаются и работают практически одинаково, т.к. разработаны для CNC шилдов и взаимозаменяемы. У этих драйверов нужно настроить ток при помощи крутилки на плате. Это можно сделать “на глаз”, заставив мотор вращаться и регулируя крутилку. Мотор должен вращаться, но не вибрировать как перфоратор и сильно не нагреваться. Лучше настроить ток по опорному напряжению Vref, у каждого драйвера оно считается по своей формуле (см. картинки ниже). Берём ток своего мотора из описания, подставляем в формулу вместо current, считаем, и накручиваем полученное напряжение крутилкой. Для измерения опорного напряжения нужно подключить щупы вольтметра к самой крутилке и пину GND.
Главное преимущество дорогущих драйверов TMC – отсутствие шума/свиста/вибраций при работе, так как драйвер своими силами интерполирует сигнал до микрошага 1/256.
Видео:Н-мост. Направление и скорость вращения моторомСкачать
БИБЛИОТЕКА
GyverStepper v1.15
Производительная библиотека для управления шаговыми моторами с Arduino
- Поддержка 4х пинового (шаг и полушаг) и STEP-DIR драйверов
- Автоматическое отключение питания при достижении цели
- Режимы работы:
- Вращение с заданной скоростью. Плавный разгон и торможение с ускорением
- Следование к позиции с ускорением и ограничением скорости
- Следование к позиции с заданной скоростью (без ускорения)
- Мой планировщик обеспечивает максимальную производительность: скорость до 30’000 шагов/сек с ускорением (активен по умолчанию)
- Модифицированный планировщик из AccelStepper: максимальную плавность и скорость до 7’000 шагов/сек с ускорением (для активации пропиши дефайн SMOOTH_ALGORITHM)
Совместимость
Совместима со всеми Arduino платформами (используются Arduino-функции)
📸 Видео
Простое управление оборотами шагового двигателя.Скачать
Уроки Ардуино #11 - плавное управление нагрузкой, ШИМ сигналСкачать
Управление мотором ардуиноСкачать
Как настроить ШАГОВЫЙ ДВИГАТЕЛЬ 28BYJ-48 Arduino?! ОбзорСкачать
Управление скоростью вращения двигателя через транзистор на платформе Arduino UnoСкачать
Как подключить шаговый двигатель к ArduinoСкачать
Вращение шагового двигателя вправо влево от двух кнопок от Arduino с ускорениемСкачать
Согласованная работа двух шаговых двигателей на ардуино.Скачать
Управление биполярным шаговым двигателем при помощи инкрементального энкодера. Инкрементный энкодер.Скачать
Регулятор скорости для бесколлекторного двигателяСкачать