|
Поиск по сайту: |
|
По базе: |
![]() |
| Главная страница > Применение > Микроконтроллеров > MB90 | |||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Применение микроконтроллеров серии 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 предлагает ряд микроконтроллеров с встроенным контроллером ШД:
2.2 Блок контроллера шагового двигателя Вышеупомянутые серии МК будут использованы в качестве примера для объяснения работы встроенного контроллера ШД. Данный контроллер состоит из 4 драйверов, связанной с ними переключающей логики и двух ШИМ-генераторов. Драйвера двигателя имеют повышенный до 30мА ток нагрузки и могут быть подключены непосредственно к четырём выводам обмоток двигателя. Таким образом, маломощные ШД могут управляться напрямую, для более мощных моторов схема легко модернизируется подключением внешнего мостового драйвера.
Комбинация из ШИМ-генераторов и переключающей логики разработана для контроля вращения двигателя. Блок контроллера ШД разделён на 2 канала и имеет возможность подключения четырёх выводов от двух обмоток мотора, как изображено на рисунке:
2.3 Регистры управления контроллером ШД "n"-ый контроллер ШД имеет следующие 5 типов регистров:
2.3.1 Регистр управления ШИМ Регистр управления ШИМ служит для запуска и остановки контроллера ШД, управления прерываниями и управления выходными выводами. Эти функции одинаковы для всех одноименных модулей контроллера ШД.
Рис. 9 Назначение битов регистра управления ШИМ 2.3.2 Регистр сравнения ШИМ Регистры сравнения ШИМ1 и ШИМ2 (PWC1n + PWC2n) определяют скважность импульсов ШИМ. Значение "00h" соответствует нулевой длительности импульса ,"FFh" соответствует коэффициенту заполнения 99.6%. Два 8-битных регистра сравнения доступны для чтения и записи в любое время, но изменённое значение вступит в силу только после завершения текущего такта ШИМ, после того, как бит BS регистра выбора PWM2 будет установлен в "1".
2.3.3 Регистр выбора ШИМ
Рис. 13 Назначение битов регистра выбора ШИМ
Рис. 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; /* и ускорения для вычислений в след. цикле*/
}
Главная - Микросхемы - DOC - ЖКИ - Источники питания - Электромеханика - Интерфейсы - Программы - Применения - Статьи |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||