Двигатель постоянного тока – это наиболее часто используемый тип двигателя в робототехнике и электронных устройствах. Для управления скоростью вращения такого двигателя можно использовать различные методы, но в этом проекте мы будем использовать для этой цели широтно-импульсную модуляцию (ШИМ). Управлять скоростью вращения двигателя постоянного тока мы будем с помощью потенциометра, поворачивая его ручку.
Общий принцип использования ШИМ
Управляя скоростью модуляции ШИМ (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).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема устройства
Представлена на следующем рисунке.
Объяснение работы программы
Полный текст программы приведен в конце статьи, в этом разделе объяснено назначение ключевых элементов кода.
В ниже представленных строчках кода мы инициализируем переменные c1 и c2 и назначаем аналоговый контакт A0 выходу потенциометра, а 12-й контакт будем использовать для ШИМ.
1 2 3 4 |
int pwmPin = 12; int pot = A0; int c1 = 0; int c2 = 0; |
В следующих строчках кода мы устанавливаем контакт A0 на ввод данных, а контакт 12 (который является контактом ШИМ) на вывод данных.
1 2 3 4 |
void setup() { pinMode(pwmPin, OUTPUT); // pin 12 - на вывод данных pinMode(pot, INPUT); // pin A0 - на ввод данных } |
Теперь, в функции loop (), мы считываем аналоговое значение с контакта A0, используя функцию analogRead(pot), и сохраняем его в переменной c2. Затем мы вычитаем значение c2 из 1024 и сохраняем получившийся результат в c1. Затем подаем на контакт 12 ШИМ высокий уровень (HIGH) и после задержки, определяемой переменной c1, подаем на этот контакт низкий уровень (LOW). После этого выполняем задержку, определяемую переменной LOW, и продолжаем цикл сначала.
Причина, по которой мы вычитаем аналоговое значение из 1024, состоит в следующем. Дело в том, что аналого-цифровой преобразователь (АЦП) Arduino Uno имеет разрешение 10 бит, то есть может принимать целые значения в интервале 0 - 2^10 = 1024. Это означает что он преобразует входное значение напряжения в интервале от 0 до 5 В в целое значение в интервале от 0 до 1024. Таким образом, если мы умножим входное значение напряжения на 5/1024, то мы получим цифровое значение входного напряжения.
1 2 3 4 5 6 7 8 |
void loop() { c2= analogRead(pot); c1= 1024-c2; digitalWrite(pwmPin, HIGH); // подаем напряжение высокого уровня на pin 12 delayMicroseconds(c1); // ждем c1 микросекунд (high time) digitalWrite(pwmPin, LOW); // подаем напряжение низкого уровня на pin 12 delayMicroseconds(c2); // ждем c2 микросекунд (low time) |
Объяснение работы схемы и исходный код программы
В представленной схеме мы управляем скоростью вращения двигателя постоянного тока с помощью потенциометра на 100 кОм, вращая ручку которого мы изменяем коэффициент заполнения ШИМ сигнала. Потенциометр 100 кОм подсоединен к аналоговому входному контакту A0 Arduino UNO, а двигатель постоянного тока соединен с контактом 12 Arduino (который является контактом ШИМ). Принцип работы программы основан на том, что она считывает значение напряжения с аналогового контакта A0. Значение напряжения на этом аналоговом контакте изменяется с помощью потенциометра. Потом после необходимых вычислений коэффициент заполнения ШИМ регулируется в соответствии с этим значением.
К примеру, если мы получаем значение 256 (то есть это уже преобразованное цифровое значение) с аналогового входа, то в этом случае высокий уровень на контакте ШИМ будет в течение 768 мс (1024-256), а низкий уровень будет в течение 256 мс. Следовательно, коэффициент заполнения ШИМ будет равен 75%. Человеческий глаз не может различить колебания такой высокой частоты поэтому ему кажется что двигатель постоянно вращается со скоростью 75% от максимальной.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
int pwmPin = 12; // вводим переменную для контакта 12 (он будет использоваться для ШИМ) int pot = A0; // вводим переменную для обозначения аналогового входа A0 int c1 = 0; // объявляем переменную c1 int c2 = 0; // объявляем переменную c2 void setup() // setup loop { pinMode(pwmPin, OUTPUT); pinMode(pot, INPUT); } void loop() { c2= analogRead(pot); c1= 1024-c2; // вычитаем c2 из 1024 и сохраняем результат в c1 digitalWrite(pwmPin, HIGH); delayMicroseconds(c1); digitalWrite(pwmPin, LOW); delayMicroseconds(c2); } |
Я бы хотел узнать, на одном из форумов было описано действие шим контроля мотора, но я увидел такую закономерность, человек пишет: управлять двигателями постоянного тока при помощи изменения напряжения и частоты шим сигнала запрещено, мотор выйдет из строя, но частотой синусоидального сигнала можно. В чем закономерность?
Честно говоря я не знаю что изменится в управлении двигателем постоянного тока если просто изменить частоту синусоидального сигнала, не меняя его другие параметры. Там было какое-нибудь объяснение физики этого процесса?
Исправьте, пожалуйста, у ардуино уно 12 пин не работает в ШИМ-режиме, только 3, 5, 6, 9, 10, 11
Добрый вечер. Ошибки нет. Дело в том, что мы используем в данном проекте не встроенную в Ардуино функцию для формирования ШИМ сигнала (analogWrite), а мы здесь используем "самодельную" ШИМ - мы самостоятельно чередуем на контакте 12 напряжения низкого и высокого уровня
Спасибо за схему все подробно обьяснили,но,роль конденсатора можете обьяснить,почему там стоит не диод?
Конденсатор нужен для фильтрации различных нежелательных шумов. Честно говоря, не очень силен в схемотехнике (больше в программировании), но пока нигде не видел в этой роли диода. Посмотрите, к примеру, аналогичную схему, но с микроконтроллером AVR, там тоже включены конденсаторы для фильтрации по цепям питания
диод для защиты транзистора иначе индуктивный выброс с мотора очень быстро убьёт транзистор. Диод ставится параллельно нагрузке катодом к плюсу питания анодом к коллектору транзистора.
Спасибо за пояснение - оно поможет другим посетителям нашего сайта. Я все таки пока немного слабоват в схемотехнике, достаточно давно ее изучал, а практики было маловато