Урок 32. Следящий электропривод с шаговым двигателем.

Программа следящего электропривода

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

Предыдущий урок     Список уроков     Следующий урок

В уроке я разработал две следящие системы с шаговым двигателем в качестве электропривода.

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

 

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

 

Следящий электропривод.

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

Следящий электропривод – это электрический привод, реализующий изменение положения исполнительного механизма (нагрузки) в соответствии с задающим сигналом, который может произвольно меняться во времени.

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

В общем случае структурная схема следящей системы электропривода выглядит так.

Схема следящего электропривода

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

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

 

Принцип реализации следящего электропривода на шаговом двигателе.

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

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

К достоинствам следящего привода на базе шагового двигателя следует отнести:

  • простота реализации;
  • отсутствие датчика положения ротора;
  • не бывает перерегулирования, колебательных процессов.

Недостатки:

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

 

Следящий электропривод с управлением от компьютера.

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

Весь алгоритм управления реализован в программе верхнего уровня на компьютере.

  • Программа  хранит текущее положение ротора двигателя.
  • При изменении заданного значения угла, она вычисляет количество шагов, которое двигатель должен сделать для компенсации ошибки. Затем посылает драйверу AT команду сделать необходимое количество шагов.
  • С помощью AT команды чтения оставшихся шагов программа ждет остановки  двигателя и, при необходимости, формирует следующую команду вращения ротора.
  • Положение вала двигателя отображается на мониторе компьютера.

Программу я назвал Tracker. Загрузить ее можно по этой ссылке.

Варианты подключения, первый запуск, установка номера порта абсолютно такие же, как в программе Thermometer  (Урок 24). Для проверки удобнее использовать виртуальный порт, который создает драйвер Ардуино при подключении платы к компьютеру. Запускать программу Arduino IDE для этого не надо.

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

У меня собранное устройство выглядит так.

Следящий электропривод

Прищепка выполняет роль стрелки положения вала двигателя.

Окно программы Tracker выглядит так.

Программа следящего электропривода

Часть графических элементов управления аналогичны компонентам программы StepMotor из предыдущего урока.

  • Панель ”Скорость” позволяет задать скорость вращения.
  • С помощью панели “Режим” можно задать режим коммутации фаз и остановки двигателя.
  • Панель “Шаги” позволяет сделать произвольное количество шагов.

Надо только помнить, что данные с этих трех панелей передается в драйвер нажатием кнопок ”-->” рядом с соответствующими панелями.

  • Через панель “Параметры двигателя” можно задать число шагов двигателя на полный оборот и период коммутации фаз в программе драйвера (в моей программе 250 мкс).
  • Светодиод ”Обмен” сигнализирует о состоянии связи компьютера с драйвером. В нормальном режиме должен светиться зеленым.
  • Кнопки “– 1 шаг” и “+ 1 шаг” позволяют сделать по одному шагу по часовой и против часовой стрелки.

В программе появились новые элементы для управления следящим приводом.

Прежде всего, это шкала угла положения вала двигателя. На ней два указателя:

  • Заданного угла – треугольник зеленого цвета;
  • Реального угла – треугольник красного цвета.

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

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

Активная птичка ”Слежение” означает, что при перемещении указателя заданного угла двигатель оперативно (в реальном времени) отрабатывает положение. Т.е. вал реального двигателя следует за зеленым указателем.

Если птички  ”Слежение” нет, то заданное значение отслеживается только по нажатию кнопки ”Пуск”.

Кнопка “Синхронизация” устанавливает оба указателя в нулевое положение. Используется для задания начального положения двигателя.

Я снял короткий фильм о работе следящего привода.

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

Только надо помнить, что в режиме фиксации ротора при остановке через драйверы всегда течет ток. На транзисторы драйвера должны быть установлены радиаторы. Иначе они могут перегреться и сгореть.

 

Ардуино проект следящего электропривода с управлением от переменного резистора.

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

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

К аналоговому входу A0 платы подключен переменный резистор по этой схеме.

Схема подключения переменного резистора

У меня собранное устройство выглядит так.

Следящий электропривод

Следящий привод должен поворачивать вал двигателя вслед за перемещением вала резистора. Управляет следящей системой программа платы Ардуино.

 

Резидентная программа следящего электропривода на Ардуино.

Скетч программы можно загрузить по этой ссылке. Надеюсь, у Вас уже установлены библиотеки TimerOne.h и StepMotor.h.

Скетч программы небольшой.

// программа следящего электропривода без обратной связи
 
#include <TimerOne.h>
#include <StepMotor.h>

#define MEASURE_PERIOD 80  // время периода измерения (* 250 мкс)
#define numStepsMotor 400  // число шагов двигателя на оборот

int timeCount;  // счетчик времени
long  sumU; // переменные для суммирования кодов АЦП
long  averageU; // сумма кодов АЦП (среднее значение * 80)
int currentStep;  // текущее положение двигателя
int setStep;  // заданное положение двигателя

StepMotor myMotor(10, 11, 12, 13);  // создаем объект типа StepMotor, задаем выводы для фаз

void setup() {
  Timer1.initialize(250);  // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250);  // обработчик прерываний
  myMotor.setMode(0, false);  // шаговый режим, без фиксации при остановке
  myMotor.setDivider(15);     // делитель частоты 15
}

void loop() {
  // проверка остановки двигателя
  if( myMotor.readSteps() == 0) {
    // двигатель остановился

    // вычисление заданного положения
    setStep = averageU * (numStepsMotor - 1) / 1023 / MEASURE_PERIOD;

    // определение сколько шагов надо сделать
    int stepsToDo;  // сколько шагов надо сделать

    stepsToDo = currentStep - setStep; // ошибка рассогласования

    if( abs(stepsToDo) >= (numStepsMotor / 2) ) {

      if((stepsToDo) > 0) stepsToDo -= numStepsMotor;
      else                stepsToDo += numStepsMotor;     
    }
 
    myMotor.step(stepsToDo);  // запуск двигателя
    currentStep = setStep;  // перегрузка текущего положения   
  }
}

//-------------------------------------- обработчик прерывания 250 мкс
void  timerInterrupt() {
  myMotor.control(); // управвление двигателем

  sumU += analogRead(A0);  // суммирование кодов АЦП
  timeCount++;  // +1 счетчик выборок усреднения

  // проверка числа выборок усреднения
  if ( timeCount >= MEASURE_PERIOD ) {
    timeCount= 0;
    averageU= sumU; // перегрузка среднего значения
    sumU= 0;
    }
}

В программе измеряется и усредняется значение напряжения на аналоговом входе A0. Этот блок описан в уроке 13.

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

Вот короткий фильм о работе устройства.

У моего двигателя 400 шагов на оборот. Если Вы используете другой привод, то надо изменить строку

#define numStepsMotor 400  // число шагов двигателя на оборот

Двигатель работает в шаговом режиме без фиксации ротора при остановке. Режим задан в блоке setup, его  легко можно изменить. В полу шаговом режиме число шагов двигателя надо задать в два раза большим. В моем случае:

#define numStepsMotor 800  // число шагов двигателя на оборот

В некоторых положениях переменного резистора значение АЦП дергается на одну единицу. Обычное для преобразования аналогового сигнала явление. Шаговый двигатель отрабатывает это изменение заданного угла, что выражается в подергивании вала. Я не стал компенсировать этот эффект, потому что программа больше демонстрационная.

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

 

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

Предыдущий урок     Список уроков     Следующий урок

5 комментариев на «Урок 32. Следящий электропривод с шаговым двигателем.»

  1. Здравствуйте Эдуард! Прочёл Вашу статью и был поражен Вашей работоспособностью и глубиной знаний предмета.На таких людях и держится наша Россия. У меня маленькая просьба,в программе tracker можно ли добавить одну опцию-задать величину угла с клавиатуры и затем её повторять 26 раз или более по количеству зубцов шестерни.Ваша программа хорошо подойдёт для делительной головки к токарному станку. По цене комплектующих -бюджетный вариант. Драйвер сам соберу,а за программу сколько назначите. С уважением Смолин А.Н.

  2. Здравствуйте!
    Повторил схему следящего ШД, но результат отличен от того, что получилоь у Вас.
    Вал двигателя постоянно дёргается и при неизменном положении ручки переменника, и даже когда вход АЦП прижат к земле.
    Проблема в том, что значения setStep постоянно меняются
    setStep= 64
    setStep= 64
    setStep= 27
    setStep= 60
    setStep= 65
    В стандартном скетче показания АЦП передаются правильно.
    плата Nano на 168 Меге.
    В чём может быть проблема?

    • Здравствуйте! А что значит «В стандартном скетче показания АЦП передаются правильно»? Вы изменили программу?

      • Попробуйте поставить конденсатор 0,1 — 1 мкФ между аналоговым входом и землей. Разместить его надо на контактах разъема.
        Попробуйте вывести setStep на компьютер и проверьте работу АЦП с отключенным двигателем. Возможно у вас слабый блок питания или двигатель дает помехи.

        • Здравствуйте! стандартным я называл скетч из «примеров» ардуино.

          Спасибо за совет- запитал ШД от отдельного источника и поставил конденсатор, теперь работает правильно)

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

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