Шаговые электродвигатели

Ответить
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Шаговые электродвигатели

Сообщение Oleg »

В любом стандартном принтере (или, если на то пошло, в 3D-принтере) наверняка можно обнаружить один или несколько шаговых электродвигателей. На рисунке ниже показан механизм подачи пластиковой проволоки в экструдер 3D-принтера. Шаговые электродвигатели широко используются в принтерах, поскольку они обеспечивают перемещение очень точным образом, один шаг за один раз.
Шаговый электродвигатель в 3D-принтере
Шаговый электродвигатель в 3D-принтере
По сравнению с двигателями постоянного тока для управления шаговыми электродвигателями применяются совершенно иные методы. В этой главе мы рассмотрим оба типа шаговых электродвигателей: униполярные и биполярные, а также различные управляющие ими микросхемы (так называемые драйверы), что пригодится нам при изучении шаговых электродвигателей.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Виды шаговых электродвигателей

Сообщение Oleg »

Как следует из их названия, вращение шаговых электродвигателей представляет собой серию коротких шагов. В этом и состоит их отличие от двигателей свободного вращения - шаговый двигатель сделает столько шагов, сколько ему будет задано, и вы будете точно знать, сколько он их сделал. Это одна из причин, почему шаговые двигатели широко применяются как в обычных, так и в 3D-принтерах. В обычных принтерах они точно позиционируют бумагу, а в 3D рабочий столик и сопло.
Варианты шаговых электродвигателей
Варианты шаговых электродвигателей
На рисунке представлены три образца шаговых электродвигателей. Миниатюрные электродвигатели типа тех, что показан слева, служат для перемещения элементов объектива в компактной фотокамере или смартфоне. В центре находится шаговый мотор-редуктор с питанием 5 В - в его корпусе заключен и шаговый электродви гатель, и редуктор. Справа изображен шаговый электродвигатель, типичный для принтеров.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Биполярные шаговые электродвигатели

Сообщение Oleg »

На рисунке ниже показана схема работы шагового электродвигателя точнее, схема работы биполярного шагового электродвигателя. О другом типе шаговых электродвигателей униполярных будет рассказано в разд. «Униполярные шаговые электродвигатели» далее.

В биполярном шаговом двигателе, как правило, имеются четыре катушки. Катушки, расположенные одна против другой, соединены так, что работают синхронно. Все катушки расположены на неподвижном статоре двигателя, а значит, нет необходимости во вращающемся коллекторе и щетках, как у двигателей постоянного тока.
Схема работы биполярного шагового электродвигателя
Схема работы биполярного шагового электродвигателя
Ротор шагового электродвигателя выполнен в форме намагниченных зубцов с чередующимися северным (С) и южным (Ю) полюсами (зубцов на роторе обычно гораздо больше, чем показано на рисунке ниже). Каждую катушку можно подключить так, что она будет намагничена или как северный полюс, или как южный, в зависимости от направления тока в катушке (вспоминаются Н-мосты, не так ли?). Катушки 1 и 3 работают совместно так, что когда катушка 1 будет южным полюсом, катушка 3 также будет южным полюсом. То же самое относится и к катушкам 2 и 4.

Начнем с рисунка а - когда катушка 1, а значит, и катушка 3 запитаны так, что становятся южными полюсами (Ю), вследствие того, что разноименные полюса притягиваются, а одноименные отталкиваются, ротор поворачивается против часовой стрелки до тех пор, пока ближайшие зубцы ротора с намагниченностью северного полюса (С) не поравняются с катушками 1 и 3 (как показано на рисунке б). Чтобы продолжить вращение против часовой стрелки, на следующем шаге (рисунок в) необходимо подать ток в катушки 2 и 4 так, чтобы они стали северными полюсами (С). Тогда ближайшие зубцы ротора с намагниченностью Ю подтянутся к катушкам 2 и 4 (рисунок г).

Каждое такое действие проворачивает ротор электродвигателя на один шаг. Для продолжения вращения против часовой стрелки в катушке 1 снова нужно создать намагниченность С (таблица).

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

Уточненная последовательность переключения катушек при вращении шагового двигателя
Уточненная последовательность переключения катушек при вращении шагового двигателя
Уточненная последовательность переключения катушек при вращении шагового двигателя
Можно задаться вопросом, что произойдет, если начать с катушек 2 и 4, а не с катушек 1 и 3? В этом случае просто другая пара катушек будет способствовать занятию зубцами ротора правильного положения.

А для изменения направления вращения ротора нужно всего лишь изменить порядок переключения катушек, указанный в таблице выше на обратный.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Эксперимент: управление биполярным шаговым двигателем

Сообщение Oleg »

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

Так и есть - в этом эксперименте и для Arduino, и для Raspberry Pi управление биполярным шаговым электродвигателем будет осуществляться с помощью микросхемы L293D, установленной на макетной плате
Схема управления биполярным шаговым электродвигателем в сборе (вариант с Raspberry Рі)
Схема управления биполярным шаговым электродвигателем в сборе (вариант с Raspberry Рі)
Хотя в эксперименте используется шаговый двигатель с номинальным напряжением питания 12 В. он будет работать и от блока батарей с напряжением 6 В. У двигателя упадет момент, но крутиться он будет так же хорошо.

ОПРЕДЕЛЕНИЕ НАЗНАЧЕНИЯ КОНТАКТОВ ШАГОВОГО ЭЛЕКТРОДВИГАТЕЛЯ

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

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

Комплектующие

В этом эксперименте для работы с Arduino и Raspberry Pi понадобятся следующие комплектующие:
IC1 - Микросхема с Н-мостом L293D
C1 - Конденсатор 100нФ
C2 - Конденсатор 16 В 100 мкФ
M1 - Биполярный шаговый электродвигатель 12 В
Батарейный отсек 4 АА (6 В)
400-точечная беспаечная макетная плата
Перемычки

Конструкция

На рисунке ниже показана принципиальная электрическая схема этого эксперимента. В данном случае ШИМ не используется, поэтому два входа Enable микро- схемы L293D подсоединены к источнику питания 5 В, чтобы поддерживать оба Н-моста постоянно включенными. Шаговый двигатель управляется четырьмя каналами: In1, In2, In3 и In4, на которые будут подаваться управляющие сигналы от Arduino или Raspberry Pi.

Экспериментируем с Arduino

В версии этого эксперимента для Arduino мы воспользуемся окном монитора порта, чтобы через него подавать на Arduino команды, управляющие двигателем. Таких команд три, и состоят они из одной буквы с последующим числом. Например:

f100 - задает движение двигателю на 100 шагов вперед;
r100 - задает движение двигателю на 100 шагов в обратном направлении,
p10 - задает время задержки между импульсами шагов, равное 10 мс.
Принципиальная электрическая схема управления биполярным шаговым электродвигателем
Принципиальная электрическая схема управления биполярным шаговым электродвигателем
Схема управления шаговым электродвигателем от Arduino в сборе
Схема управления шаговым электродвигателем от Arduino в сборе
Подключение Arduino

При подключении Arduino к микросхеме L293D используются следующие контакты.
Контакты для подключения Arduino к микросхеме L293D
Контакты для подключения Arduino к микросхеме L293D
Компоновка макетной платы для варианта с Arduino показана на рисунке ниже. Убедитесь, что микросхема установлена правильно (выемка на корпусе должна быть направлена вверх), и что конденсатор С2 емкостью 100 мкФ своим положительным выводом соединен с выводом 8 L293D. Чтобы вам было проще ориентироваться, напомню, что положительный вывод электролитического конденсатора обычно длиннее его отрицательного вывода. Отрицательный вывод конденсатора также может быть помечен на его корпусе символом «-» или ромбиком.
Компоновка макетной платы для управления биполярным шаговым двигателем с Arduino
Компоновка макетной платы для управления биполярным шаговым двигателем с Arduino
Программы для Arduino

Для этого эксперимента имеются два варианта программ. Первый более сложный, он предполагает задание контактов микросхемы L293D для управления ка тушками шагового двигателя согласно описанию, приведенному ранее, в разд. «Биполярные шаговые электродвигатели». Это полезное упражнение для точного понимания работы шагового двигателя.

Второй вариант использует скетч с обращением к библиотеке Stepper для Arduino, которая и делает всю работу. Поэтому второй вариант намного короче.

Сложный вариант программы

Первый вариант скетча для Arduino:

Код: Выделить всё

const int in1Pin = 10;   // (1)
const int in2Pin = 9;
const int in3Pin = 11;
const int in4Pin = 8;

int period = 20;      // (2)

void setup() {        // (3)
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(in3Pin, OUTPUT);
  pinMode(in4Pin, OUTPUT);
  Serial.begin(9600);
  Serial.println("Command letter followed by number");
  Serial.println("p20 - set the inter-step period to 20ms (control speed)");
  Serial.println("f100 - forward 100 steps");
  Serial.println("r100 - reverse 100 steps");
}

void loop() {      // (4)
  if (Serial.available()) {
    char command = Serial.read();
    int param = Serial.parseInt();
    if (command == 'p') {        // (5)
      period = param;
    }
    else if (command == 'f') {   // (6)
      stepForward(param, period);
    }
    else if (command == 'r') {
      stepReverse(param, period);
    }   
  } 
  setCoils(0, 0, 0, 0); // power down
}

void stepForward(int steps, int period) {     // (7)
  for (int i = 0; i < steps; i++) {
    singleStepForward(period);
  }
}

void singleStepForward(int period) {       // (8)
  setCoils(1, 0, 0, 1);
  delay(period);
  setCoils(1, 0, 1, 0);
  delay(period);
  setCoils(0, 1, 1, 0);
  delay(period);
  setCoils(0, 1, 0, 1);
  delay(period);
}

void stepReverse(int steps, int period) {
  for (int i = 0; i < steps; i++) {200
    singleStepReverse(period);
  }
}

void singleStepReverse(int period) {          // (9)
  setCoils(0, 1, 0, 1);
  delay(period);
  setCoils(0, 1, 1, 0);
  delay(period);
  setCoils(1, 0, 1, 0);
  delay(period);
  setCoils(1, 0, 0, 1);
  delay(period);
}

void setCoils(int in1, int in2, int in3, int in4) {    // (10)
  digitalWrite(in1Pin, in1);
  digitalWrite(in2Pin, in2);
  digitalWrite(in3Pin, in3);
  digitalWrite(in4Pin, in4);
}
Уточним некоторые моменты скетча по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:

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

2. Переменная period задает величину задержки между включениями катушек на каждом шаге по время вращения двигателя. Изначально задана величина задержки в 20 мс. Эту величину можно изменять с помощью окна монитора порта, чтобы ускорить или замедлить двигатель.

3. Функция setup() конфигурирует выводы управления как выходы, запускает последовательный канал связи с окном монитора порта, а затем выводит сообщение, содержащее форматы команд, которые можно использовать.

4. В цикле основной программы loop() ожидается приход команд по последовательному каналу, а в случае их получения обработка этих команд. Если команда получена (это покажет Serial.available) в цикле loop()) сначала будет считана буква команды, а затем следующий за буквой параметр.

Далее идет ряд выражений, задающих определенные действия, в зависимости от команды.

5. Если указана буква, то переменная рой принимает значение, равное пара- метру команды.

6. Если указана команда f или r. то вызываются функции stepForward или stepReverse со значением количества шагов и временем задержки между импульсами в качестве параметров.

7. ФункцииstepForward и stepReverse очень похожи. Они вызывают функции singleStepSorward или singleStepReverse столько раз, сколько задано шагов.

8. Далее переходим к функции singleStepSorward , содержащей образцы полярностей четырех фаз переключения катушек двигателя для перемещения на один шаг. Образцы полярностей можно увидеть в качестве параметров для setСoils.

9. Функция ingleStepReverse работает так же, как и singleStepForward, только в обратной последовательности. Сравните эти шаги с данными последней таблицы.

10. И, наконец, функция устанавливает состояние управляющих выводов в соответствии с образцом, заданным в качестве параметров.

Легкий вариант программы

Arduino IDE включает библиотеку Stepper, которая отлично работает и может значительно уменьшить размер скетча.

Код: Выделить всё

#include <Stepper.h>    // (1)

const int in1Pin = 10;
const int in2Pin = 9;
const int in3Pin = 8;
const int in4Pin = 11;

Stepper motor(200, in1Pin, in2Pin, in3Pin, in4Pin);     // (2)

void setup() {       // (3)
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(in3Pin, OUTPUT);
  pinMode(in4Pin, OUTPUT);
  while (!Serial);
  Serial.begin(9600);
  Serial.println("Command letter followed by number");
  Serial.println("p20 - set the motor speed to 20");
  Serial.println("f100 - forward 100 steps");
  Serial.println("r100 - reverse 100 steps");
  motor.setSpeed(20);       // (4)
}

void loop() {        // (5)
    if (Serial.available()) {
    char command = Serial.read();
    int param = Serial.parseInt();
    if (command == 'p') {
      motor.setSpeed(param);
    }
    else if (command == 'f') {
      motor.step(param);
    }
    else if (command == 'r') {
      motor.step(-param);
    }   
  } 
}
Уточним некоторые моменты скетча по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:

1. В первой строке скетча происходит импорт библиотеки Stepper, которая уже включена в состав Arduino IDE, поэтому ее не нужно устанавливать специально.

2. Чтобы использовать библиотеку, в переменной motor нужно задать тип шагового двигателя. Первый параметр количество шагов, которые двигатель делает за один оборот. Для шагового двигателя Adafruit, задействованного в этом проекте, задается значение в 200 шагов. На самом деле это означает 200 переключений фаз катушек на один оборот, что соответствует 50 физическим шагам на один оборот. Остальные четыре параметра - используемые выводы катушек.

3. Функция настройки setup() почти такая же, что и для сложного варианта скетча. Сообщение немного отличается, поскольку в данном случае команда задает скорость вращения двигателя в об/мин (оборотов в минуту), что раньше делалось изменением времени задержки между подачей импульсов. Как бы там ни было, скорость двигателя можно изменить обоими этими способами.

4. По умолчанию скорость вращения двигателя в функции setup() устанавливается с помощью функции motor.set Speed, равной 20 об/мин.

5. Цикл основной программы loop() также очень похож на вариант сложной версии скетча. Однако в данном случае количество шагов и направление вращения двигателя задается как положительное число при движении вперед и как отрицательное число при движении назад.

Число «шагов-четвертушек», задаваемых в параметрах команд f и r. в данном случае означает количество фаз переключения катушек. Чтобы используемый здесь шаговый двигатель Adafruit совершил полный оборот, нужно ввести число 200.

Загружаем и выполняем программу

Вы можете попробовать во всех режимах обе программы для шаговых двигателей. но далее мы будем считать, что в Arduinо загружен последний скетч. Откройте монитор порта, и вы увидите сообщение:
Управление шаговым электродвигателем из монитора порта
Управление шаговым электродвигателем из монитора порта
Введите команду f200 и нажмите кнопку Send (Отправить) - вал двигателя должен провернуться на один полный оборот. Если он не вращается, а дрожит или гудит, скорее всего, неправильно подключена одна из катушек. Поменяйте местами перемычки, идущие от шагового двигателя к выводам 3 и 6 микросхемы L293D и подайте команду снова.

Выполните команду r200, после чего вал двигателя должен сделать один оборот в противоположном направлении.

Далее можно поэкспериментировать со скоростью, используя команду и следующее за ней значение скорости в об/мин, - например p5 с последующей f200. Вал двигателя снова провернется на один оборот, но уже очень медленно. Можно увеличить скорость вращения, задав большее значение, скажем, р100. Но тут обнаружится, что где-то в районе 130 об/мин существует ограничение скорости, выше которой часть шагов уже будет теряться, и вал двигателя не сможет сделать полный оборот.

Экспериментируем с Raspberry Pi

Управление шаговым двигателем с использованием программы на языке Python и Raspberry Pi очень напоминает вариант для Arduinо без использования библиотеки.

Для управления микросхемой L293D потребуется четыре управляющих выхода Raspberry Pi.

Программа на Python предложит ввести задержку между фазами переключения, направление и количество шагов.

Подключение Raspberry Pi

Вы вполне можете оставить макетную плату, использованную для подключения Arduino, заменив лишь перемычки, идущие к Raspberry Рі. Как уже не раз отмечалось ранее, подключение Raspberry Рі осуществляется перемычками «мама папа», а не «папа-папа», как в случае Arduino.

Программа для Raspberry Pi

Версия программы управления шагами для Raspberry Pi практически полностью повторяет вариант для Arduino без использования библиотек:

Код: Выделить всё

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

in_1_pin = 23     # (1)
in_2_pin = 24
in_3_pin = 25
in_4_pin = 18

GPIO.setup(in_1_pin, GPIO.OUT)
GPIO.setup(in_2_pin, GPIO.OUT)
GPIO.setup(in_3_pin, GPIO.OUT)
GPIO.setup(in_4_pin, GPIO.OUT)

period = 0.02

def step_forward(steps, period):    # (2)
  for i in range(0, steps):
    set_coils(1, 0, 0, 1)
    time.sleep(period)
    set_coils(1, 0, 1, 0)
    time.sleep(period)
    set_coils(0, 1, 1, 0)
    time.sleep(period)
    set_coils(0, 1, 0, 1)
    time.sleep(period)

def step_reverse(steps, period):   
  for i in range(0, steps):
    set_coils(0, 1, 0, 1)
    time.sleep(period)
    set_coils(0, 1, 1, 0)
    time.sleep(period)
    set_coils(1, 0, 1, 0)
    time.sleep(period)
    set_coils(1, 0, 0, 1)
    time.sleep(period)

  
def set_coils(in1, in2, in3, in4):     # (3)
  GPIO.output(in_1_pin, in1)
  GPIO.output(in_2_pin, in2)
  GPIO.output(in_3_pin, in3)
  GPIO.output(in_4_pin, in4)
  

try:
    print('Command letter followed by number');
    print('p20 - set the inter-step period to 20ms (control speed)');
    print('f100 - forward 100 steps');
    print('r100 - reverse 100 steps');
    
    while True:      # (4)
        command = raw_input('Enter command: ')
        parameter_str = command[1:] # from char 1 to end
        parameter = int(parameter_str)     # (5)
        if command[0] == 'p':     # (6)
            period = parameter / 1000.0
        elif command[0] == 'f':
            step_forward(parameter, period)
        elif command[0] == 'r':
            step_reverse(parameter, period)

finally:
    print('Cleaning up')
    GPIO.cleanup()
Уточним некоторые моменты программы по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:

1. Программа определяет константы для четырех управляющих выводов и устанавливает последние в состояние выходов.

2. Функции step_forward и step_reverse практически такие же, как и их эквиваленты для Arduino. Четыре катушки коммутируются в необходимом порядке при вызове функции set_coils. Она многократно повторяет шаги, осуществляя задержку между каждым переключением катушек.

3. Функция set_coils устанавливает четыре управляющих вывода в соответствии с ее четырьмя параметрами.

4. В основном цикле программы командная строка считывается с помощью raw_input. Параметр, следующий за буквой, отделяется от буквы команды с помощью указания диапазона [1:], что для строк в Python означает строку от позиции 1 (второй символ) до конца строки.

5. Строковая переменная затем преобразуется в число с помощью встроенной

функции int.

6. Серия из трех выражений, в каждом из которых выполняется определенное действие, в зависимости от команды: меняется значение переменной period, происходит запуск двигателя в прямом или обратном направлении.

Загружаем и выполняем программу

Запустите программу командой: sudo python bi_stepper.py

Появится сообщение с предложением ввести команды из разрешенного списка. Они точно такие же, как и в случае с Arduino:

Код: Выделить всё

Command letter followed by number
p20 - set the inter-step period to 20ms (control speed)
f100-forward 100 steps
r100-reverse 100 steps
Enter command: p5
Enter command: f50
Enter command: p10 
Enter command: r100
Enter command:
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Униполярные шаговые электродвигатели

Сообщение Oleg »

Униполярные шаговые электродвигатели работают практически так же, как и биполярные, но не нуждаются для управления в Н-мостах. Этому способствует более сложное устройство его катушек. На рисунке показана схема работы униполярного шагового электродвигателя.

У униполярного двигателя имеется пять выводов от катушек - в отличие от четырех выводов у биполярного двигателя. Четыре этих вывода аналогичны выводам биполярного двигателя - это просто концы катушек А, Б, В и Г. Так что, при желании можно использовать концы катушек А, Б, В и Г. управляя ими с помощью Н-мостов, как будто это биполярный двигатель, и все будет работать нормально.
Схема работы униполярного шагового электродвигателя
Схема работы униполярного шагового электродвигателя
А вот пятый вывод униполярного шагового двигателя соединяет отводы от половины количества витков каждой из катушек. И если этот вывод соединить с заземляющим контактом (GND), то можно намагнитить катушку северным полюсом. подав питание на вывод А, или южным полюсом, подав питание на вывод. Б. При этом необходимость использовать Н-мосты устраняется.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Сборки Дарлингтона

Сообщение Oleg »

Отсутствие необходимости применять для управления униполярными шаговыми двигателями Н-мосты не отменяет того обстоятельства, что катушки двигателя потребляют слишком большой ток, чтобы их можно было питать непосредственно от выводов Arduinо или Raspberry Pi.

Очевидный способ повысить ток - это использовать транзисторы, как это было сделано в разд. «Эксперимент: управление электродвигателем». Нам понадобятся четыре транзистора по одному на каждый вывод А, Б, В и Г. Понадобятся также токоограничивающие резисторы в цепи базы этих транзисторов и защитные обратные диоды на каждой катушке. На рисунке показана схема, по которой следует подключить каждую катушку униполярного двигателя, а для в целом управления двигателем вам потребуется четыре такие схемы.
Силовой ключ униполярного шагового двигателя на одном транзисторе
Силовой ключ униполярного шагового двигателя на одном транзисторе
Их можно прекрасно собрать на макетной плате, но для этого потребуется просто куча перемычек.

Более аккуратное решение - использование специализированной микросхемы (транзисторной сборки), например. ULN2803. Эта недорогая микросхема содержит восемь составных транзисторов (пар Дарлингтона) в одном корпусе. Кроме того, там уже есть и резисторы в цепи баз, и защитные диоды. Единственное, что нужно будет добавить. это конденсатор в цепи питания.

Микросхема ULN2803 (www.adafruit.com/datasheets/ULN2803A.pdf) может обеспечить ток до 500 мА в каждом канале при максимальном напряжении 50 В.

B рассмотренном далее разд. «Эксперимент: управление униполярным шаговым электродвигателем» мы воспользуемся одним из таких устройств для управления униполярным электродвигателем от Arduino и от Raspberry Pi.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Эксперимент: управление униполярным шаговым электродвигателем

Сообщение Oleg »

На рисунке ниже показана плата Raspberry Pi, управляющая униполярным шаговым двигателем одного из широко распространенных его типов, с понижающим редуктором, имеющим коэффициент редукции 1:16. При этом, хотя сам двигатель совершает 32 шага за оборот, наличие редуктора означает, что для одного оборота нужно выполнить 513 переключений фаз, что эквивалентно 128 шагам на оборот.
Схема управления униполярным шаговым электродвигателем в сборе
Схема управления униполярным шаговым электродвигателем в сборе
Оборудование

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

Здесь применен маломощный двигатель с напряжением питания 5 В и достаточно малым рабочим током, так что его можно запитать непосредственно от Raspberry Рi или Arduino. При двух включенных катушках потребляемый ток составляет около 150 мА. Если используется более мощный двигатель или двигатель с более высоким напряжением питания, нужно будет подключить отдельный источник питания, как это делалось в случае с биполярным шаговым двигателем.

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

В этом эксперименте для работы с Arduino и Raspberry Pi понадобятся следующие комплектующие:

IС1 - Микросхема ULN2803
C2 - Конденсатор 16 в 100 мкФ
М1 - Униполярный шаговый двигатель 5 В
Батарейный отсек 4 АА (6 В)
400-точечная беспаечная макетная плата
Перемычки

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

На рисунке показано, как можно подключить Arduino Uno к микросхеме ULN2803.
Подключение Arduino к микросхеме ULN2803
Подключение Arduino к микросхеме ULN2803
Нужно только убедиться, что конденсатор установлен правильно - его более длинный положительный вывод должен быть сориентирован вправо. Микросхема должна быть расположена так, чтобы выемка на корпусе смотрела на верхнюю сторону макетной платы.

Как можно видеть, монтаж получается более аккуратным по сравнению с вариантом для биполярного двигателя.

Программа для Arduino

Код: Выделить всё

#include <Stepper.h>

const int in1Pin = 9;
const int in2Pin = 11;
const int in3Pin = 8;
const int in4Pin = 10;

Stepper motor(513, in1Pin, in2Pin, in3Pin, in4Pin);  

void setup() {
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(in3Pin, OUTPUT);
  pinMode(in4Pin, OUTPUT);
  while (!Serial);
  Serial.begin(9600);
  Serial.println("Command letter followed by number");
  Serial.println("p20 - set the motor speed to 20");
  Serial.println("f100 - forward 100 steps");
  Serial.println("r100 - reverse 100 steps");
  motor.setSpeed(20);
}

void loop() {
    if (Serial.available()) {
    char command = Serial.read();
    int param = Serial.parseInt();
    if (command == 'p') {
      motor.setSpeed(param);
    }
    else if (command == 'f') {
      motor.step(param);
    }
    else if (command == 'r') {
      motor.step(-param);
    }   
  } 
}
Подключение Raspberry Pi

На рисунке показано расположение проводов и подключение Raspberry Pi к микросхеме ULN2803
подключение Raspberry Pi к микросхеме ULN2803
подключение Raspberry Pi к микросхеме ULN2803
Программа для Raspberry Pi

Код: Выделить всё

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

in_1_pin = 18
in_2_pin = 24
in_3_pin = 23
in_4_pin = 25

GPIO.setup(in_1_pin, GPIO.OUT)
GPIO.setup(in_2_pin, GPIO.OUT)
GPIO.setup(in_3_pin, GPIO.OUT)
GPIO.setup(in_4_pin, GPIO.OUT)

period = 0.02

def step_forward(steps, period):  
  for i in range(0, steps):
    set_coils(1, 0, 0, 1)
    time.sleep(period)
    set_coils(1, 0, 1, 0)
    time.sleep(period)
    set_coils(0, 1, 1, 0)
    time.sleep(period)
    set_coils(0, 1, 0, 1)
    time.sleep(period)

def step_reverse(steps, period):  
  for i in range(0, steps):
    set_coils(0, 1, 0, 1)
    time.sleep(period)
    set_coils(0, 1, 1, 0)
    time.sleep(period)
    set_coils(1, 0, 1, 0)
    time.sleep(period)
    set_coils(1, 0, 0, 1)
    time.sleep(period)

  
def set_coils(in1, in2, in3, in4):
  GPIO.output(in_1_pin, in1)
  GPIO.output(in_2_pin, in2)
  GPIO.output(in_3_pin, in3)
  GPIO.output(in_4_pin, in4)
  

try:
    print('Command letter followed by number');
    print('p20 - set the inter-step period to 20ms (control speed)');
    print('f100 - forward 100 steps');
    print('r100 - reverse 100 steps');
    
    while True:
        command = raw_input('Enter command: ')
        parameter_str = command[1:] # from char 1 to end
        parameter = int(parameter_str)
        if command[0] == 'p':
            period = parameter / 1000.0
        elif command[0] == 'f':
            step_forward(parameter, period)
        elif command[0] == 'r':
            step_reverse(parameter, period)

finally:
    print('Cleaning up')
    GPIO.cleanup()
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Микрошаги

Сообщение Oleg »

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

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

Микрошаги можно реализовать и программным способом, но в целом гораздо проще использовать специальные аппаратные средства, разработанные для шаговых двигателей, допускающих работу в режиме микрошагов. К таким аппаратным средствам можно отнести базирующуюся на микросхеме А3967 плату EasyDriver, разработанную Брайаном Шмальцем (Brian Schmalz).

Отличный учебник по использованию платы EasyDriver с Arduino можно найти в Интернете на страничке Sparkfun, посвященной этой плате (продукт ROB-12779). Но мы не станем здесь его повторять, и в качестве альтернативы рассмотрим далее разд. «Эксперимент: микрошаги на Raspberry Pi».
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Эксперимент: микрошаги на Raspberry Pi

Сообщение Oleg »

В этом эксперименте используется плата EasyDriver, реализующая режим микрошагов для шагового двигателя 12 В, который был задействован ранее для Raspberry Pi в разд. «Эксперимент: управление биполярным шаговым двигателем».

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

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

В этом эксперименте для работы с Raspberry Pi понадобятся следующие комплектующие:

Плата EasyDriver для регулировки шаговых двигателей
Биполярный шаговый электродвигатель 12 В
Батарейный отсек 4 АА (6 В)
400-точечная беспаечная макетная плата
Перемычки

ПРИМЕЧАНИЕ
Большинство шаговых двигателей, рассчитанных на 12 В, будут нормально работать и от 6 В. но лучше все же использовать блок питания на 12 В


Подключение Raspberry Pi

На рисунке показана компоновка макетной платы с платой EasyDriver и подключение ее к плате Raspberry Pi
Компоновка макетной платы для реализации микрошагов на Raspberry Pi
Компоновка макетной платы для реализации микрошагов на Raspberry Pi
На плате EasyDriver уже установлены конденсаторы, которые в прочих случаях обычно приходится устанавливать самостоятельно. На ней также имеется и стаби лизатор напряжения, обеспечивающий питание микросхемы А3967. Соответствен но, ее даже не надо подключать к питанию Raspberry Pi. Все, что нужно сделать, это подключить общий провод (GND) и четыре сигнала управления (Control).

Программа

Как следует из самого названия платы EasyDriver («Простой Драйвер»), ею очень удобно управлять программно. Основные команды на плату передаются с помощью только двух выводов. Когда вывод step получает импульс HIGH, двигатель делает один шаг в направлении, заданном на направляющем выводе.

Два других вывода: ms1 и ms2 - нужны для того, чтобы задать размер микрошага от

0 до 1/8

Код программы:

Код: Выделить всё

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

step_pin = 24
dir_pin = 25
ms1_pin = 23
ms2_pin = 18

GPIO.setup(step_pin, GPIO.OUT)
GPIO.setup(dir_pin, GPIO.OUT)
GPIO.setup(ms1_pin, GPIO.OUT)
GPIO.setup(ms2_pin, GPIO.OUT)

period = 0.02

def step(steps, direction, period):  # (1)
  GPIO.output(dir_pin, direction)  
  for i in range(0, steps):
    GPIO.output(step_pin, True)
    time.sleep(0.000002)
    GPIO.output(step_pin, False)
    time.sleep(period)

def step_mode(mode):                 # (2)
    GPIO.output(ms1_pin, mode & 1)   # (3)
    GPIO.output(ms2_pin, mode & 2)

try:
    print('Command letter followed by number');
    print('p20 - set the inter-step period to 20ms (control speed)');
    print('m - set stepping mode (0-none 1-half, 2-quater, 3-eighth)');
    print('f100 - forward 100 steps');
    print('r100 - reverse 100 steps');
    
    while True:                       # (4)
        command = raw_input('Enter command: ')
        parameter_str = command[1:] # from char 1 to end
        parameter = int(parameter_str)
        if command[0] == 'p':
            period = parameter / 1000.0
        elif command[0] == 'm':
            step_mode(parameter)
        elif command[0] == 'f':
            step(parameter, True, period)
        elif command[0] == 'r':
            step(parameter, False, period)

finally:
    print('Cleaning up')
    GPIO.cleanup()
ПРИМЕЧАНИЕ
Вы уже должны знать цоколевку GPIO и код инициализации, запускающий большинство Python-программ из этой книги. Если не знаете вернитесь к предыдущим разделам.


Уточним некоторые моменты программы по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:

1. Функция step содержит код для перемещения двигателя на ряд шагов (микрошагов). В качестве параметров функция берет количество шагов, направление (0 или 1) и величину задержки между каждым шагом. Внутри тела функции прежде всего устанавливается вывод dir_pin, отвечающий за направление на плате EasyDriver, а затем генерируется необходимое количество импульсов на выводе step_pin. Длительность каждого импульса на выводе step_pin составляет всего 2 микросекунды (в техническом описании микросхемы А3967 сказано, что длительность импульсов должна быть не менее 1 микросекунды).

2. Функция step_mode устанавливает состояние выводов тактового режима в соответствии с выбранным значением режима, которое должно находиться между 0 и 3.

3. Код внутри функции step_mode отделяет два бита от номера режима и устанавливает ms1_pin и ms2_pin, используя логический оператор И (&). В табл. показана зависимость состояния выводов режима микрошагов и поведения двигателя.

Таблица. Выводы управления микрошагами
Таблица. Выводы управления микрошагами
Таблица. Выводы управления микрошагами
4. Основной цикл программы очень похож на Python-программу из разд. «Эксперимент: управление биполярным шаговым электродвигателем», за исключением добавленной команды m, позволяющей произвести установку режима микрошагов.

Загружаем и выполняем программу

Запустите программу и в ответ на приглашение введите команды m0, р8, а затем f800:
$ sudo python название файла
Command letter followed by number
p20 - set the inter-step period to 20ms (control speed)
m - set stepping mode (0-none 1-half, 2-quater, 3-eighth)
f100 - forward 100 steps
r100 - reverse 100 steps
Enter command: m0
Enter command: p8
Enter command: f800


Это должно вызвать поворот вала двигателя на четыре оборота (для 200-шагового двигателя). Постарайтесь запомнить плавность движения вала при вращении.

Затем введите следующие команды: m3, p1, f6400 - вал двигателя сделает четыре оборота с той же скоростью, но намного более плавно.

Обратите внимание, что для сохранения той же скорости период следования шагов был уменьшен в 8 раз, а число шагов (в данном случае микрошагов) увеличено в 8 раз.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Бесколлекторные двигатели постоянного тока

Сообщение Oleg »

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

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

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

Ответить