В HTML      В PDF
микроэлектроника, микросхема, транзистор, диод, микроконтроллер, память, msp430, Atmel, Maxim, LCD, hd44780, t6963, sed1335, avr, mega128
Предприятия Компоненты Документация Применения Статьи Новости

 
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации





Главная страница > Применение > Микроконтроллеров > MB90
Пересюхтюмя


13-я Международная выставка электронных компонентов и комплектующих для электронной промышленности





Выставка Передовые Технологии Автоматизации


Применение микроконтроллеров серии 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;              /* и ускорения для вычислений в след. цикле*/
    }
    

    полимерные полы