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

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

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

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

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

Общий принцип управления яркостью свечения светодиода с момощью ШИМ

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

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

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

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

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

Плата Arduino UNO
Двигатель постоянного тока
Транзистор 2N2222
Потенциометр 100 кОм
Конденсатор 0.1 нФ
Макетная плата
Соединительные провода

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

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

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

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

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

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

int pwmPin = 12;
int pot = A0;
int c1 = 0;
int c2 = 0;

В следующих строчках кода мы устанавливаем контакт A0 на ввод данных, а контакт 12 (который является контактом ШИМ) на вывод данных.

void setup() {
pinMode(pwmPin, OUTPUT); // declares pin 12 as output
pinMode(pot, INPUT); // declares pin A0 as input
}

Теперь, в функции 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, то мы получим цифровое значение входного напряжения.

void loop()
{
c2= analogRead(pot);
c1= 1024-c2;
digitalWrite(pwmPin, HIGH); // sets pin 12 HIGH
delayMicroseconds(c1); // waits for c1 uS (high time)
digitalWrite(pwmPin, LOW); // sets pin 12 LOW
delayMicroseconds(c2); // waits for c2 uS (low time)
}

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

Работа схемы в действии

В представленной схеме мы управляем скоростью вращения двигателя постоянного тока с помощью потенциометра на 100 кОм, вращая ручку которого мы изменяем коэффициент заполнения ШИМ сигнала. Потенциометр 100 кОм подсоединен к аналоговому входному контакту A0 Arduino UNO, а двигатель постоянного тока соединен с контактом 12 Arduino (который является контактом ШИМ). Принцип работы программы основан на том, что она считывает значение напряжения с аналогового контакта A0. Значение напряжения на этом аналоговом контакте изменяется с помощью потенциометра. Потом после необходимых вычислений коэффициент заполнения ШИМ регулируется в соответствии с этим значением.

К примеру, если мы получаем значение 256 (то есть это уже преобразованное цифровое значение) с аналогового входа, то в этом случае высокий уровень на контакте ШИМ будет в течение 768 мс (1024-256), а низкий уровень будет в течение 256 мс. Следовательно, коэффициент заполнения ШИМ будет равен 75%. Человеческий глаз не может различить колебания такой высокой частоты поэтому ему кажется что двигатель постоянно вращается со скоростью 75% от максимальной.

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);
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
15 просмотров

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *