Скачиваний:
31
Добавлен:
04.03.2014
Размер:
254.98 Кб
Скачать

Применение микроконтроллеров серии MB89/90/91 для управления шаговыми двигателями

Введение

Шаговые двигатели находят широкое применение в принтерах, станках с ЧПУ, дисководах, автомобильных приборных панелях и других устройствах, где требуется прецизионное передвижение под управлением микрокомпьютера.

Для упрощения процесса разработки и снижения стоимости конечных изделий, использующих шаговые двигатели, 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; /* и ускорения для вычислений в след. цикле*/

}

Соседние файлы в папке inform