Далее опишу алгоритм управления ШД с помощью микроконтроллера.
Перед тем, как начать описывать задачу, я изложу основы управления ШД, которые будут включать необходимый минимум для рассмотрения, описанных в статье способов управления.
Рассмотрим необходимый минимум основ управления ШД , необходимый для понимания принципа управления, описанного ниже. А именно:
Способы подключения обмоток, необходимые для осуществления данного режима работы. Полношаговый режим управления при задействовании на один шаг двух фаз.
Изменение полярности обмотки с помощью Н-моста.
Принципиальная электрическая схема, включающая в себя 4 драйвера полумоста и 2 Н-моста.
Способ модуляции синусоидального сигнала с помощью широтно-импульсной модуляции (далее просто ШИМ).
ШД имеют 4,5,6 или 8 выводов обмоток. При подключении к модулю управления ШД в каждом конкретном случае необходимо задействовать определенные выводы. В четырех выводном ШД задействуются все четыре вывода. Пяти выводной ШД не подходит для метода управления, описываемого в этой статье. В шести выводном не задействуются выводы нейтральных точек. В восьми выводном ШД обмотки соединены последовательно (см. рис. 1). Конечно можно задействовать все выводы обмоток, но эти методы управления выходят за рамки статьи.
Описание полношагового режима управления.
Для управления ШД необходимо подавать определенную последовательность сигналов на обмотки ШД . По сути создавая статором бегущую волну, заставляющую синхронно вращаться поле статора и ротора ШД . На рис. 2 над диаграммой схематично показан статор с обмотками. Цвет обмоток указывает на их полярность. В центре находится ротор в виде магнита. Если обратить внимание на диаграмму, то будет видно, что в середине каждого шага идет поочередное изменение полярности обмоток. В след за изменяющимся полем статора, вращается ротор по часовой стрелке. Для изменения вращения двигателя можно поменять местами выводы одной обмотки, и ротор начнет вращаться в противоположную сторону. Но зачем менять подключение обмоток, если можно программным путем поменять местами подаваемые сигналы, что и сделано с А+ и А- на рис.2. При этом ротор также начнет вращаться в противоположную сторону. Для большей наглядности сигнал на диаграмме имеет прямоугольную форму. Далее в статье прямоугольный сигнал будет заменен на сигнал ШИМ, модулирующий синусоиду.
Изменить полярность обмотки можно с помощью Н-транзисторного моста (см. рис. 3). В первом варианте из 4 транзисторов открыты Т1,Т4. Ток, соответственно, течет через них. Поменять полярность можно, открыв транзисторы Т2 ,Т3 и при этом закрыв Т1 И Т4. Таким образом, ток через обмотку потечет в противоположную сторону.
Для управления ШД используют два Н моста чаще всего на основе восьми N-канальных MOSFET транзисторов. Для управления транзисторами используются мостовые или полумостовые драйверы. Напряжение на затворе зачастую должно быть выше напряжения истока транзистора на 5-15В. Для MOSFET транзисторов это делают драйверы.
Кроме того, драйверы силовых ключей, в отличие от простых преобразователей уровня, снабжены множественными механизмами защиты как самого драйвера, так и управляемых ключей. Это позволяет выполнять формирование выходных управляющих сигналов согласно определенным алгоритмам, чтобы предотвратить выход системы из строя в аварийной ситуации.
Механизм встроенного временного промежутка Dead-Time обеспечивает гарантированное закрытие одного силового ключа до момента начала открытия ключа в противоположном плече. Гарантией надежного закрытия противоположного транзистора является встроенная схема, контролирующая состояние ключей и наличие схемы задержки, формирующей промежуток времени, в течение которого закрыты оба транзистора в плечах полумоста.
На рис.4 приведена принципиальная электрическая схема управления ШД, включающая в себя 4 драйвера полумоста IR2104S и 2 Н-моста на основе транзисторов IRF7836. При подаче 0 В на вход SD драйвера IR2104s драйвер переходит в неактивное состояние.
На приведенной схеме сигнал с диаграмм можно подавать на 4 входа. Так на ШИМ1 А+, на ШИМ2 А-, на ШИМ3 В+, на ШИМ4 В- соответственно (Рис.4).
Ниже кратко опишу принцип работы ШИМ, расчет и модулирование синусоиды.
ШИМ или PWM (широтно-импульсная модуляция или pulse-width modulation) – это способ изменения мощности, подаваемой на нагрузку. Управление заключается в изменении ширины импульса постоянной амплитуды, следующих через равные интервалы времени.
На рис.5 видно, как регулируется мощность. Так 20%, 40%, 80%, 100% это время, когда транзистор открыт относительно времени периода. Соответственно среднее напряжение будет приблизительно равно 20%, 40%, 80%, 100% от максимального.
Меняя ширину импульса, можно модулировать различную форму сигнала. Так, по синусоидальному закону, при котором ширина импульсов изменяется следующим образом (рис. 6), максимальна в середине шага, а к началу и концу шага уменьшается. Синусоиду можно увидеть на осциллографе, пропустив ШИМ-сигнал с контроллера через RC фильтр. Для RC фильтра использовал конденсатор 2.2 нФ и резистор 1.5кОм.
На рис. 6 показан пример модуляции одного синусоидального шага, состоящего всего из 4 уровней напряжения. Напряжение питания 12В.
Для формирования модулированного сигнала необходимо рассчитать уровни ШИМ и их количество на один шаг. На рис.7 приведено два примера одного синусоидального шага с разным количеством ШИМ уровней, где ШИМ можно изменять в пределах от 0 до 255, что соответствует напряжению от 0 до 100%. Как видно на рис.7, чем больше уровней ШИМ, тем больше форма модулированного сигнала будет повторять синусоиду. Каждое изменение ШИМ происходит по прерыванию таймера в микроконтроллере. Меняя время срабатывания прерывания, можно регулировать время одного шага соответственно и скорость двигателя.
Формулу для расчета ШИМ уровней можно получить из формулы мгновенных значений синусоидальных функции. U = Um*sin(ω*t + Ψ)
Um - амплитудное значение ω - угловая частота Ψ - начальный фаза, значение фазы в начальный момент t=0 аргумент ω*t + Ψ – называют фазой синусоидальной функции
Для расчета Ψ = 0
Синусоида от 0 до Т/4 повторяет форму половины шага, а от T/4 до Т/2 зеркально отображает вторую половину шага. Поэтому для расчета достаточно взять участок от 0 до Т/4 или от 0° до 90°. ωt – для удобства можно заменить на угол α = 0° до 90°. Um заменим на максимальное значение ШИМ_max в примере 255. U заменим на ШИМ_N. Получается ШИМ_N = ШИМ_maxSIN(α). Количество вычислений уровней ШИМ зависит от величины точности к примеру 16 с шагом угла 90°/16 = 5,625°
Пример:
ШИМ_0 = 255*SIN(5,625°*0)= 0
ШИМ_1 = 255*SIN(5,625°*1)= 24,99 ≈25
ШИМ_2 = 255*SIN(5,625°*2)=49,74≈50
. . .
ШИМ_16 = 255*SIN(5,625°*16)=255
Значения ШИМ необходимо округлять, так как оно может быть только целым.
Вычислив уровни ШИМ, можно модулировать синусоиду. Для этого я занес значения уровней в массив по прерыванию от таймера, поочередно подставляя значения от ШИМ_0 до ШИМ_16 в ШИМ контроллера. Так модулируется половина шага. Для модуляции второй половины нужно наоборот подставлять значения от ШИМ_16 до ШИМ_0.
Так модулируется один шаг. Меняя время срабатывания таймера можно менять время шага. Теперь такие синусоидальные шаги можно подавать, заменив прямоугольные шаги на диаграммах (рис.2).
Для удобства я написал небольшую программу для расчета значений ШИМ . Где PWM_MAX присваивается максимальное значение ШИМ, которое настраивается в микроконтроллере, а sampling присваивается количество уровней ШИМ на половину шага. Так как большинство программируют МК на языке С, данную программу я решил написать на этом же языке.
#include <stdio.h>
#include <math.h>
#define PI 3.14159265
#define QUANTIZATION 255 //максимальное значение ШИМ.
#define SAMPLING 16 // количество уровней напряжения на половину шага.
int i; int main()
{for(i=0; i <= SAMPLING; i++)
{printf("%d\n",(int)(QUANTIZATION * sin((double)90 / SAMPLING * PI * i / 180) + 0.5));};
return 0;
}
Выходные данные
0 25 50 74 98 120 142 162 180 197 212 225 236 244 250 254 255
На этом необходимый минимум основ управления ШД завершается. Далее будет описана поставленная задача, возникшие трудности и их решение.
Задача: Двигатель должен вращать массу около 7кг за 0,7 - 1 секунду на 90°. Угол поворота отслеживает 10 разрядный или 1024 битный абсолютный энкодер AS5040 закрепленный на валу механизма. При достижении 90° необходимо включить режим удержание ШД. При этом необходимо учитывать воздействие руки человека, толкающей механизм по направлению движения или против, либо удерживающей вплоть до остановки. При этом напряжение питания блока управления ограничено двенадцатью вольтами, а габариты двигателя ограничены по ширине 100мм, а по длине 110мм, включая длину вала. В наличии было три двигателя подходящих габаритов.
Осовные характеристики двигателей:
двигатель №1 Рабочий ток 3,1 А. Активное сопротивление обмотки 1,5 Ом Индуктивность обмотки 3,5 мГн. Момент удержания 0,3 кг*м Величина полного шага 1,8° (200 шагов на один оборот ротора).
двигатель №2 Рабочий ток 4А. Активное сопротивление обмотки 0,8 Ом. Индуктивность обмотки 3,1 мГн. Момент удержания 0,45 кг*м. Величина полного шага 1,8° (200 шагов на один оборот ротора).
двигатель №3 не соответствовал характеристикам, заявленным производителем. Производитель утверждал, что он является аналогом двигателя №2. При замере активного сопротивления обмоток выяснилось, что сопротивление не соответствовало заявленным 0,8 Ом, а составляло всего 0,2 Ом. Следовательно, рабочий ток и индуктивность тоже отличались.
Изначально решить поставленную задачу я планировал с помощью готового блока управления ШД. Было испытано около пяти готовых блоков управления ШД разной ценовой категории и разных производителей. У всех были приблизительно одни и те же результаты, которые будут описаны ниже.
При испытании двигатель №3 по шуму и вибрациям отличался от первых двух в худшую сторону. Также было замечено, что все блоки управления с этим двигателем сильно грелись. Было решено больше не использовать этот двигатель.
Проблема №1. Свист двигателя. При уменьшении тока на блоках управления шум становился меньше, двигатель более плавно вращает ротор, и всё-таки шум и плавность вращения оставляли желать лучшего. При увеличении дробления шага на блоках управления до 1/16 шум уменьшился, и плавность хода увеличилась, но эти улучшения были незначительны. Дальнейшее повышение дробления вплоть до 1/512 не привело к улучшению показателей.
Решение проблемы №1. Решил сделать свой драйвер управления ШД на основе микроконтроллера PIC18F2331. Он заточен под управление двигателями. Было задействовано 4 канала широтно-импульсной модуляции для управления 4 драйверами полумоста.
Я начал эксперименты с формой сигнала, модулируемого с помощью ШИМ. Подавал треугольный, прямоугольный, трапециевидный сигналы на обмотки двигателя. Результаты: неутешительные показатели по шуму, вибрации и плавности хода были значительно хуже по сравнению с готовыми блоками управления. Подавая на обмотки двигателя синусоидальный сигнал, плавность хода, начиная от 5 об/мин и выше, стала практически незаметной на глаз. Детали механизма не гремели, но если скорость была ниже 5 об/мин, детали гремели, механизм передвигался рывками, ток потребляемый двигателем рос и выходил за пределы рабочего тока двигателя. Что касается шума, даже при скорости выше 5 об/мин был неприятный шум. Свист похожий на звук, издаваемый зарядными устройствами для телефонов ноутбуков, только гораздо сильнее. Такой же шум я слышал от асинхронных двигателей, управляемых частотными преобразователями. Изучив работу частотных преобразователей, стало ясно, что свист зависит от частоты ШИМ. У меня частота ШИМ составляла 4кГц. При изменении частоты свист менялся, и когда я поднял частоту до 20кГц, шум полностью пропал. Слух человека в большинстве случаев не воспринимает частоту выше 20кГц.Так была решена проблема №1.
Проблема №2. Двигатель ниже 5 об/мин двигается рывками, а ток сильно возрастает, так как у драйвера нет обратной связи по току, соответственно и контроля по перегрузке тоже нет.
Решение проблемы №2. Когда напряжение питания драйвера с 12V снизил до 9V, рывки при передвижении механизма тоже стали меньше, но всё равно недостаточно плавно. Тогда напряжение выставил 12V, а амплитуду ШИМ синусоиды начал уменьшать, и при 20% амплитуды от максимума движение было плавным и тихим.
Проблема №3. Если запустить двигатель сразу на большой скорости без разгона, то момент на валу двигателя будет недостаточным для вращения механизма. Начнется пропуск шагов, сопровождаемый сильным шумом, который распространяется по всему корпусу механизма. Звук напоминал ведро с болтами, которое трясут изо всех сил. Так как необходимо было провернуть механизм на 90° за 0,7 - 1 сек., я решил, что до 45° буду линейно ускоряться, а с 45° до 90° линейно замедляться. Достигнуть даже приближённо времени в 1сек не удалось. Еще было замечено при старте, что первый шаг периодически сопровождался рывком ротора. Это связанно с тем, что зубцы ротора могут находиться не на оси включенной обмотки статора. В следствие чего зубцы ротора стремительно притянутся к обмотке, произойдёт фиксация ротора, сопровождающаяся звуком, похожим на удар. Все последующие шаги будут плавными.
Решение проблемы №3 . Рассматривая график зависимость оборотов двигателя и момента, я заметил, что момент при малых оборотах высокий, а с увеличением оборотов нелинейно падает, и чем меньше напряжение питания, тем хуже зависимость.
Для примера покажу график Рис.9. Взятый из даташита.
На двигатель FL86STH156-6204 ток фазы 6,0 А. Максимальный постоянный ток потребления от источника питания 3,8 А для блока SMD-9.0 Блоки управления SMD-9.0 (напряжение 72В) и SMD-82 (напряжение 220В) Дробление шага ½, источник питания 72 В, 300 Вт.
Чем больше напряжение подается на обмотки ШД, тем быстрее идет нарастание тока в них. Соответственно зависимость момента от скорости улучшается.
В моем случае питание 12В и диапазон допустимых скоростей невысок, так как момент стремительно падает с увеличением скорости.
Так как при равномерном ускорении не удавалось разогнать механизм. Я решил разделить ускорение на три диапазона. Первый при скорости ниже 5 об/мин ускорение максимально, так как момент максимально высокий. Второй диапазон от 5 до 7 об/мин ускорение уже в три раза меньше и последний третий диапазон от 7 об/мин и выше, ускорение в десять раз меньше относительно первого диапазона. Таким образом двигатель набирал максимально быстро скорость в начале пути и укладывался в 1с. Нелинейно разгоняя двигатель, можно значительно сократить время разгона ШД. Замедление механизма проходило в обратном порядке. Так как сохраненной осциллограммы сигнала, подаваемого на драйверы полумостов, у меня не осталось, я нарисовал, как, примерно, должна выглядеть осциллограмма.
При старте, первый шаг периодически сопровождался рывком ротора. Удар можно убрать, путем снижения амплитуды первой половины шага (в моем случае 20% от максимума) и значительно увеличив время первой половины шага по сравнению с другими шагами. Как видно на рис.10, первые половины шагов более вытянуты, чем правые. Это связанно с ускорением. Форма синусоиды искажается, но при этом двигатель работает достаточно плавно и тихо. Как видно на рис.10, ускорение максимально, это заметно по сужению шагов в начале движения. Когда момент максимален, а по мере приближения к максимальной скорости ускорение значительно меньше от изначального. Все диапазоны ускорений подбирались экспериментальным путем. Как регулировать амплитуду и ускорение я описал ранее в этой статье.
Проблема №4. Учет воздействия руки на механизм, если не учитывать воздействие руки, то можно было обойтись парой индуктивных датчиков или оптических датчиков для отслеживания крайних положений и направления вращения. А если учитывать воздействие руки, то без датчика угла поворота (абсолютного энкодера) не обойтись. Если механизм находится в движении, а рука хватает его и удерживает на месте, начинается пропуск шагов и сильный шум. По датчику будет видно, что вал колеблется на месте, и двигатель необходимо отключить и попытаться стартовать через заданный промежуток времени. Эта задача легко решаема. Если рука потянула механизм против направления, по датчику можно легко понять, что механизм вращается в противоположную сторону, и тоже отключить двигатель. И совсем другое дело, воздействие на механизм с увеличением скорости перемещения больше заданной изначально или наоборот притормаживание. Логично было измерять скорость перемещения и подстраиваться, чтобы скорость двигателя совпадала с движением руки, но оказалось, что 10 разрядный датчик as5040 не позволял этого сделать. Предположим, что нужно отслеживать перемещение каждые 1,05° .Так как 10 разрядов это 1024 бита, то вычисляем точность 360°/1024 = 0,35°, количество градусов на один бит возьмём 0,35°3 = 1,05°. Зная время, за которое двигатель проходит 1,05°, можно вычислить скорость. Но не все так просто. У датчика есть погрешность - биение младшего бита, то есть погрешность в один бит, а при измерении скорости нужно сделать два замера пройденного пути. В начале и в конце соответственно погрешность удваивается и составляет 0,35°2=0,7°. Измерить скорость каждые 1,05° невозможно. Логично измерять, например, каждые 0,35°*15=5,25°. Уже можно оценить скорость, но 5,25° это слишком большой угол, двигатель успеет пройти почти 3 шага или более точно 5,25°/1,8°= 2,92.
Решение проблемы №4. Целесообразно для измерения скорости использовать 12 разрядный датчик это 4096 бит. Точность измерения увеличится в четыре раза, что позволит точно подбирать скорость движения механизма под скорость движения руки.
Так была решена последняя проблема.
Думаю, эта статья принесет практическую пользу и поможет читателю лучше понять принципы управления шаговым двигателем.