Яндекс.Метрика

AVR446

Линейное управление скоростью шагового двигателя

Ключевые моменты:

  • Линейное управление скоростью шагового двигателя

- Контроль ускорения, замедления, максимальной скорости и числа шагов перемещения.

  • Управление с помощью одного прерывания по таймеру.
  • Полно – или полушаговый режим привода.
  • Поддерживает все устройства AVR с 16 битным таймером.
  • Демонстрационная программа для ATmega48, работающего на частоте 3,68 МГц, с последовательным интерфейсом 19200/8/N/1.

1. Введение

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

Работа предлагаемого линейного контроллера скорости основана на алгоритме, описанном в статье Дэвида Остина (D. Oustin) “Generate stepper-motor speed profiles in real time”, которая была опубликована в журнале “Embedded Systems Programming” в январе 2005 года. Этот алгоритм допускает параметризацию и расчет в реальном времени, используя только простые арифметические операции над числами с фиксированной точкой, без применения таблиц данных.

 

Рисунок 1-1. Шаговые двигатели

2. Теория

2.1 Шаговый двигатель

 

Данные рекомендации по применению охватывают теорию, касающуюся линейного управления изменением скорости шагового двигателя, а также реализации самого контроллера. Подразумевается, что читатель знаком с принципом работы шагового двигателя, тем не менее, будет дано краткое изложение основных моментов. Более подробная информация о шаговых двигателях может быть найдена в книге Джонса (D. W. Jones) “Control of Stepper Motors”.

 

2.1.1 Сравнение однополярных и биполярных шаговых двигателей

 

Два широко распространенных типа шаговых двигателей – это биполярные и однополярные двигатели. Они аналогичны друг другу за исключением того, что каждая обмотка однополярного двигателя имеет центральный отвод, показанный на рис. 2-1.

 

Рисунок 2-1. Биполярный и однополярный шаговый двигатели.

 

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

 

Рисунок 2-2. Драйверы биполярного и однополярного двигателей на MOS транзисторах.

 

2.1.2 Сравнение полношагового и полушагового режимов работы

 

В шаговых двигателях, используемых в полношаговом режиме, напряжение единовременно подается на одну обмотку. При этом возможны четыре состояния (позиции), показанные в строке “Full-stepping” таблицы 2-1. Путем подачи напряжения на обе обмотки одновременно шаговый двигатель может быть «заперт» между двумя положениями, полученными в полношаговом режиме. Такой режим известен как полушаговый. Как показано в строке “Half-stepping” таблицы 2-1 он дает восемь положений. При запитывании обеих обмоток одновременно вращающий момент примерно в 1.4 раза выше, чем при запитывании только одной обмотки, правда, ценой двойного увеличения потребляемой мощности. Сегменты электрического цикла в таблице 2-1 представляют собой части одного электрического цикла. Один механический цикл (оборот) обычно состоит из нескольких электрических циклов.

 

Таблица 2-1. Полношаговый и полушаговый режимы.

Полярность

Обмотка А

+

+

 

-

-

-

 

+

Обмотка B

 

+

+

+

 

-

-

-

Часть электрического цикла

Full-stepping

1

 

2

 

3

 

4

 

Half-stepping

1

2

3

4

5

6

7

8

 

2.1.3 Скоростные характеристики

 

Недостатком шагового двигателя является ограниченный вращающий момент на высоких скоростях, так как его величина будет уменьшаться с увеличением скорости вращения. Как показано на рис. 2-3 вращающий момент падает и на резонансной скорости. Резонансная скорость будет зависеть от управляющей схемы и нагрузки.

 

Рисунок 2-3. Зависимость вращающего момента от скорости

 

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

 

2.2 Основные уравнения шагового двигателя

 

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

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

 

Рисунок 2-4. Импульсы шагового двигателя

 

Счетчик генерирует эти импульсы, работая на частоте ft [Гц].

Задержка δt , программируемая счетчиком c :

Шаговый угол двигателя α, положение θ и скорость ω задаются уравнениями

где spr – число шагов на один оборот, n – число шагов, а 1 rad/sec = 9,55 оборотов в минуту.

 

2.3 Линейное изменение скорости

 

Для мягкого старта и остановки двигателя необходим контроль ускорения и замедления. На рисунке 2-5 показана взаимосвязь между ускорением, скоростью и положением. Использование постоянного ускорения/замедления дает линейный профиль скорости.

 

Рисунок 2-5. Ускорение (ώ), скорость (ω) и положение (θ)

 

Временная задержка δt между импульсами шагового двигателя контролирует скорость. Эта задержка должна рассчитываться с целью обеспечить насколько это возможно более близкое следование скорости шагового двигателя заданному линейному изменению скорости.

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

Рисунок 2-6. Зависимость «Профиль скорости – импульсы шагового двигателя/скорость»

 

2.3.1 Точный расчет задержки между шагами

 

Первая задержка счетчика c0, а также последующие задержки cn определяются уравнениями (подробную информацию смотрите в приложении):

 

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

Значение счетчика в момент времени n для интервала времени между шагами рассчитывается с использованием аппроксимации рядами Тейлора по формуле:

 

Это вычисление осуществляется намного быстрее, чем вычисление двух квадратных корней, но при n=1 вносит ошибку величиной 0.44. Способом компенсации этой ошибки является умножение c0 на 0.676.

 

2.3.2 Изменение (рампа) ускорения

 

Как показано в приложении ускорение задается значениями c0 и n. Если выполняется изменение в ускорении (или замедлении), должен быть выполнен расчет нового значения n .

Время tn и n как функции от ускорения двигателя, скорости и шагового угла задаются уравнениями

Объединение этих уравнений дает соотношение

Из него видно, что число шагов, необходимое для достижения заданной скорости, обратно пропорционально ускорению: n1ώ1=n2ώ2.

Это означает, что изменение ускорения от ώ1 до ώ2 осуществляется изменением n. Что и показано на рис. 2-7.

Рисунок 2-7. Изменение скорости вверх/вниз

 

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

 

3 Реализация

 

К рекомендациям по применению приложена работающая программа, написанная на C. Полную документацию по исходному коду и информации по компиляции можно найти, открыв файл ‘readme.html’, находящийся вместе с исходным кодом.

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

Демонстрационная программа поделена на три основных блока, как показано на блок-схеме, изображенной на рис.3-1. Каждому блоку соответствует один файл. Кроме того, имеется файл подпрограмм UART, используемый основной программой.

Рисунок 3-1. Блок-схема демонстрационной программы

В main.c имеется меню и командный интерфейс, дающие пользователю возможность контролировать шаговый двигатель с помощью терминала, подключенного к последовательной линии связи.

speed_cntr.c вычисляет необходимые данные и генерирует шаговые импульсы для того, чтобы шаговый двигатель повторял заданный профиль скорости.

sm_driver.c подсчитывает шаги и выводит соответствующие сигналы для управления шаговым двигателем.

 

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

Рисунок 3-2. Профиль скорости



Параметры, описывающие профиль скорости:

step – Число шагов для перемещения

accel – Необходимое ускорение

decal – Необходимое замедление

speed – (Максимальная) требуемая скорость.

 

3.1 Меню и командный интерфейс

 

Для использования демонстрационной программы пользователь должен подключить к последовательному порту AVR терминал. Настройки последовательного порта должны соответствовать следующим: 19200 бод, 8 бит данных, отсутствие контроля четности, 1 стоповый бит. Должен работать любой программный эмулятор терминала. Используя терминал, пользователь может задавать различные команды управления двигателем и получать ответную информацию от демонстрационной программы.

Подпрограмма обработки прерывания UART RX (находится в uart.c) сохраняет принятые символы в буфере приемника и обрабатывает код возврата на одну позицию (backspace). При получении команды <inter> (ASCII код 13) основная программа читает буфер приемника и выполняет заданную команду.

При старте программы и при задании команды ‘?’ отображается этот экран помощи:

После отображения меню или выполнения команды выводится информационная строка:


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

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

  • Нажимая <inter>

Шаговый двигатель работает в соответствии с настройками, заданными в приложении.

  • m [data]

Шаговый двигатель перемещается на [data] шагов с заданными настройками.

  • move [steps][accel][decel][speed]

Двигатель перемещается на [steps] шагов, используя указанные значения[accel][decal][speed].

Когда шаговый двигатель начнет движение, будет отображено ‘Running…’. До тех пор пока двигатель вращается, новые команды блокируются. После его остановки выдается сообщение ‘Ok’ и принимаются новые команды.

 

3.2 Контроллер скорости

Контроллер скорости рассчитывает и генерирует профиль скорости. Блок-диаграмма контроллера скорости приведена на рис. 3-3. Для запуска шагового двигателя контроллер скорости настраивается путем вызова функции Move().

Рисунок 3-3. Блок-диаграмма контроллера скорости


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

 

3.2.1 Установочные расчеты

 

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

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

Нахождение скорости:

Нахождение ускорения:

Для расчета профиля скорости существует два различных сценария:

  1. Ускорение продолжается до тех пор, пока не будет достигнута необходимая скорость, или
  2. Замедление начинается до того как будет достигнута необходимая скорость.

Сценарий зависит от всех четырех переменных, описывающих профиль скорости.

3.2.2.1 Ускорение продолжается до достижения необходимой скорости

На рис. 3-4 показана рампа скорости, в которой требуемая скорость достигается до начала замедления.

Рисунок 3-4. Изменение скорости ограничено заданным значением скорости.

  • max_s_lim – число шагов, необходимое для достижения требуемой скорости.

 

  • accel_lim – число шагов до начала замедления (игнорирование требуемой скорости).

Если max_s_lim < accel_lim , то ускорение ограничено достижением требуемой скорости. Замедление зависит от этого, и, в данном случае, decel_val находится по формуле:

3.2.1.2 Замедление начинается до того как будет достигнута требуемая скорость

На рис.3-5 показана рампа скорости, где замедление должно начаться до достижения требуемой скорости.

Рисунок 3-5. Рампа скорости с замедлением, начинающимся до достижения требуемой скорости.

Если max_s_lim > accel_lim , то ускорение ограничено началом замедления, а decel_val тогда рассчитывается по формуле:

3.2.2 Прерывание от таймера

 
   

Прерывание от таймера генерирует ‘шаговые импульсы’(вызывает функцию StepCounter()) и работает только при движении шагового двигателя. В соответствии с профилем скорости, показанном на рис.3-6, прерывание от таймера будет работать в четырех различных состояниях.

Рисунок 3-6. Рабочие состояния для различных участков профиля скорости

Такое протекание процесса реализуется конечным автоматом в прерывании от таймера, показанном на рис. 3-7.

Рисунок 3-7. Конечный автомат для прерывания от таймера

Во время запуска программы или при остановленном шаговом двигателе конечный автомат остается в состоянии STOP. При выполнении установочных расчетов задается новое состояние, и разрешаются прерывания от таймера. При перемещении шагового двигателя более чем на один шаг конечный автомат переходит в состояние ACCEL. Если выполняется только один шаг, состояние изменяется на DECEL.

После изменения состояния на ACCEL программа ускоряет шаговый двигатель пока:

либо не будет достигнута требуемая скорость и состояние изменится на RUN, либо

должно стартовать замедление, изменяя состояние на DECEL.

 

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

Оно будет оставаться в DECEL и замедлять двигатель до тех пор, пока скорость за требуемое число шагов не достигнет нулевого значения. Затем состояние изменится на STOP.

3.2.2.1 Вычисления и счетчики

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

Для отслеживания положения и при изменении состояния необходимы некоторые переменные-счетчики. Рис. 3-8 иллюстрирует их использование.

Рисунок 3-8. Расчетные величины во временной задержке

  • step_count подсчитывает шаги, начиная с нуля при старте ACCEL. После завершения DECEL ее значение равно числу шагов, заданному в команде.
  • accel_count используется для управления ускорением/замедлением. Стартует с нуля в состоянии ACCEL и увеличивается за один шаг на единицу, пока не завершится состояние ACCEL. Во время старта DECEL принимает значение decel_val, являющееся отрицательным, и инкрементируется на каждом шаге. При достижении нулевого значения движение прекращается, состояние переходит в STOP.
  • decel_start сообщает о том, когда начнется замедление. В тот момент, когда step_count становится равным decal_start, состояние переходит в DECEL.

3.3 Драйвер шагового двигателя

Драйвер шагового двигателя генерирует соответствующую последовательность сигналов для перемещения двигателя в заданном командой направлении. Блок-схема драйвера шагового двигателя показана на рис.3-9.

Рисунок 3-9. Блок-схема драйвера шагового двигателя


Счетчик шагов инкрементируется или декрементируется при каждом вызове функции Step_Counter(). При использовании полношагового режима значение счетчика изменяется от 0 до 3, в полушаговом режиме работы двигателя счетчик принимает значения от 0 до 7. Это значение соответствует различным положениям шагового двигателя в одном электрическом цикле. Значение счетчика шагов используется в качестве индекса для таблицы шагов. Благодаря этому на драйвер шагового двигателя подаются корректные сигналы.

 

3.3 Скорость и размер кода

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

Во время вызова Move() перед стартом прерываний от таймера выполняются установочные расчеты. Это вносит задержку между вызовом функции и запуском шагового двигателя, составляющую приблизительно 1.5 mS. По прерыванию от таймера осуществляются расчеты во время ускорения и замедления. Обработка каждого прерывания требует примерно 200 uS. При работе с постоянной скоростью для обработки прерывания оказывается достаточным около 35 uS. Из сказанного выше видно, что максимальная выходная скорость ограничивается вычислениями для ускорения/замедления. Для шагового двигателя с 400 шагами на один оборот максимальная выходная скорость:


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

 

4 Литературные ссылки

D.Austin, Generate stepper-motor speed profiles in real time, статья в ‘Embedded Systems Programming’, январь 2005

http://www.embedded.com//showArticle.jhtml?articleID=56800129

D.W.Jones, Control of Stepper Motors, sections 5.2.10, 10.8, 10.9 and 10.10 книги

Handbook of Small Electric Motors под редакцией W.H.Yeadon и A.W.Yeadon

McGraw-Hill, 2001. http://www.cs.uiowa.edu/~jones/step/

 

5 Приложение

5.1 Задержка счетчика

Скорость в данный момент времени:

Положение задается:

n-й шаговый импульс при угле поворота вала θ = :

а временная задержка между двумя шагами:

И наконец, выражение для задержки счетчика:

Это ведет к выражениям для первой и n-й задержкам счетчика:

5.2 Задержка между шагами

Использование аппроксимации рядами Тейлора

ведет к

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

Исходный код демонстрационной программы находится в AVR446.zip

 

Бесплатный хостинг uCoz