Главная chevron_right Уроки chevron_right Электроника chevron_right Управление мотором через транзистор (Transistor Motor Control)

Управление мотором через транзистор (Transistor Motor Control)

Учимся управлять DC-мотором с помощью транзистора и Arduino: схема, код и подробные пояснения по работе с PWM и PWM.

Материал обновлён 18.01.2022, автор оригинала — Karl Söderby.

Моторы и транзисторы — одни из самых распространённых компонентов в электронике. В этом уроке разберём основы работы с ними, соберём рабочую схему и разберём код по шагам.

Когда кнопка, подключённая к цифровому пину 2, нажата, Arduino управляет транзистором через pulse-width modulation (PWM): скорость мотора плавно нарастает, а затем так же плавно снижается.

О транзисторах

Цифровые пины Arduino могут отдавать не более 40 мА при напряжении 5 В. Большинство моторов требуют больше тока и/или напряжения. Транзистор в этом случае работает как управляемый ключ: он позволяет Arduino коммутировать нагрузки с более высокими электрическими требованиями, оставаясь при этом в безопасном режиме работы.

В нашей схеме транзистор замыкает цепь мотора на землю. Используется TIP120, который способен коммутировать нагрузку до 60 В при токе 5 А — вполне достаточно для большинства небольших DC-моторов.

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

У транзистора три вывода. У биполярных транзисторов (BJTs), к которым относится используемый в уроке, они называются база (base), коллектор (collector) и эмиттер (emitter). Небольшой ток на базе замыкает цепь между коллектором и эмиттером. BJTs делятся на два типа: NPN и PNP. TIP120 — NPN-транзистор: коллектор подключается к мотору, а эмиттер — к земле.

Типичная ошибка

Чаще всего новички путают ориентацию транзистора. У TIP120 металлическая пластина (радиатор) находится сзади: если смотреть на транзистор так, чтобы пластина была обращена от вас, то слева — база, посередине — коллектор, справа — эмиттер. Перепутать выводы несложно, а последствия — перегрев или повреждение компонента.

О моторах

DC-моторы работают на принципе электромагнитной индукции. Ток через намотанный провод создаёт магнитное поле, которое взаимодействует с постоянными магнитами внутри корпуса мотора — вал начинает вращаться.

Когда мотор останавливается, вал продолжает вращаться по инерции и сам становится источником небольшого тока. Этот обратный ток может повредить схему. Чтобы этого избежать, диод включают параллельно выводам мотора — он «поглощает» обратный выброс напряжения.

При старте мотор потребляет наибольший ток — это называется пусковым током. Когда мотор набирает обороты, потребление резко падает. Ток при заклинивании (stall current) — это максимальный ток, который мотор потребляет при полной остановке под нагрузкой.

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

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

  • Arduino Board
  • Тактовая кнопка (momentary switch)
  • Резистор 10 кОм
  • Макетная плата (breadboard)
  • Провода для соединений
  • DC-мотор 9 В
  • Транзистор TIP120
  • Диод 1N4001
  • Батарея 9 В

Схема на макетной плате

Transistor Motor Control circuit.

Схема подключения управления мотором через транзистор на макетной плате. Создано с помощью Fritzing.org.

Начните с проводов питания и земли. На иллюстрации красный провод (питание) и чёрный (земля) подключены к двум длинным вертикальным шинам по бокам макетной платы — это даёт удобный доступ к 5 В и GND.

Разместите кнопку на макетной плате так, чтобы она перекрывала центральный разрыв. Один вывод кнопки соедините с цифровым пином 2 Arduino, а через резистор 10 кОм подтяните этот же вывод к земле (pull-down). Второй вывод кнопки подключите к шине 5 В.

Пин 9 Arduino соедините с базой транзистора TIP120. Если смотреть на транзистор металлической пластиной от себя, база — крайний левый вывод. Коллектор транзистора подключите к одному выводу мотора, эмиттер — к земле.

Второй вывод мотора подключите к плюсу батареи 9 В. Минус батареи соедините с GND Arduino.

Принципиальная схема

Transistor Motor Control schematic.

Принципиальная схема управления мотором через транзистор. Создано с помощью Fritzing.org.

Полный код программы

Ниже приведён полный скетч для управления DC-мотором через транзистор. Детальный разбор — в следующем разделе.

/*
 Управление мотором с помощью транзистора

 Этот пример показывает, как управлять мотором с помощью транзистора.
 При нажатии кнопки на пине 2 Arduino управляет транзистором
 через PWM, постепенно увеличивая скорость мотора, а затем снижая её.

 Схема:
 * кнопка без фиксации: один конец подключён к 5V, другой — к GND
   через резистор 10 кОм и к цифровому пину 2.
 * транзистор TIP120: Base подключена к цифровому пину 9, Emitter — к GND,
   Collector — к одному выводу мотора постоянного тока 9V.
 * батарея 9V: GND подключён к GND Arduino, питание — к мотору.
 * диод 1N4001 параллельно выводам мотора, полосой к стороне 9V.

 Arduino может обеспечить не более 40mA при 5V на своих пинах. Большинство
 моторов требуют большего тока и/или напряжения для преодоления инерции и работы.
 Транзистор может выступать в роли цифрового ключа, позволяя Arduino управлять
 нагрузками с более высокими электрическими требованиями.

 Создано 03 января 2013
 автор: Scott Fitzgerald

 https://docs.arduino.cc/learn/electronics/transistor-motor-control

 Этот пример кода находится в общественном достоянии.
 */

// присвоить имя цифровому пину 2, к которому подключена кнопка
int pushButton = 2;

// транзистор, управляющий мотором, подключён к цифровому пину 9
int motorControl = 9;

// функция setup выполняется один раз при нажатии кнопки сброса:
void setup() {
  // настроить пин кнопки как вход:
  pinMode(pushButton, INPUT);

  // настроить пин транзистора как выход:
  pinMode(motorControl, OUTPUT);  
}

// функция loop выполняется бесконечно по кругу:
void loop() {

  // считать состояние кнопки и проверить, нажата ли она
  if(digitalRead(pushButton) == HIGH){
    // плавно увеличить скорость мотора
    for(int x = 0; x <= 255; x++){
      analogWrite(motorControl, x);
      delay(50);
    }

    // плавно уменьшить скорость мотора
    for(int x = 255; x >= 0; x--){
      analogWrite(motorControl, x);
      delay(50);
    }    
  }

  delay(1);        // задержка между считываниями для стабильности
}

Разбор кода по шагам

В этом разделе — подробное объяснение каждой части программы.

Сначала создаём пару переменных: для состояния кнопки и для пина управления мотором:

int pushButton = 2;
int motorControl = 9;

В setup() объявляем эти пины как вход и выход соответственно:

void setup() {
  pinMode(pushButton, INPUT);
  pinMode(motorControl, OUTPUT);  
}

После настройки переходим к loop().

void loop() {

Считываем состояние кнопки и проверяем, равно ли оно HIGH. Проверку удобно делать прямо внутри условия if():

if(digitalRead(pushButton) == HIGH){

Если кнопка нажата, плавно увеличиваем скорость мотора, повышая значение PWM на пине 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() перед закрытием

    }
  delay(1);
}

Как проверить результат

  1. Соберите схему по иллюстрации, убедитесь в правильной ориентации транзистора и диода.
  2. Загрузите скетч в Arduino.
  3. Нажмите и удерживайте кнопку — мотор должен плавно набрать обороты, а затем так же плавно остановиться.
  4. Если мотор не реагирует, проверьте, подключена ли батарея 9 В и правильно ли соединены выводы транзистора.
  5. Если мотор гудит, но не вращается — скорее всего, напряжения не хватает для старта. Убедитесь, что батарея заряжена.

Практические замечания

  • Диод 1N4001 обязателен: без него обратный выброс от мотора может повредить транзистор или даже Arduino.
  • TIP120 — транзистор Дарлингтона с встроенным диодом между коллектором и эмиттером, что делает его особенно удобным для управления индуктивными нагрузками.
  • PWMing мотора на низких значениях (ниже ~80 из 255) может вызывать характерное гудение — это нормально для PWM-управления.
  • Не подключайте мотор напрямую к пинам Arduino: даже небольшой мотор при старте может потребовать несколько сотен миллиампер, что гарантированно выведет пин из строя.