Датчик обороты для двигателя ардуино

Как регулировать обороты двигателя постоянного тока через Arduino

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

Вообще, правильное название миниатюрных двигателей — это коллекторный двигатель постоянного тока с постоянными магнитами или модельный электродвигатель. Магниты в них располагаются на статоре и играют роль обмотки возбуждения. Модельными они называются из-за того, что их часто используют в радиоуправляемых моделях.

Регулировка оборотов

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

При изменении питающего напряжения изменяется ток в обмотках, следовательно изменяется и подводимая мощность и его обороты. Есть два основных способа изменения напряжения на клеммах таких электродвигателей — использовать балластные резисторы для ограничения тока или использовать ШИМ-регулирование.

Балластные резисторы греются, выделяют энергию в виде тепла в воздух – это не эффективно и бесполезно.

Смысл ШИМ-регулирования состоит в подаче импульсов с фиксированной частотой, но изменяющейся шириной. От ширины импульса зависит действующее напряжение на подключенной нагрузке и вычисляется по формуле:

где Uнагр – напряжение на нагрузке, Uпит – напряжение источника питания, k – коэффициент заполнения.

Коэффицент заполнения – то отношение ширины импульса (tимп) к периоду (T), то есть:

На рисунке ниже вы видите, как выглядит питание нагрузки через ШИМ-регулятор при разных коэффициентах заполнения.

Короче говоря,при ШИМ-регулировании питание очень быстро включается и отключается, то есть подаётся импульсами. И чем уже эти импульсы – тем меньшее напряжение доходит до нагрузки.

Для ШИМ-регулирования можно собрать схему на таймере NE555 и других микросхемах либо использовать микроконтроллер.

Семейство плат с микроконтроллером ардуино также способно выдавать ШИМ сигнал, стандартная частота ШИМ у них 500Гц, а если быть точным, то 488,28 Гц. Если вам не принципиальная частота – то можно использовать как есть без сторонних библиотек. Отмечу, что для большинства применений этого достаточно. Не очень хорошо это подходит для регулирования яркости осветительных приборов из-за повышения коэффициента пульсаций светильника и вреда для зрения в итоге.

Обратите внимание на иллюстрацию, приведенную выше. Из неё мы видим микроконтроллер Atmega328, который лежит в основе этих плат выдаёт ШИМ-сигнал только на выходах 3, 5, 6, 9, 10, 11, которые обычно помечены знаком «

» плате, а на картинках с распиновками сокращением «PWM».

Подключение к Arduino

Напрямую к порту ардуино подключать нагрузку для диммирования нельзя, так как он может выдать всего 20 мА. То есть напрямую к порту можно подключать отдельные маломощные 5-мм светодиоды, во всех остальных случаях – используйте транзистор. В последнем случае максимальная нагрузка зависит от типа транзистора.

Как мы уже определились ШИМ у нас выдают только пины с номерами 3, 5, 6, 9, 10, 11. Значит, к ним и будем подключать нагрузку. В качестве транзистора предлагаю использовать полевой транзистор (MOSFET) IRF840 – он N-канальный со встроенным обратным диодом для защиты от всплесков противо-ЭДС, его характеристики:

  • Предельно допустимое напряжение сток-исток (Uds): 500 V
  • Предельно допустимое напряжение затвор-исток (Ugs): 20 V
  • Пороговое напряжение включения Ugs(th): 4 V
  • Максимально допустимый постоянный ток стока (Id): 8 A

Можно использовать и другие транзисторы с логическим уровнем включения затвора ( Ugs(th) до 5В), в противном случае придется использовать драйвер или промежуточный транзистор для его открытия.

Кроме транзистора нам нужно 2 резистора — первый между выходом платы и затвором на 240 Ом (если его у вас нет – возьмите соседние номиналы) для ограничения тока заряда затворной ёмкости, так мы снизим вероятность выхода из строя порта и просадок по питанию. Второй резистор на 10-12 кОм подключим между затвором и землёй. Он нужен для того, чтобы затвор не висел в воздухе, а также разряда затворной ёмкости и ускорения закрытия полевика. Схему подключения вы видите ниже.

Читайте также:  Как поставить подогрев двигателя на форд транзит

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

Соберем эту схему.

Для ШИМ в родной библиотеке Arduino IDE есть специальная функция — analogWrite (pin, value), в ней pin – номер порта, на который нужно выдавать сигнал, а value – его величина от 0 до 255. То есть при значении value равном 255 коэффициент заполнения на выходе будет равен 1, т.е. будет непрерывный сигнал на входе, а при 127 — почти 50%.

Для нашего эксперимента достаточно простенького кода, который вы видите далее.

int pot = A1; // назначаем вход А1 для чтения сигнала с потенциометра

int motor = 5; // к этому выходу подключаем затвор полевого тразнистора

analogWrite(motor, map (analogRead(pot), 0, 1023, 0, 255));

Функция map, которая используется в качестве второго аргумента функции analogWrite позволяет сократить код на несколько строчек. Её назначение преобразовать одни размерности в другие. Чтобы понять, как она работает рассмотрим её синтаксис:

map(value, fromLow, fromHigh, toLow, toHigh),

где: value – откуда брать величину, в приведенном выше примере мы её считываем функцией analogRead с пина, объявленного в переменной pot (это А1), fromLow – минимальное значение, которое будет участвовать в преобразовании (у нас это 0), fromHigh – максимальное значение для преобразования (у нас это 1023, потому что это максимальное значение, которое «видит» ардуина при чтении аналогового сигнала), toLow – в какое значение преобразовывать минимальное значение со входа, toHigh – в какое значение преобразовывать максимальное значение со входа (у нас это 255, потому что это максимальное число, которое можно записать в analogWrite).

То есть мы получаем любое число от 0 до 1023, а функция возвращает число от 0 до 255. Таким образом, у нас происходит преобразование, в общем-то, с сохранением величины в процентах (комментаторов прошу подсказать, как правильно назвать такое преобразование).

Заключение

ШИМ-регуирование с помощью ардуино реализуется достаточно просто. Оно с лёгкостью может использовать в самодельных радиоуправляемых моделях или роботах, а также для регулировки яркости каких-либо индикаторов и создания световых эффектов. Повторюсь, что для диммирования светильников и светодиодных лент он не очень хорошо подходит из-за низкой частоты.

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

Ну и прилагаем видео, в котором иллюстрируется работа схемы рассмотренной в статье

Источник

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

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

Урок 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) <
periodTime = (unsigned long)ICR1 | (((unsigned long)numOverflowTimer1)
TCNT1 -= ICR1;
numOverflowTimer1 = 0;
>

В нем мы считываем значение регистра ICR1 и сохраняем его в переменной periodTime .

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

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

В результате вышеописанных действий в переменной periodTime оказывается время между захватами. Т.е. время между отрицательными фронтами входного сигнала. Реальное время будет равно значению periodTime , умноженному на дискретность таймера 0,0625 мкс.

Все было бы хорошо, но при периоде сигнала более 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 мс.

Вот период 100 мс

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

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

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

Источник

Adblock
detector