Avr шаговый двигатель


Управление шаговым двигателем по UART - Проекты - AVR project.ru

$regfile = "2313def.dat"$crystal = 4000000$baud = 9600

'заводим переменныеDim S As Byte                             'эта переменная следит за номером шага двигателяDim A As Word                             'хранит количество сделанных шаговDim N As Word                             'хранит количество полушагов которые необходимо сделатьDim T As String * 6                       'хранит команду пришедшую по UARTDim Sign As String * 1                    'хранит направление движенияDim M As Byte                             'хранит количество знаков в команде пришедшей по UARTDim Char As String * 5                    'хранит числовое значение необходимых шагов

S = 1                                     'нумерация шагов начинается с единицы

'прерывания будут генерироваться пока на ноге низкий уровень, то есть пока кнопка будет нажатаConfig Int0 = Low LevelConfig Int1 = Low Level

Config Portb = Output                     'конфигурируем порт на выходConfig Portd.5 = Output                   'конфигурируем ногу для подключения светодиодаLed Alias Portd.5                         'присваиваем имя LED выводу 5 порта D

On Urxc Command                           'даем ссылку на обработчик прерывания по UARTOn Int0 Knopka1                           'даем имена обработчикам прерываний от кнопокOn Int1 Knopka2

'разрешаем прерыванияEnable InterruptsEnable UrxcEnable Int0Enable Int1

Print "Enter direction (+,-) and value step"

'****** ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ ******

Do'проверяем состояние переменной Sign'в зависимости от ее содержимого выполняем соответствующий код

 If Sign = "+" Then                       'если в ней плюс  Led = 1                                 'зажигаем светодиод  Gosub Plus                              'выполняем подпрограмму с меткой plus  Led = 0                                 'гасим светодиод

 Print "OK!" Print "" Print "Enter direction (+,-) and value step"

 End If

 If Sign = "-" Then                       'если в ней минус  Led = 1                                 'зажигаем светодиод  Gosub Minus                             'выполняем подпрограмму с меткой minus  Led = 0                                 'гасим светодиод

 Print "OK!" Print "" Print "Enter direction (+,-) and value step"

 End If

Loop

'****** здесь крутим двигатель в одном направлении ******

Plus:

   Do

Incr S                                    'увеличим номер шага

 If S = 9 Then                            'максимально возможный номер шага = 8  S = 1 End If

Select Case S                       'выбираем какие обмотки включать в зависимости от номера шага

Case 1 : Portb = &B00000001Case 2 : Portb = &B00000011Case 3 : Portb = &B00000010Case 4 : Portb = &B00000110Case 5 : Portb = &B00000100Case 6 : Portb = &B00001100Case 7 : Portb = &B00001000Case 8 : Portb = &B00001001

End Select

Waitus 1000                               'задержка между шагами

Incr A                                    'считаем пройденные шаги

  Loop Until A = N                        'если прошагали сколько нужно выходим из цикла

'обнуляем переменныеA = 0N = 0Sign = "0"

Return                                    'возвращаемся в главный цикл программы

'****** а здесь крутим двигатель в обратном направлении ******

Minus:

  Do

Decr S

 If S = 0 Then                            'минимально возможный номер шага = 1  S = 8 End If

Select Case S

Case 1 : Portb = &B00000001Case 2 : Portb = &B00000011Case 3 : Portb = &B00000010Case 4 : Portb = &B00000110Case 5 : Portb = &B00000100Case 6 : Portb = &B00001100Case 7 : Portb = &B00001000Case 8 : Portb = &B00001001

End Select

Waitus 1000

Incr A

  Loop Until A = N

'обнуляем переменныеA = 0N = 0Sign = "0"

Return                                    'возвращаемся в главный цикл программы

'****** обрабатываем команду пришедшую по UART ******

Command:

Input T                                   'пришедшая команда

Sign = Left(t , 1)                'вытащим первый символ, отвечающий за направление движенияM = Len(t)                        'узнаем сколько символов в пришедшей командеM = M - 1                         'убавляем на 1, так как первый символ хранит только направлениеChar = Right(t , M)               'вытаскиваем из команды все символы кроме первого символаN = Val(char)                     'преобразуем строку в числовую переменнуюN = N * 2                         'теперь мы знаем сколько нужно сделать полушагов (N)

Return

'****** обработка нажатия кнопок ******

 Knopka1:                                 '<<< обработчик прерывания первой кнопки

Led = 1                                   'зажигаем светодиод

Incr S                                    'увеличим номер шага

  If S = 9 Then                           'максимально возможный номер шага = 8   S = 1  End If

Select Case S                       'выбираем какие обмотки включать в зависимости от номера шага

Case 1 : Portb = &B00000001Case 2 : Portb = &B00000011Case 3 : Portb = &B00000010Case 4 : Portb = &B00000110Case 5 : Portb = &B00000100Case 6 : Portb = &B00001100Case 7 : Portb = &B00001000Case 8 : Portb = &B00001001

End Select

Waitus 1000                               'задержка между шагами

Led = 0                                   'гасим светодиод

Return

 Knopka2:                                 '<<< обработчик прерывания второй кнопки

Led = 1                                   'зажигаем светодиод

Decr S                                    'тут все тоже самое, только в обратном направлении

  If S = 0 Then                           'минимально возможный номер шага = 1   S = 8  End If

Select Case S

Case 1 : Portb = &B00000001Case 2 : Portb = &B00000011Case 3 : Portb = &B00000010Case 4 : Portb = &B00000110Case 5 : Portb = &B00000100Case 6 : Portb = &B00001100Case 7 : Portb = &B00001000Case 8 : Portb = &B00001001

End Select

Waitus 1000

Led = 0                                   'гасим светодиод

Return

End

avrproject.ru

Крутим шаговый двигатель - Как подключить - AVR project.ru

 

 Шаговые двигатели достаточны распространены в устройствах, в которых необходимо добиться точного перемещения механизмов. Существует много типов шаговых двигателей, но самыми дружелюбными в плане управления являются 2-х фазные униполярные двигатели. Этот тип двигателей имеет две независимые обмотки с выводами от середины. Их можно встретить преимущественно в старой технике: принтерах, копирах, дисководах (5-и дюймовых) и еще много где.

 В зависимости от от того как соединены средние обмотки внутри, из двигателя могут выходить 5 или 6 проводов. Разницы никакой нет, все равно средние выводы обмоток соединяются вместе. Характерной особенностью шаговых двигателей является дискретность поворота ротора, тоесть если взять и покрутить вал двигателя можно ощутить как он фиксируется в определенных моментах. Это и есть шаги двигателя. При запитывании одной из половины обмоток происходит фиксирование вала двигателя в определенном положении. Если снять напряжение с этой обмотки и запитать другую, ротор повернется и зафиксируется в другом положении. Таким образом, если запитывать обмотки в определенной последовательности можно добиться вращения вала двигателя. 

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

  Ротор при таком управлении принимает естественное положение относительно статора. Есть еще способ управления шаговиком в полношаговом режиме, когда одновременно запитываются две фазы, таким образом удается увеличить момент на валу на 40%. 

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

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

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

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

 С теорией немного разобрались, теперь нужно выбрать в каком режиме будет управляться двигатель. Полный шаг слишком убог и не эффективен, микрошаг сложен, да и нужен он в основном в управлении приводом высокоточного ЧПУ станка. Поэтому крутить будем в полушаге :)

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

 

  К клемме Udvig подключаются выводы от середин обмоток и туда же подводится напряжение для питания обмоток. Величина напряжения зависит от самого двигателя, для моего например по документации максимальный ток в обмотках 1,5 Ампера, измерив сопротивление обмоток получил 2 Ома, отсюда вывод что напряжение питания не должно превышать 3 В ну или немного больше, учитывая что запитываться будет индуктивная нагрузка. Кстати диоды D2-D5 стоят для того, чтобы гасить скачки обратного напряжения после закрытия транзистора. Иначе есть вероятность что ЭДС самоиндукции возникающая во время выключения питания обмотки пробъет транзистор.

 Плата управления в сборе:

 

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

Код в Bascom-AVR:

$regfile = "2313def.dat"$crystal = 4000000

Dim S As Byte                         'эта переменная следит за номером шага двигателя

S = 1

On Int0 Knopka1                       'даем имена обработчикам внешних прерыванийOn Int1 Knopka2

Config Portb = Output                 'конфигурируем порт на выходConfig Portd.5 = Output               'конфигурируем ногу для подключения светодиодаLed Alias Portd.5                     'присваиваем имя LED выводу 5 порта D

'прерывания будут генерироваться пока на ноге низкий уровень, то есть пока кнопка будет нажатаConfig Int0 = Low LevelConfig Int1 = Low Level

'разрешаем прерыванияEnable InterruptsEnable Int0Enable Int1

'основной цикл программы, просто ждем прерыванияDo

Loop

Knopka1:                            'обработчик прерывания первой кнопки

Led = 1                             'зажигаем светодиод        

Incr S                              'увеличим номер шага

 If S = 9 Then                      'максимально возможный номер шага = 8  S = 1 End If

Select Case S                       'выбираем какие обмотки включать в зависимости от номера шага

Case 1 : Portb = &B00000001Case 2 : Portb = &B00000011Case 3 : Portb = &B00000010Case 4 : Portb = &B00000110Case 5 : Portb = &B00000100Case 6 : Portb = &B00001100Case 7 : Portb = &B00001000Case 8 : Portb = &B00001001

End Select

Waitus 1000                                    'задержка между шагами

Led = 0                                        'гасим светодиод

Return

Knopka2:                                      'обработчик прерывания второй кнопки

Led = 1                                       'зажигаем светодиод        

Decr S                                        'тут все тоже самое, только в обратном направлении

 If S = 0 Then                                'минимально возможный номер шага = 1  S = 8 End If

Select Case S

Case 1 : Portb = &B00000001Case 2 : Portb = &B00000011Case 3 : Portb = &B00000010Case 4 : Portb = &B00000110Case 5 : Portb = &B00000100Case 6 : Portb = &B00001100Case 7 : Portb = &B00001000Case 8 : Portb = &B00001001

End Select

Waitus 1000

Led = 0                                       'гасим светодиод

Return

End

 

 Изменяя величину задержки между шагами, можно в больших пределах регулировать скорость вращения вала. При выбранной мной задержке в 1000 мкс с шаговиком имеющем 200 шагов на оборот (400 полушагов) скорость вращения получается примерно 2,5 оборота в секунду.

Скачать файлы к проекту

UPD: Здесь допилил программу, теперь стало возможным управление шаговым двигателем с компьютера.

avrproject.ru

Шаговые двигатели — Страница 3 — Меандр — занимательная электроника

Читать все новости ➔

Ключевое регулирование реализуют и многие другие микросхемы. Некоторые микросхемы обладают теми или иными особенностями, например драйвер LMD18T245 фирмы National Semiconductor не требует применения внешнего датчика тока, так как он реализован внутри на основе одной ячейки ключевого МОП-транзистора.

Некоторые микросхемы предназначены специально для работы в микрошаговом режиме. Примером может служить микросхема A3955 фирмы Allegro. Она имеет встроенный 3-битный нелинейный ЦАП для задания изменяющегося по синусоидальному закону тока обмотки.

Рис. 29. Ток и вектор смещения ротора.

Смещение ротора в зависимомти от токов обмоток, которые сформированы этим 3-битным ЦАПом, показано на рис. 29. Микросхема A3972 имеет встроенный 6-битный линейный ЦАП.

Выбор типа драйвера

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

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

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

Практический пример контроллера шагового двигателя на основе микроконтроллера семейства AVR

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

Предлагаемый контроллер предназначен для управления униполярным шаговым двигателем со средним током каждой обмотки до 2.5А. Контроллер может использоваться с распространенными шаговыми двигателями типа ДШИ-200-1, -2, -3. Его также можно использовать и для управления менее мощными двигателями, например теми, что применялись для позиционирования головок в 5-дюймовых дисководах. При этом схему можно упростить, отказавшись от параллельного включения ключевых транзисторов и от ключевой стабилизации тока, так как для маломощных двигателей достаточно простого L/R-питания.

Рис. 30. Принципиальная схема контроллера шагового двигателя.

Основой устройства (рис. 30) является микроконтроллер U1 типа AT90S2313 фирмы Atmel. Сигналы управления обмотками двигателя формируются на портах PB4 – PB7 программно. Для коммутации обмоток используются по два включенных параллельно полевых транзистора типа КП505А, всего 8 транзисторов (VT1 – VT8). Эти транзисторы имеют корпус TO-92 и могут коммутировать ток до 1.4А, сопротивление канала составляет около 0.3 ома. Для того, чтобы транзисторы оставались закрытыми во время действия сигнала «сброс» микроконтроллера (порты в это время находятся в высокоимпедансном состоянии), между затворами и истоками включены резисторы R11 – R14. Для ограничения тока перезарядки емкости затворов установлены резисторы R6 – R9. Данный контроллер не претендует на высокие скоростные характеристики, поэтому вполне устраивает медленный спад тока обмоток, который обеспечивается шунтированием обмоток двигателя диодами VD2 – VD5. Для подключения шагового двигателя имеется 8-контактный разъем XP3, который позволяет подключить двигатель, имеющий два отдельных вывода от каждой обмотки (как, например, ДШИ-200). Для двигателей с внутренним соединением обмоток один или два общих контакта разъема останутся свободными.

Необходимо отметить, что контроллер может быть использован для управления двигателем с большим средним током обмоток. Для этого только необходимо заменить транзисторы VT1 – VT8 и диоды VD2 – VD5 более мощными. Причем в этом случае параллельное включение транзисторов можно не использовать. Наиболее подходящими являются МОП-транзисторы, управляемые логическим уровнем. Например, это КП723Г, КП727В и другие.

Стабилизация тока осуществляется с помощью ШИМ, которая тоже реализована программно. Для этого используются два датчика тока R15 и R16. Сигналы, снятые с датчиков тока, через ФНЧ R17C8 и R18C9 поступают на входы компараторов U3A и U3B. ФНЧ предотвращают ложные срабатывания компараторов вследствие действия помех. На второй вход каждого компаратора должно быть подано опорное напряжение, которое и определяет пиковый ток в обмотках двигателя. Это напряжение формируется микроконтроллером с помощью встроенного таймера, работающего в режиме 8-битной ШИМ. Для фильтрации сигнала ШИМ используется двухзвенный ФНЧ R19C10R22C11. Одновременно резисторы R19, R22 и R23 образуют делитель, который задает масштаб регулировки токов обмоток. В данном случае максимальный пиковый ток, соответствующий коду 255, выбран 5.11А, что соответствует напряжению 0.511В на датчиках тока. Учитывая тот факт, что постоянная составляющая на выходе ШИМ меняется от 0 до 5В, необходимый коэффициент деления равен примерно 9.7. Выходы компараторов подключены к входам прерываний микроконтроллера INT0 и INT1.

Для управления работой двигателя имеются два логических входа: FWD (вперед) и REW (назад), подключенных к разъему XP1. При подаче НИЗКОГО логического уровня на один из этих входов, двигатель начинает вращаться на заданной минимальной скорости, постепенно разгоняется с заданным постоянным ускорением. Разгон завершается, когда двигатель достигает заданной рабочей скорости. Если подается команда изменения направления вращения, двигатель с тем же ускорением тормозится, затем реверсируется и снова разгоняется.

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

Командные входы и входы концевых выключателей защищены от перенапряжений цепочками R1VD6, R2VD7, R3VD8 и R4VD9, состоящими из резистора и стабилитрона.

Питание микроконтроллера формируется с помощью микросхемы стабилизатора 78LR05, которая одновременно выполняет функции монитора питания. При понижении напряжения питания ниже установленного порога эта микросхема формирует для микроконтроллера сигнал «сброс». Питание на стабилизатор подается через диод VD1, который вместе с конденсатором C6 уменьшает пульсации, вызванные коммутациями относительно мощной нагрузки, которой является шаговый двигатель. Питание на плату подается через 4-контактный разъем XP4, контакты которого задублированы.

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

Главной задачей программы является формирование импульсных последовательностей для 4-х обмоток двигателя. Поскольку для этих последовательностей временные соотношения являются критичными, формирование выполняется в обработчике прерывания таймера 0. Можно сказать, основную работу программа делает именно в этом обработчике. Блок-схема обработчика приведена на рис. 31.

Рис. 31. Блок-схема обработчика прерывания таймера 0.

Несомненно, было бы удобнее использовать таймер 1, так как он 16-разрядный и способен вызывать периодические прерывания по совпадению с автоматическим обнулением. Однако он занят формированием с помощью ШИМ опорного напряжения для компараторов. Поэтому приходится перезагружать таймер 0 в прерывании, что требует некоторой корректировки загружаемой величины и вызывает некоторый джиттер, который, однако, на практике не мешает. В качестве основной временной базы выбран интервал 25мкс, который и формируется таймером. С такой дискретностью могут формироваться временные последовательности фаз, такой же период имеет и ШИМ стабилизации тока в обмотках двигателя.

Для формирования периода повторения шагов используется программный 16-разрядный таймер STCNT. В отличие от таймера 0, его загрузочная величина не является константой, так как именно она определяет скорость вращения двигателя. Таким образом, переключение фаз происходит только при переполнении программного таймера.

Последовательность чередования фаз задана таблично. В памяти программ микроконтроллера имеются три разных таблицы: для полношагового режима без перекрытия, полношагового с перекрытием и для полушагового режима. Все таблицы имеют одинаковую длину 8 байт. Нужная таблица в начале работы загружается в ОЗУ, что позволяет наиболее просто переходить между разными режимами работы двигателя. Выборка значений из таблицы происходит с помощью указателя PHASE, поэтому переключение направления вращения двигателя тоже осуществляется очень просто: для вращения вперед требуется инкрементировать указатель, а для вращения назад – декрементировать.

Самая «главная» переменная в программе – это 24-битная знаковая переменная VC, которая содержит значение текущей скорости. Знак этой переменной определяет направление вращения, а значение – частоту следования шагов. Нулевое значение этой переменной говорит о том, что двигатель остановлен. Программа в этом случае выключает ток всех обмоток, хотя во многих приложениях в этой ситуации требуется оставить включенными текущие обмотки и лишь несколько уменьшить их ток, обеспечив этим удержание положения двигателя. При необходимости такое изменение логики работы программы сделать очень просто.

Таким образом, в случае переполнения программного таймера STCNT происходит анализ значения переменной VC, в случае положительного значения указатель PHASE инкрементируется, а в случае отрицательного – декрементируется. Затем из таблицы выбирается очередная комбинация, которая выводится в порт. В случае нулевого значения VC указатель PHASE не изменяется, и в порт выводятся все нулевые значения.

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

Для осуществления ШИМ-стабилизации тока обмотки должны периодически включаться, а затем при достижении током заданного уровня - выключаться. Периодическое включение производится в прерывании таймера 0, для чего даже в случае отсутствия переполнения программного таймера STCNT в порт выводится текущая комбинация. Происходит это с периодом 25мкс (что соответствует частоте ШИМ 40кГц). Выключением обмоток управляют компараторы, выходы которых подключены к входам прерывания INT0 и INT1. Прерывания разрешаются после того, как ток обмоток включается, и запрещаются сразу после переключения компараторов. Это исключает их повторную обработку. В обработчиках прерываний происходит только отключение соответствующих обмоток (рис. 32).

Рис. 32. Блок-схема обработчика прерываний INT0 и INT1.

Процессы, происходящие при ШИМ-стабилизации тока, показаны на рис. 33. Особо следует отметить, что ток в датчике тока имеет прерывистый характер даже в том случае, если ток обмотки не прерывается. Это связано тем, что во время спада тока его путь не проходит через датчик тока (а проходит через диод).

 

Рис. 33. Процесс ШИМ-стабилизации тока.

Нужно сказать, что аналоговая часть системы ШИМ-стабилизации тока обмоток двигателя является довольно «капризной». Дело в том, что сигнал, снимаемый с датчика тока, содержит большое количество помех. Помехи возникают в основном в моменты коммутации обмоток двигателя, причем как «своей», так и «чужой». Для правильной работы схемы требуется корректная разводка печатной платы, особенно это касается земляных проводников. Возможно, придется подобрать номиналы ФНЧ на входе компаратора или даже ввести в компаратор небольшой гистерезис. Как уже отмечалось выше, при управлении маломощными двигателями от ШИМ-стабилизации тока можно вовсе отказаться, применив обычную L/R-схему питания обмоток. Для исключения ШИМ-стабилизации достаточно просто не подключать входы INT0 и INT1 микроконтроллера, естественно, при этом можно вообще не устанавливать компаратор и датчики тока.

В данной программе периодичность вычисления новых значений скорости и периода выбрана равной 15.625мс. Такое значение выбрано не случайно. Этот интервал составляет 1/64с, а главное, он содержит целое число периодов переполнения таймера 0 (25мкс). Удобно, если значения скорости и ускорения задаются в естественных единицах, т.е. в шагах в секунду и в шагах, деленных на секунду в квадрате. Для того чтобы иметь возможность в целочисленной арифметике вычислять мгновенную скорость 64 раза в секунду, нужно перейти к внутреннему представлению скорости, увеличенному в 64 раза. Умножение и деление на 64 сводится к обычным сдвигам и поэтому требует очень мало времени. Заданную периодичность вычислений обеспечивает еще один программный таймер URCNT, который декрементируется в прерывании таймера 0 (раз в 25мкс). Этот таймер всегда загружается постоянной величиной, что обеспечивает неизменный период его переполнений, равный 15.625мс. При переполнении этого таймера устанавливается битовый флаг UPD, который сигнализирует основной программе, что «пора-бы обновить значения скорости и периода».

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

Рис. 34. Блок-схема основного цикла программы.

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

Значение требуемой скорости также определяется в основной программе. Это делается на основе анализа управляющих сигналов и сигналов с концевых выключателей. В зависимости от этих сигналов, основная программа загружает переменную VR значением требуемой скорости. В данной программе это V для движения вперед, -V для движения назад и 0 для остановки. В общем случае, набор скоростей (а также ускорений и токов обмоток) может быть сколь угодно большим, в зависимости от требований.

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

Если при очередной проверке обнаруживается, что скорости VR и VC не равны, то к значению VC прибавляется (или вычитается) значение ускорения A. Если в результате этой операции происходит превышение требуемой скорости, то полученное значение корректируется путем замены на точное значение требуемой скорости.

Затем происходит вычисление периода T (рис. 35).

Рис. 35. Блок-схема подпрограммы вычисления периода.

Вначале вычисляется модуль текущей скорости. Затем происходит ограничение минимальной скорости. Это ограничение необходимо по двум причинам. Во-первых, бесконечно малой скорости соответствует бесконечно большой период, что вызовет ошибку в вычислениях. Во-вторых, шаговые двигатели имеют довольно протяженную по скорости зону старта, поэтому нет необходимости стартовать на очень маленькой скорости, тем более что вращение на малых скоростях вызывает повышенный шум и вибрацию. Значение минимальной скорости VMIN должно выбираться исходя из конкретной задачи и типа двигателя. После ограничения минимальной скорости производится вычисление периода по формуле T = 2560000/|VC|. На первый взгляд формула не очевидна, но если учесть, что период необходимо получить в 25мкс-интервалах, а внутреннее представление VC – это умноженное на 64 ее истинное значение, то все становится на свои места. При вычислении T требуется операция беззнакового деления формата 24/24, которое AVR на тактовой частоте 10МГц делает примерно за 70мкс. Учитывая, что вычисления периода происходят не чаще, чем один раз в 15.625мс, загрузка процессора получается очень низкой. Основную загрузку производит прерывание таймера 0, да и оно в основном выполняется по короткой ветке (без переполнения STCNT) длительностью примерно 3мкс, что соответствует 12%-й загрузке процессора. Это означает, что имеются значительные резервы вычислительных ресурсов.

Печатная плата контроллера шагового двигателя приведена на рис. 36.

Рис. 36. Печатная плата контроллера шагового двигателя.

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

  • максимальная частота коммутации фаз 3 Кгц
  • разгон с постоянным ускорением
  • программируемое направление вращения
  • программируемое ускорение
  • программируемый средний ток обмоток
  • программируемый ток удержания
  • режим перемещения на N шагов
  • полушаговый режим
  • формирователь импульса привязки с программируемой задержкой
  • хранение основных параметров в энергонезависимой памяти
  • один внешний источник питания
  • управление по интерфейсу RS-232C или местное
  • адресация до 7 устройств на одном RS-232C

Рис. 37. Микрошаговый контроллер шагового двигателя.

Более совершенный контроллер построен на основе специализированной микросхемы A3977 фирмы "Allegro". Он обладает следующими возможностями:

  • управление биполярными шаговыми двигателями
  • максимальное напряжение питания – 35 В
  • максимальный ток питания двигателя – 2.5 А
  • ШИМ-стабилизация тока обмоток двигателя
  • поддержка микрошагового режима до 1/8 шага
  • скорость вращения от 1 до 32 000 микрошагов/сек
  • подключение двух концевых выключателей (NO или NC)
  • программное разрешение/запрещение концевых выключателей
  • подключение датчика базового положения
  • возможность подключения квадратурного энкодера
  • разгон с заданным ускорением
  • программируемый ток обмоток для разгона, движения и удержания
  • поддержка медленной, быстрой и смешанной скорости спада тока
  • перемещение на абсолютную координату или на заданное число шагов
  • абсолютная координата ±2 000 000 000 микрошагов
  • чтение и установка абсолютной координаты
  • задание скорости начала разгона
  • сохранение параметров в энергонезависимой памяти
  • местное управление с помощью кнопок
  • программируемые функции кнопок (вращение/шаг/скорость)
  • возможность управления с помощью логических сигналов
  • светодиодная индикация режимов работы
  • контроль напряжения питания
  • количество пользовательских каналов цифрового ввода-вывода – 8
  • тип цифровых выходов – открытый сток
  • выходной ток цифрового выхода – до 100 мА
  • напряжение на цифровых выходах – до 30 В
  • пороговое напряжение цифровых входов – 1.7 В
  • управление по интерфейсу RS-485
  • включение в цепочку по RS-485 до 64 контроллеров
  • протокол обмена – WAKE
  • один источник питания +10…35 В
  • тестовое ПО (Win98/ME/2000/XP)
  • библиотека функций управления (DLL)
Download:
step.zip (4.5 Kb) - архив с демонстрационной версией программы контроллера.
drive.pdf (90 Kb) - таблицы специализированных микросхем драйверов ШД.
d-200-3.zip (421 Kb) - архив с паспортом шагового двигателя ДШИ-200-3.

digit-el.com

Возможно, Вам это будет интересно:

meandr.org