Применение микроконтроллеров серии MB89/MB90/MB91 для управления шаговыми двигателями
Введение
Шаговые двигатели находят широкое применение в принтерах, станках с ЧПУ, дисководах, автомобильных приборных панелях и других устройствах, где требуется прецизионное передвижение под управлением микрокомпьютера.
Для упрощения процесса разработки и снижения стоимости конечных изделий, использующих шаговые двигатели, Fujitsu предлагает недорогие 8-, 16-, и 32-битные микроконтроллеры с встроенным драйвером шагового двигателя.
Для управления шаговым двигателем требуется специальная система управления и сильноточные драйвера. Такая система может быть построена на дискретной логике или специальных интерфейсных микросхемах, но в результате усложняется схемотехника и/или вырастает цена конечного устройства.
Широкоизвестный пример применения шаговых двигателей – автомобильная панель управления. Шаговые двигатели управляют стрелками индикаторов, таких, как спидометр и тахометр. Один или несколько контроллеров шаговых двигателей в Flash-микроконтроллерах Fujitsu могут быть индивидуально запрограммированы для контроля датчика скорости, тахометра, топливного датчика и датчика температуры двигателя.
Эта Application Note описывает управление шаговым двигателем при помощи Flash-микроконтроллера Fujitsu с встроенным драйвером ШД на примере управления стрелкой.
1 Физические основы
В этом разделе даётся объяснение технических основ управления шаговыми двигателями.
1.1 Использование шагового двигателя для управления стрелочным прибором.
Ряд микроконтроллеров Fujitsu имеют встроенный контроллер шагового двигателя. Он с лёгкостью может быть использован для очень плавного вращения ШД, как в данном примере стрелочного индикатора. Чтобы этого добиться, необходимо чётко представлять его физические характеристики и свойства. Поэтому рассмотрим кратко физические основы функционирования ШД.
В данном описании мы применим простую эквивалентную схему замены шагового двигателя. В этой модели ротор представлен двухполюсным магнитом, а статор – двумя обмотками, расположенными перпендикулярно друг другу (Рис.1).
Для того, чтобы обеспечить действительно плавное перемещение, мы должны обеспечить постоянный вращающий момент в течение всего процесса движения. Это достигается таким геометрическим расположением катушек, которое позволяет получить постоянный суммарный момент (см. рис.2 ). Проще говоря, для каждой катушки используется sin и cos проекция, таким образом, на ротор, находящийся в любом положении всегда действует одинаковый момент.
Для создания движения, мы должны последовательно пройти все положения от Старта до Останова. В ШД это осуществляется пошаговым методом (Рис. 3).
Таким образом, при движении сохраняется постоянная скорость. Это, однако, не относится к точке останова, где двигатель прекращает движение моментально.
Чтобы избавиться от этого, используем ФНЧ, который позволяет решить проблему в точке останова (Зона B). Аналогичная проблема присутствует и в точке старта, для её устранения используем ФНЧ второго порядка.
Такой ФНЧ решает проблему в точке старта (Зона A), но накладывает ограничения на максимальную скорость и максимальное ускорение в зависимости от точки траектории.
С другой стороны, максимальная скорость и максимальное ускорение двигателя ограничены конструктивными особенностями. Чтобы быть уверенными, что требуемые параметры не превышают физических возможностей двигателя, мы применили ограничитель ускорения и скорости. Этот ограничитель должен быть встроен в ФНЧ второго порядка, при этом уровни ограничения должны быть симметричными.
ФНЧ второго порядка легко реализуется двухступенчатым применением ФНЧ первого порядка, который, в свою очередь может быть представлен при помощи простой математической формулы вида:
Для повышения скорости вычисления удобно преобразовать её следующим образом:
Таким образом, требуется только две операции сдвига и два вычитания, что позволяет экономить вычислительные ресурсы микроконтроллера.
Эта операция должна повторяться через заданные промежутки времени. Разница между текущим положением в данный момент и предыдущим положением в предшествующий момент времени представляет собой скорость. Таким образом, мгновенная скорость в конкретный момент времени вычисляется простым вычитанием.
Если значение скорости сохраняется в ячейке памяти, мы можем вычесть текущее значение скорости из предыдущего значения. Результатом данной операции будет ускорение.
Физически это выглядит следующим образом:
Алгоритмически можно записать:
Для ограничения мгновенных значений скорости и ускорения мы должны убедиться, что они достигли предельных значений:
В данном примере мы сравниваем значения скорости и ускорения с предустановленными константами и если эти величины превышают пределы, они заменяются на значения из следующей формулы:
Используя вычисление по данной формуле несколько сот раз в секунду (время повторения несколько мс) мы получим полноценное движение стрелки в нашем примере. На практике значение демпфирующего коэффициента n выбирают из диапазона 3-6, основываясь на характеристиках ФНЧ второго порядка.
В данном примере мы использовали табличный метод для управления выходами ШД контроллера.
Ниже приведен пример выходной функции для модуля контроллера ШД, использующий 128 микрошагов на квадрант для каждой из таблиц синуса и косинуса, т.е. предустановленное значение для данной функции ограничено 256-ю микрошагами на квадрант. При этом мы можем легко изменять разрешение в пределах 0…7 бит на квадрант, используя только операции сдвига для приведения к требуемой разрядности и выборки из таблицы синусов/косинусов.
2 Контроллер шагового двигателя
В этом разделе описаны особенности контроллера ШД
2.1 Микроконтроллеры с встроенным контроллером ШД
Fujitsu Microelectronics предлагает ряд микроконтроллеров с встроенным контроллером ШД:
Модель |
Тип |
Число каналов КШД |
Серия МК 16LX |
MB90F394 |
16-битный |
6 каналов |
MB90F427 |
16-битный |
4 канала |
MB90F428 |
16-битный |
4 канала |
MB90F591 |
16-битный |
4 канала |
MB90F594 |
16-битный |
4 канала |
MB90F598 |
16-битный |
4 канала |
Серия МК 8L |
MB89943 |
8-битный |
1 канал |
MB89945 |
8-битный |
1 канал |
Серия МК FR |
MB91F362 |
32-битный |
4 канала |
MB91F365 |
32-битный |
4 канала |
MB91F366 |
32-битный |
4 канала |
MB91F368 |
32-битный |
4 канала |
MB91F376 |
32-битный |
4 канала |
2.2 Блок контроллера шагового двигателя
Вышеупомянутые серии МК будут использованы в качестве примера для объяснения работы встроенного контроллера ШД. Данный контроллер состоит из 4 драйверов, связанной с ними переключающей логики и двух ШИМ-генераторов.
Драйвера двигателя имеют повышенный до 30мА ток нагрузки и могут быть подключены непосредственно к четырём выводам обмоток двигателя. Таким образом, маломощные ШД могут управляться напрямую, для более мощных моторов схема легко модернизируется подключением внешнего мостового драйвера.
Комбинация из ШИМ-генераторов и переключающей логики разработана для контроля вращения двигателя. Блок контроллера ШД разделён на 2 канала и имеет возможность подключения четырёх выводов от двух обмоток мотора, как изображено на рисунке:
2.3 Регистры управления контроллером ШД
"n"-ый контроллер ШД имеет следующие 5 типов регистров:
- Регистр «Управление ШИМ-n» (PWMCn)
- Регистр «Сравнение ШИМ1-n» (PWC1n)
- Регистр «Сравнение ШИМ2-n» (PWC2n)
- Регистр «Выбор ШИМ1-n» (PWS1n)
- Регистр «Выбор ШИМ2-n» (PWS2n)
2.3.1 Регистр управления ШИМ
Регистр управления ШИМ служит для запуска и остановки контроллера ШД, управления прерываниями и управления выходными выводами. Эти функции одинаковы для всех одноименных модулей контроллера ШД.
Название бита |
Назначение |
Бит 7 |
OE2 Выбор функции выхода 2 |
Когда установлен в «1» соответствующие выводы являются выходами ШИМ PWM2Pn и PWM2Mn. При установке в «0» выводы являются портами ввода-вывода общего назначения |
Бит 6 |
OE1 Выбор функции выхода 2 |
Когда установлен в «1» соответствующие выводы являются выходами ШИМ PWM1Pn и PWM1Mn. При установке в «0» выводы являются портами ввода-вывода общего назначения |
Биты 5,4 |
P1,0 Биты выбора тактовой частоты ШИМ |
Данные биты определяют источник тактирования для генератора ШИМ следующим образом:
P0 |
P1 |
Источник тактирования |
0 |
0 |
Machine clock |
1 |
0 |
1/2 Machine clock |
0 |
1 |
1/4 Machine clock |
1 |
1 |
1/8 Machine clock |
|
Бит 3 |
CE Бит разрешения счёта |
Этот бит разрешает работу ШИМ-генератора. Установка в «1» разрешает счёт. Следует обратить внимание, что ШИМ-генератор PWM2 начинает работу одним машинным циклом позже, чем PWM1. Это сделано с целью уменьшения коммутационных помех с выхода драйверов. |
Биты 2,1 |
Не используются |
|
Бит 0 |
Резерв |
Этот бит зарезервирован. В него всегда следует записывать «0» |
Рис. 9 Назначение битов регистра управления ШИМ
2.3.2 Регистр сравнения ШИМ
Регистры сравнения ШИМ1 и ШИМ2 (PWC1n + PWC2n) определяют скважность импульсов ШИМ. Значение "00h" соответствует нулевой длительности импульса ,"FFh" соответствует коэффициенту заполнения 99.6%. Два 8-битных регистра сравнения доступны для чтения и записи в любое время, но изменённое значение вступит в силу только после завершения текущего такта ШИМ, после того, как бит BS регистра выбора PWM2 будет установлен в "1".
2.3.3 Регистр выбора ШИМ
Регистры выбора ШИМ1 и ШИМ2 (PWS1n + PWS2n) могут устанавливать выход контроллера ШД в состояние логического нуля, логической единицы, выхода импульсов ШИМ либо в высокоимпедансное состояние.
Название бита |
Назначение |
Бит 7,6 |
Не используются |
|
Биты 5..3 |
P2..P0 Биты режима выхода P |
Состояние выходов PWM1Pn определяется в соответствии с таблицей:
P2 |
P1 |
P0 |
PWM1Pn |
0 |
0 |
0 |
Лог. «0» |
0 |
0 |
1 |
Лог. «1» |
0 |
1 |
x |
Выход ШИМ |
1 |
x |
x |
Высокоимпедансное состояние |
|
Биты 2..0 |
M2..M0 Биты режима выхода M |
Состояние выходов PWM1Mn определяется в соответствии с таблицей:
M2 |
M1 |
M0 |
PWM1Mn |
0 |
0 |
0 |
Лог. «0» |
0 |
0 |
1 |
Лог. «1» |
0 |
1 |
x |
Выход ШИМ |
1 |
x |
x |
Высокоимпедансное состояние |
|
Рис. 13 Назначение битов регистра выбора ШИМ
Название бита |
Назначение |
Бит 15 |
Не используется |
|
Бит 14 |
BS бит обновления |
Этот бит предназначен для синхронизации настроек выходов ШИМ. Изменения в двух регистрах сравнения и двух регистрах выбора не вступят в силу до тех пор, пока бит BS установлен в «1».
Когда бит установлен в «1», в генераторы ШИМ и переключатели выхода записываются значения из соответствующих регистров в конце каждого такта ШИМ.
Бит сбрасывается в «0» автоматически в начале каждого такта ШИМ. Если BS будет установлен в «1» программно одновременно с сигналом автоматического сброса, бит останется в состоянии «1», сброс будет проигнорирован. |
Биты 13..11 |
P2..P0 Биты режима выхода P |
Состояние выходов PWM2Pn определяется в соответствии с таблицей:
P2 |
P1 |
P0 |
PWM2Pn |
0 |
0 |
0 |
Лог. «0» |
0 |
0 |
1 |
Лог. «1» |
0 |
1 |
x |
Выход ШИМ |
1 |
x |
x |
Высокоимпедансное состояние |
|
Биты 10..8 |
M2..M0 Биты режима выхода M |
Состояние выходов PWM2Mn определяется в соответствии с таблицей:
M2 |
M1 |
M0 |
PWM2Mn |
0 |
0 |
0 |
Лог. «0» |
0 |
0 |
1 |
Лог. «1» |
0 |
1 |
x |
Выход ШИМ |
1 |
x |
x |
Высокоимпедансное состояние |
|
Рис. 15 Назначение битов регистра выбора ШИМ2
3 Примеры программ
В этом разделе приводятся и поясняются программные коды для управления стрелочным индикатором
3.1Таблица для организации микрошагов
************************************************************************************/
/* Этот программный пример предлагается «as is» и может быть изменён. Fujitsu */
/* Microelectronics не несёт никакой ответственности за возможные ошибки и */
/* вероятную несовместимость ни в каких случаях */
/* © Fujitsu Microelectronics Europe GmbH */
/* Таблица sin\cos для микрошагового режима */
unsigned char const SMC_TAB_CS[129]={
0, 3, 6, 9, 13, 16, 19, 22,
25, 28, 31, 34, 37, 41, 44, 47,
50, 53, 56, 59, 62, 65, 68, 71,
74, 77, 80, 83, 86, 89, 92, 95,
98,100,103,106,109,112,115,117,
120,123,126,128,131,134,136,139,
142,144,147,149,152,154,157,159,
162,164,167,169,171,174,176,178,
180,183,185,187,189,191,193,195,
197,199,201,203,205,207,208,210,
212,214,215,217,219,220,222,223,
225,226,228,229,231,232,233,234,
236,237,238,239,240,241,242,243,
244,245,246,247,247,248,249,249,
250,251,251,252,252,253,253,253,
254,254,254,255,255,255,255,255,
255 };
/*-------------------------------------------------------------------*/
/* Таблица для управления квадрантами */
unsigned char const smc_quad_a[4]={0x02, 0x10, 0x10, 0x02};
unsigned char const smc_quad_b[4]={0x50, 0x50, 0x42, 0x42};
/*-------------------------------------------------------------------*/
void smc_out(int ustp) {
int q,d,smc_a,smc_b; /* вспомогательные переменные*/
q=((ustp>>8) & 3); /* нормализуем диапазон разбиения до 1024 точек на полупериод */
d=((ustp>>1) & 127); /* сделаем нормализацию внутреннего разбиения до 512 точек на
полупериод, таким образом, бит 0 в ustp не влияет! */
smc_a=SMC_TAB_CS[d]; /* загрузим компонент sin */
smc_b=SMC_TAB_CS[128-d]; /* загрузим компонент cos
обратите внимание, что таблица увеличена и
используется с «обратной стороны» */
if ((q & 1)==1) { /* определим направление движения */
PWC10=smc_a; /* установим значение sin для катушки A */
PWC20=smc_b; /* установим значение cos для катушки B */
}
else { /* при вращении в обратную сторону сменим знак */
PWC10=smc_b; /* установим значение cos для катушки A */
PWC20=smc_a; /* установим значение sin для катушки B */
}
PWC0=0xE8; /* инициализация системы */
PWS10=smc_quad_a[q]; /* квадрантное управление катушкой A */
PWS20=smc_quad_b[q]; /* квадрантное управление катушкой B */
}
3.2 Фильтр низкой частоты
Эта подпрограмма организована таким образом, чтобы обеспечить оптимальный баланс между требованиями минимизации используемой памяти и хорошей читаемостью.
Ниже приведен пример программы ФНЧ второго порядка для управления шаговым двигателем.
/* Этот программный пример предлагается «as is» и может быть изменён. Fujitsu */
/* Microelectronics не несёт никакой ответственности за возможные ошибки и */
/* вероятную несовместимость ни в каких случаях */
/* © Fujitsu Microelectronics Europe GmbH */
void smc__lpf(void) { /* эти вычисления занимают небольшую часть от миллисекунды */
smc_old=smc_new; /* сохраним значение smc_old */
/* ФНЧ первого порядка */
*((int *)&smc_clc1+1)=smc_inp; /* нормализация входного значения */
smc_clc1=(smc_clc1>>smc_dn);
smc_clc2=(smc_pt1-(smc_pt1>>smc_dn));
smc_pt1=smc_clc2+smc_clc1;
/* ФНЧ второго порядка */
smc_clc2=(smc_pt2-(smc_pt2>>smc_dn));
smc_pt2=smc_clc2+(smc_pt1>>smc_dn);
smc_new=*((int *)&smc_pt2+1); /* новое выходное значение */
}
Данный ФНЧ 2-го порядка работает следующим образом:
Таким образом, нам нужно использовать простые ограничители скорости и ускорения в дополнение к ФНЧ второго порядка.
3.3 Пример подпрограммы обработки прерываний
Этот код должен исполняться в подпрограмме обработчика прерываний, вызываемой каждые несколько миллисекунд.
/* Этот программный пример предлагается «as is» и может быть изменён. Fujitsu */
/* Microelectronics не несёт никакой ответственности за возможные ошибки и */
/* вероятную несовместимость ни в каких случаях */
/* © Fujitsu Microelectronics Europe GmbH */
__interrupt void irq_stepper_srv (void) { /* «фоновая» задача контроля шагового двигателя*/
smc_out(smc_new); /* для уменьшения джиттера сначала выведем значение*/
smc__ido(); /* потом вычислим значение для следующего такта */
smc_avclip();
TMCSR1_UF = 0; /* сброс флага */
}
3.4 Ограничение до требуемых физических значений
/* Этот программный пример предлагается «as is» и может быть изменён. Fujitsu */
/* Microelectronics не несёт никакой ответственности за возможные ошибки и */
/* вероятную несовместимость ни в каких случаях */
/* © Fujitsu Microelectronics Europe GmbH */
void smc_avclip(void) { /* ограничение до требуемых физических значений */
smc_clc1=(smc_new-smc_old); /* действующее значение скорости */
if ( smc_clc1 < -smc_vmax ) { /* проверка режима движения вперёд */
/* исправление, т.к. скорость превышена */
smc_new=smc_old-smc_vmax; /* установим новую скорость */
smc_clc1=-smc_vmax; /* запомним новую скорость */
*((int *)&smc_pt2+1)=smc_new; /*установим новое выходное значение */
}
if ( smc_clc1 > smc_vmax ) { /* проверка режима обратного движения */
/* исправление, т.к. скорость превышена */
smc_new=smc_old+smc_vmax; /* установим новую скорость */
smc_clc1=smc_vmax; /* запомним новую скорость */
*((int *)&smc_pt2+1)=smc_new; /*установим новое выходное значение */
}
smc_acc=(smc_clc1-smc_velo); /* действующее значение ускорения */
if ( smc_acc < -smc_amax ) { /* проверка режима разгона */
/* исправление, т.к. ускорение превышено */
smc_clc1=smc_velo-smc_amax; /* установим новую скорость */
smc_new=smc_old+smc_clc1; /* пересчитаем выходное значение */
*((int *)&smc_pt2+1)=smc_new; /* установим новое выходное значение */
}
if ( smc_acc > smc_amax ) { /* проверка режима торможения */
/* исправление, т.к. ускорение превышено */
smc_clc1=smc_velo+smc_amax; /* установим новую скорость */
smc_new=smc_old+smc_clc1; /* пересчитаем выходное значение */
*((int *)&smc_pt2+1)=smc_new; /* установим новое выходное значение */
smc_acc =smc_clc1-smc_velo; /* запомним новые значения скорости */
smc_velo=smc_clc1; /* и ускорения для вычислений в след. цикле*/
}
полимерные полы
|