Arduino регулировка скорости двигателя

Управление скоростью вращения двигателя постоянного тока с помощью Arduino

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

Общий принцип использования ШИМ

Управляя скоростью модуляции ШИМ (Pulse Width Modulation, PWM) можно регулировать, к примеру, силу свечения светодиода – данный принцип пояснен на следующем рисунке. Аналогичный механизм используется и для управления скоростью вращения двигателя.

Если на представленном рисунке выключатель будет замкнут на протяжении некоторого времени, то на протяжении этого же времени лампочка будет гореть. Если переключатель будет замкнут в течение 8ms и будет разомкнут 2ms в течение интервала 10ms, тогда лампочка будет гореть только в течение интервала 8ms. В рассмотренном примере можно сказать, что среднее выходное напряжение (на лампочке) будет составлять 80% от напряжения батареи.

В другом случае выключатель замыкается на 5ms и размыкается на эти же самые 5ms в течение интервала 10ms, таким образом среднее напряжение на лампочке будет составлять 50% от напряжения батареи. Принято говорить, что если напряжение батареи 5В и цикл занятости составляет 50%, то среднее напряжение на оконечном устройстве (лампочке) будет составлять 2.5В.

В третьем рассмотренном на рисунке случае цикл занятости составляет 20% и поэтому среднее напряжение на оконечном устройстве (лампочке) будет составлять 20% от напряжения батареи.

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

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

Схема устройства

Представлена на следующем рисунке.

Объяснение работы программы

Полный текст программы приведен в конце статьи, в этом разделе объяснено назначение ключевых элементов кода.

В ниже представленных строчках кода мы инициализируем переменные c1 и c2 и назначаем аналоговый контакт A0 выходу потенциометра, а 12-й контакт будем использовать для ШИМ.

Источник

УПРАВЛЕНИЕ МОТОРОМ С ARDINO

Библиотека подходит для большинства драйверов, построенных по схеме H-мост, на два мотора они обычно имеют 4 входа (по 2 на каждый). Также на сайте есть отдельный подробный урок по работе с коллекторными моторами.

Стоимость Aliexpress L298N 4-50V 1A (2A) 100р Купить MX1508 2-9.6V 1.5A (2.5A) 20р Купить TA6586 3-14V 5A (7A) 100р (чип 30р) Купить, купить, купить чип L9110S 2.5-12V 0.8A (1.5A) 50р Купить TB6612 4.5-13.5V 1.2A (3A) 80р Купить BTS7960 5.5-27V 10A (43A) 300р Купить Большой 3-36V 10A (30A) 700р Купить

Читайте также:  Настройка и регулировка мта для вспашки

БИБЛИОТЕКА GYVERMOTOR

GyverMotor v3.1

Библиотека для удобного управления моторчиками через драйвер полного моста для Arduino

Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции).

В версии 2.2 добавлена поддержка плат на базе ESP

Подключение

Библиотека подходит для большинства драйверов, построенных по схеме H-мост, на два мотора они обычно имеют 4 входа (по 2 на каждый)

ДОКУМЕНТАЦИЯ

Документация

Инициализация

Библиотека поддерживает три типа драйверов:

Инициализация происходит следующим образом:

Настройки

51, максимум останется прежним (диапазон сигнала переведётся в 50.. 255 внутри библиотеки).

Режим работы

Управление скоростью и направлением

Разрешение ШИМ

setSpeed(speed) может работать с ШИМ любого разрешения, для этого нужно

Несколько моторов могут работать на одной плате с разным разрешением, т.е. например 2 мотора на таймере 1 с разрешением 10 бит, и ещё два на таймере 2 с разрешением 8 бит.

Плавное управление скоростью

В библиотеке реализован готовый инструмент для плавного изменения скорости, что может обеспечить плавный пуск и остановку механизмов:

В примере smooth_control можно открыть плоттер и посмотреть, как работает алгоритм.

Источник

ОБОРУДОВАНИЕ
ТЕХНОЛОГИИ
РАЗРАБОТКИ

Блог технической поддержки моих разработок

Урок 74. Регулировка скорости вращения двигателя без обратной связи. Измерение периода и частоты сигналов с помощью Ардуино.

Продолжение разработки ПИД-регулятора скорости вращения двигателя постоянного тока. В уроке запустим двигатель без обратной связи. Научимся измерять временные параметры импульсов дискретного сигнала.

Попробуем управлять двигателем только с помощью ШИМ, не используя датчик оборотов.

Регулировка скорости вращения двигателя без обратной связи.

Я написал простую программу, которая формирует ШИМ пропорциональный напряжению на входе A0.

Вот скетч программы:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Поясню, что такое “мертвое время”. Допустим, ШИМ работает с высокой частотой, например, 62,5 кГц. Если мы зададим ему коэффициент заполнения 1, то это означает, что с периодом 16 мкс будет формироваться импульс длительностью 0,0625 мкс. Импульс такой короткой длительности транзисторный ключ не отработает, не успеет. В результате транзистор будет какое-то время в полуоткрытом режиме и не к чему хорошему это не приведет. Особенно на высоком напряжении.

Поэтому необходимо искусственно ограничивать импульсы минимальной длины. Если значение 1 транзистор не способен отработать, значит, вместо него необходимо формировать 0. Тоже самое в конце диапазона ШИМ. Например, значение 254 необходимо заменить на 255.

Отработку ”мертвого времени» производит следующий блок программы.

#define DEAD_TIME 10 // мертвое время

Если значение ШИМ меньше заданного, оно заменяется на 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 сек.

Измерять период с точностью десятков микросекунд чисто программными средствами невозможно. Даже если мы подадим измеряемый сигнал на вход внешнего прерывания, вряд ли это позволит решить задачу. Обработка прерывания может задерживаться другими прерываниями, например, счетчиком системного времени. А это будет искажать время измерения.

Поэтому будем использовать аппаратный узел микроконтроллера – таймер в режиме захвата. У микроконтроллера ATmega328 только таймер 1 может работать в этом режиме.

Лучше будет, если вы почитаете об этом режиме в документации на ATmega328. Я расскажу коротко и чисто с практической точки зрения.

Читайте также:  Металлический браслет для часов регулировка

Входной сигнал подключаем к входу ICP1 (вывод 8). Использование других выводов недопустимо.

Микроконтроллер выделяет нужный фронт сигнала на входе ICP1 (я задал перепад с высокого уровня на низкий) и по нему перегружает содержимое таймера 1 в специальный регистр ICR1. Можно считать значение этого регистра и тем самым узнать, когда был перепад входного сигнала, даже если чтение произошло позже самого события.

Дальше немного сложно в понимании, но объем информации небольшой. При желании можно разобраться по шагам.

Мы задаем режим работы таймера 1. Переводим его в режим простого счетчика от внутреннего генератора с максимальной частотой. В этом режиме каждые 0,0625 мкс к счетчику прибавляется 1. При достижении максимального значения 65536, он начинает считать с 0. Также задаем режимы для захвата и разрешаем прерывания таймера 1 по захвату и переполнению.

Создаем обработчик прерывания по захвату (фронту входного сигнала).

Дальше нам надо сбросить счетчик таймера в 0, чтобы отсчет следующего времени начался с 0. Но с момента, когда реально был захват, прошло неизвестное нам время. Надо было его сбрасывать в 0 в момент захвата. Но тогда мы, возможно, отрабатывали другое прерывание. Поэтому мы вычитаем из счетчика значение его в момент захвата.

Что равносильно сбросу в 0 в момент захвата.

Все было бы хорошо, но при периоде сигнала более 4096 мкс ( 65536 * 0,0625 мкс) таймер 1 переполнится. Значит, нам надо считать еще и переполнения таймера 1.

Для этого создаем обработчик прерываний по переполнению таймера.

// прерывание по переполнению таймера 1
ISR (TIMER1_OVF_vect) <
numOverflowTimer1++;
>

И полученное значение прибавляем к 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 мс.

Высокой точности от формирования тестового сигнала с помощью системного времени ждать не приходится. Но измеритель работает нормально в широком диапазоне периода входного сигнала.

Такой способ измерения частоты и периода сигналов может использоваться в других приложениях.

В следующем уроке вернемся к двигателю. Будем измерять его скорость вращения.

Источник

Оцените статью
( Пока оценок нет )
Поделиться с друзьями
Настройки и регулировки