Управление мотором через транзистор
Узнайте, как управлять мотором постоянного тока с помощью транзистора, используя ШИМ.
Последняя ревизия: 07.02.2023
Эта статья была отредактирована 18.01.2022 Karl Söderby.
Моторы и транзисторы — очень распространённые электронные компоненты. Эта статья ставит целью дать основы вместе с рабочим примером кода, схемой и принципиальной схемой.
Когда нажимается кнопка, подключённая к цифровому пину 2, Arduino будет управлять транзистором через широтно-импульсную модуляцию (ШИМ), что приведёт к плавному разгону мотора, а затем к замедлению.
О транзисторах
Arduino может выдавать только 40 мА при 5 В на цифровых пинах. Большинству моторов требуется больше тока и/или напряжения. Транзистор может выступать в роли цифрового ключа, позволяя Arduino управлять нагрузками с более высокими электрическими требованиями. Транзистор в этом примере замыкает цепь мотора на землю. В примере используется TIP120, который может коммутировать до 60 В при 5 А.
При ШИМ-управлении транзистором это похоже на пульсацию светодиода. Чем выше значение ШИМ, тем быстрее вращается мотор. Чем ниже значение, тем медленнее.
У транзисторов три вывода. Для биполярных транзисторов (BJT), как используемый в этом примере, выводы называются база, коллектор и эмиттер. Малый ток на пине базы замыкает цепь между коллектором и эмиттером. BJT бывают двух типов: NPN и PNP. TIP120 — транзистор NPN-типа, что означает, что коллектор подключается к мотору, а эмиттер — к земле.
О моторах
Моторы работают через процесс, называемый индукцией. Когда вы пропускаете электрический заряд через провод, создаётся магнитное поле. Свёрнутый в катушку провод создаёт более сильное поле, как и увеличенный ток. В DC-моторе свёрнутый провод окружает вал мотора. Создаваемое магнитное поле притягивается и отталкивается магнитами внутри корпуса мотора.
Когда мотор останавливается, есть потенциал для генерации небольшого тока, пока вал продолжает вращаться по инерции. Диод, установленный параллельно выводам мотора, защитит цепь от повреждения генерируемым электричеством.
Моторы потребляют наибольший ток при пуске или под нагрузкой. Ток заклинивания — это ток, который мотор потребит при остановке силой. Когда мотор работает, он потребляет значительно меньше тока.
Номинальное напряжение описывает пиковое рабочее напряжение мотора, при котором он работает с оптимальной эффективностью. Превышение или занижение номинального напряжения со временем сократит срок службы мотора. Если подавать меньше номинального, мотор будет вращаться медленнее. Обычно мотору нужно около 1/2 номинального напряжения для работы. Если подать меньше при пуске, скорее всего, он не начнёт двигаться.
Необходимое оборудование
Кнопка моментального действия
Резистор 10 кОм
Макетная плата
Соединительные провода
DC-мотор 9 В
Транзистор TIP120
Диод 1N4001
Батарея 9 В
Схема
Схема управления мотором через транзистор.
Сначала подключите провода для питания и земли. На иллюстрации красный (питание) и чёрный (земля) подключаются к двум длинным вертикальным шинам сбоку макетки. Это даёт доступ к 5 В и земле.
Установите кнопку на макетку, посадив её через центральный жёлоб. Провод соединяет цифровой пин 2 с одной ножкой кнопки. Эта же ножка кнопки соединяется через подтягивающий вниз резистор 10 кОм с землёй. Ножка кнопки, не соединённая с Arduino, должна быть подключена к 5 В.
Соедините пин 9 Arduino с пином базы TIP120. Если смотреть на транзистор так, чтобы металлический язычок был от вас, пин базы — слева. Этот пин управляет открытием/закрытием. Коллектор транзистора подключается к одному выводу мотора, эмиттер — к земле.
Другой конец мотора подключается к плюсу батареи 9 В. Землю батареи соедините с землёй Arduino.
Принципиальная схема
Принципиальная схема управления мотором через транзистор.
Пример кода
Ниже — полная программа управления DC-мотором через транзистор. Подробное объяснение приведено далее.
/*
Motor Control with a Transistor
This example shows you how to control a motor's using a transistor.
When a pushbutton on pin 2 is pressed, the Arduino will control a transistor
via PWM, which will slowly ramp up the motor's speed, then slow it down.
The circuit :
* momentary switch with one end connected to 5V, the other end connected
to GND through a 10-kilohm resistor, and digital pin 2.
* TIP120 tranistor, with the Base connected to digital pin 9, the Emitter to ground,
and the Collector to one lead from a 9V DC motor
* a 9V battery, with the ground connected to the Arduino's ground, and the power
connected to the motor
* 1N4001 diode across the motor's leads, with the striped side connected to the 9V
The Arduino can only provide 40mA at 5V on its pins. Most motors require
more current and/or voltage to overcome inertia and run. A transistor
can act as a digital switch, enabling the Arduino to control loads with
higher electrical requirements.
Created on 03 January 2013
by Scott Fitzgerald
https://docs.arduino.cc/learn/electronics/transistor-motor-control
This example code is in the public domain.
*/
// give a name to digital pin 2, which has a pushbutton attached
int pushButton = 2;
// the transistor which controls the motor will be attached to digital pin 9
int motorControl = 9;
// the setup routine runs once when you press reset:
void setup() {
// make the pushbutton's pin an input:
pinMode(pushButton, INPUT);
// make the transistor's pin an output:
pinMode(motorControl, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
// read the state of the button and check if it is pressed
if(digitalRead(pushButton) == HIGH){
// ramp up the motor speed
for(int x = 0; x <= 255; x++){
analogWrite(motorControl, x);
delay(50);
}
// ramp down the motor speed
for(int x = 255; x >= 0; x--){
analogWrite(motorControl, x);
delay(50);
}
}
delay(1); // delay in between reads for stability
}
Разбор кода
Примечание
В этом разделе приведён детальный разбор программы.
Сначала создадим пару переменных для состояния кнопки и пина управления мотором:
int pushButton = 2;
int motorControl = 9;
В setup() объявим эти пины как вход и выход соответственно:
void setup() {
pinMode(pushButton, INPUT);
pinMode(motorControl, OUTPUT);
}
После завершения настройки переходим к
loop()
.
void loop() {
Считайте состояние кнопки и проверьте, HIGH ли оно. Сравнение можно сделать прямо в условии if():
if(digitalRead(pushButton) == HIGH){
Если кнопка нажата, плавно увеличиваем скорость мотора, повышая значение ШИМ на пине motorControl. Достигнув максимума, плавно снижаем:
for(int x = 0; x <= 255; x+=5){
analogWrite(motorControl, x);
delay(50);
}
for(int x = 255; x >= 0; x-=5){
analogWrite(motorControl, x);
delay(50);
}
Закрываем оператор if() и добавляем небольшую задержку delay() перед закрытием loop().
}
delay(1);
}