STM32 - PMSM Control


15.03.2017

Керування PMSM за допомогою STM32

Викладений нижче матеріал ґрунтується на документації AVR447 від фірми Atmel. Приклад керування PMSM двигуном з трьома датчиками Холла для мікроконтролера STM32 базується на інформації, викладеної в цій документації. Існує деяка плутанина в термінології пов`язаної з безколекторними двигунами. Саме поняття "безколекторний двигун" включає в себе кілька груп двигунів, в тому числі і безколекторні двигуни з постійними магнітами. Далі маються на увазі безколекторні двигуни з постійними магнітами. У більшості літературних джерел двигуни з постійними магнітами розділені на дві категорії за формою зворотного ЕРС (електрорушійна сила). Зворотна ЕРС може мати вигляд трапеції або синусоїди. Хоча термінологія в літературі іноді суперечлива, в більшості випадків вважається, що безколекторні двигуни постійного струму (BLDC) мають зворотну ЕРС у формі трапеції, а синхронні двигуни з постійними магнітами (PMSM) мають синусоїдальну зворотну ЕРС. І BLDC і PMSM можуть збуджуватися синусоїдальними струмами.

Конструктивні відмінності PMSM і BLDC Motors

PMSM і BLDC можуть мати деякі конструктивні відмінності. При роботі BLDC виникають пульсації моменту на валу, тому BLDC двигуни проектують таким чином, щоб знизити пульсації моменту. Проте, PMSM і BLDC можуть збуджуватися як трапецієподібним так і синусоїдальним струмами. Можна сказати, що збуджуючи BLDC двигун синусоїдальною напругою, ми перетворюємо його в PMSM. Якщо Ви вважаєте що для перетворення BLDC в PMSM потрібно обов`язково внести в нього конструктивні зміни, то заміна регулятора - може бути тією самою необхідною конструктивною зміною.

Очікуваний ефект

Якщо BLDC двигун збуджувати синусоїдальними струмами, очікується збільшення моменту на валу, зниження вібрації, зниження шуму, збільшення максимальних обертів. Чому так відбувається? Згадаймо, як працює система керування BLDC двигуном. Для керування BLDC двигуном використовується блочна комутація (block commutation). Тобто, при досягненні певного положення ротора відбувається комутація (напруга подається на певні обмотки) і магнітне поле статора зміщується і залишається нерухомим до моменту наступної комутації поки ротор не провернеться до певного положення. Таким чином, магнітне поле статора обертається не плавно, а кроками. Це доступно продемонстровано на цьому фрагменті відео.

Наочно це можна пояснити за допомогою двох магнітів. Магніт статора як би тягне до себе ротор. При цьому магніт статора переміщається стрибками і чекає поки ротор наблизитися, потім робить наступний стрибок. При цьому у момент стрибка дистанція між магнітами збільшується, а їхня магнітна взаємодія знижується, а при наближенні магнітне взаємодія збільшується. Через це і виникають пульсації моменту. Якщо зробити рух рівномірним, витримуючи між "магнітами" постійну дистанцію, зусилля між магнітами пульсувати не буде, і рух буде відбуватися з меншими втратами. Завдяки синусоїдальному збудженню, і досягається плавність обертання магнітного поля статора, що і дає ефект.

Як генерувати синусоїду?

Виникає питання, як отримати трифазну синусоїду з керованою частотою і амплітудою? Щоб керувати трифазним двигуном за допомогою синусоїдальних струмів, для кожної фази потрібно генерувати незалежні напруги. Це робиться за допомогою трьох напівмостів, по одному на кожну фазу двигуна. Кожен напівміст складається з двох ключів (верхній і нижній), зазвичай це MOSFET транзистори.

Для генерації певного рівня напруги використовується ШІМ (PWM). Залежно від шпаруватості ШІМ можна керувати середньою напругою Vout. Але форма сигналу Vout буде повторювати сигнал ШІМ, тобто буде прямокутною як ШІМ сигнал, а не гладкою. Якщо цю напругу подати на низькочастотний фільтр, то на виході фільтра буде напруга пропорційна коефіцієнту заповнення ШІМ верхнього ключа. Керуючи шпаруватістю ШІМ можна отримати довільну форму напруги на виході, в тому числі і необхідну напругу синусоїдальної форми.

З різних причин, в пристроях керування двигуном не використовують фільтри низьких частот. По-перше, сам двигун діє як фільтр. Індуктивність і опір обмоток двигуна створюють RL фільтр. До того ж механічна інерція двигуна і навантаження створюють "механічний" фільтр низьких частот. При досить великій частоті PWM, флуктуації швидкості ротора будуть абсолютно незначні. По-друге, Протікання струму через низькочастотний фільтр, наприклад RC-фільтр, призвело б до суттєвих втрат потужності на самому фільтрі.

Оскільки при генерації PWM використовується комплементарна робота двох ключів (верхнього і нижнього) потрібно врахувати той факт, що для закриття ключа потрібен певний час. Тому потрібно вимикати відкритий ключ, і через деякий час, необхідний для його закриття, відкривати комплементарний ключ. Це час отримав термін Dead-time. У мікроконтролера STM32 це питання вирішує таймер, який займається генерацією PWM.

Тепер перейдемо безпосередньо до генерації синусоїди. Знаючи положення ротора в даний момент часу, можна математичним шляхом обчислювати амплітуду (шпаруватість PWM) для кожної з трьох фаз. Однак математичні обчислення займають багато часу і тому чинять інакше. Можна створити таблицю, в яку помістити заздалегідь обчислену синусоїду для всіх трьох фаз.

Генерувати синусоїди для кожної фази - це прямий метод, але є більш ефективний спосіб. Ми будемо генерувати три синусоїдальних напруги фаза-фаза (диференціальне напруга між двома фазами) із зсувом фази на 120 градусів між ними. Таблиці 3-1, 3-2 показують, як цього можна досягти, не роблячи повні синусоїди для кожного виводу двигуна.

На малюнку наочно зображений цей алгоритм в порівнянні з блочною комутацією (як для BLDC).

У такого підходу є дві переваги:

1) максимальна амплітуда генерованої напруги вище, ніж при генерації чистої синусоїди на кожній фазі. Як наслідок отримаємо більш високий момент і кутова швидкість.
2) Кожен вивід двигуна третину часу підключений до "землі", що скорочує втрати потужності на комутацію.

При створенні таблиці значень потрібно знайти компроміс між обсягом таблиці і швидкістю роботи з нею. Оскільки форма хвилі однакова для всіх трьох фаз, і відрізняється тільки зсувом на 120 градусів, можна зберігати в таблиці тільки одну хвилю і використовувати її для розрахунку всіх трьох вихідних напруг. Однак для скорочення часу на обчислення, прийнято рішення зберегти в таблиці значення для всіх трьох фаз. Так досягається більша швидкість обробки даних. В прикладі таблиця «синусів» має 192 значень для кожної фази. Тобто, генерований сигнал буде розбитий на секції і матиме ступінчасту форму.

Цього цілком достатньо. При необхідності Ви можете скорегувати таблицю.

Таким чином, за один електричний оберт нам доведеться 192 рази обчислювати і змінювати значення PWM для кожної з трьох фаз.

При розрахунку PWM для кожної фази, потрібно враховувати і потужність, що має подаватися на двигун. У прикладі в якості регулятора потужності використовується сигнал з потенціометра. При реалізації замкнутої системи, наприклад, зі стабілізацією обертів, цей показник буде обчислюватися математично з урахуванням поточного навантаження, необхідних обертів і параметрів ПІД регулятора.

Датчики положення і їх використання

Було б ідеально, якщо датчик положення ротора міг будь-якої миті інформувати мікроконтролер про поточний стан ротора. В даному випадку ми не маємо такої можливості. Три датчика Холла змінюють свій стан 6 разів за один електричний оборот. Між цими подіями положення ротора достовірно не відомо. Для визначення поточного положення ротора між двома спрацьовуваннями датчиків, ми змушені робити обчислення з урахуванням поточної швидкості обертання ротора.

Визначення швидкості

Для того щоб генерувати напругу, що подається на виводи двигуна потрібної частоти, потрібно знати швидкість обертання двигуна. Для визначення швидкості обертання використовуються датчики положення. Знаючи час між двома перемиканнями датчиків положення (будемо вважати, що швидкість обертання ротора за цей час не змінюється), можна розрахувати частоту, з якою нам треба генерувати вихідний сигнал. Таким чином, знаючи швидкість, ми можемо обчислити положення ротора в будь-який момент часу. Швидкість обертання ротора змінюється, і ми змушені періодично підлаштовувати вихідну напругу відповідно до реального положення ротора. Таке підлаштовування називається фазова корекція.

Фазова корекція

Найзручніше фазову корекцію виконувати, коли контролер точно знає реальне положення ротора. У випадку з трьома датчиками Холла - це момент зміни стану датчиків. Саме в цей момент можна дізнатися точний кут ротора. Підстроювання виконується шляхом корекції індексу положення в таблиці вихідних значень (в таблиці синусів).

Блочна комутація

У момент старту двигуна швидкість ротора невідома, поки не відбудеться послідовно дві зміни стану датчиків Холла. Щоб забезпечити нормальний запуск двигуна, поки швидкість обертання ротора не відома, застосовується блочна комутація. Тобто, контролер керує двигуном як (BLDC). Цей метод був описаний раніше. Приклад для STM32 знайдете тут. Карта напруг, яка використовується в режимі блочної комутації, показана на малюнку (штрихова синя лінія) на тлі з синусоїдальною напругою. Як тільки швидкість обертання ротора буде визначена, відбувається перехід до синусоїдального збудження.

Корекція кута випередження комутації

Даний алгоритм дозволяє програмно встановити кут випередження комутації, щоб налаштувати фазу синусоїди і змусити її випереджати ротор. Підбором кута випередження можна домогтися максимальної швидкості або ефективності двигуна. У прикладі цей кут протягом роботи не змінюється. Але, він програмно доступний і при необхідності його можна коригувати на ходу, наприклад, в залежності від поточної швидкості обертання ротора двигуна.

Програмна реалізація для STM32F103

Скачати приклад можна за цим посиланням: https://github.com/avislab/STM32F103/tree/master/Example_PMSM

Генерація PWM (TIM1)

Як і у попередньому прикладі таймер TIM1 задіяний для генерації PWM сигналів для 6 ключів. Також  TIM1 забезпечує Dead-Time і відключає виходи таймера, що генерують PWM сигнали, при перевантаженні по струму. Сигнал перевантаження по струму подається на вхід таймера TIM1_BKIN.

Генерування вихідного напруги (синусоїд) (TIM4)

Генерування вихідних напруг заданої форми для трьох фаз двигуна виконується шляхом зміни шпаруватості PWM. У таблиці PMSM_SINTABLE зберігатися 192 значень. Тобто за один електричний оборот потрібно 192 рази змінювати шпаруватість PWM для кожної з трьох фаз. Таймер TIM4 відміряє необхідний час і викликає обробник переривання TIM4_IRQHandler, де і виконуються необхідні обчислення і установка нових значень PWM для всіх трьох фаз, і виконується інкримінація індексу положення в таблиці синусів PMSM_SinTableIndex.

Визначення швидкості обертання (TIM3)

Для того щоб повідомити таймеру TIM4 необхідний час, потрібно знати з якою швидкістю обертається ротор двигуна. Таймер TIM3 використовується для визначення швидкості обертання. Таймери TIM3 і TIM4 тактуються однаково. Це спрощує роботу з ними. Таймер TIM4 має "крокувати" по таблиці синусів (PMSM_SINTABLE) з такою швидкістю, щоб пройти всі 192 пункти таблиці за один повний електричний оберт.

Оскільки у нас є датчики положення, ми можемо в певному положенні запустити таймер лічильник TIM3 і зчитати з нього лічильник при завершенні повного обороту. Потім значення цього лічильника розділити на 192 і отримати число, яке потрібно задати таймеру TIM4. Оскільки TIM3 і TIM4 налаштовані на однакову частоту, переривання TIM4 буде спрацьовувати 192 рази за електричний оборот. Що і потрібно.

Оскільки датчики положення змінюють свій стан 6 разів за електричний оберт, ми можемо вимірювати час, необхідний для проходження не повного обороту, а 1/6 обороту. І ділити значення лічильника на 32 (192/6 = 32). Таким чином, вимірювання швидкості буде виконуватися 6 разів за один електричний оберт.

Датчики Холла (EXTI9_5_IRQ)

Сигнали датчиків Холла генерують переривання. Процедура опрацювання переривань визначає поточний актуальний стан ротора, зчитує дані з таймера TIM3, коригує швидкість роботи TIM4, і виконує фазову корекцію шляхом зміщення індексу положення в таблиці синусів PMSM_SinTableIndex. Оскільки частота обертання ротора змінюється, робота таймера TIM4 може викликати зсув вихідної напруги по фазі. Внаслідок чого вихідна синусоїда буде відставати або випереджати актуальний стан ротора. Для усунення цього ефекту застосовується фазова корекція. Оскільки в момент зміни стану датчиків Холла ми точно знаємо актуальний стан ротора, можна скорегувати поточний стан в таблиці синусів шляхом корекції PMSM_SinTableIndex. Відповідність даних датчиків Холла і положення в таблиці синусів визначено в таблицях PMSM_STATE_TABLE_INDEX_FORWARD і PMSM_STATE_TABLE_INDEX_BACKWARD для прямого і зворотного напрямку обертання ротора.

Структурна схема

Схема і двигуни, які використовуються в цьому прикладі точно такі ж, як і у прикладі для BLDC. Це дозволить порівняти ефективність двох методів керування безколекторними двигунами з постійними магнітами.

Примітка: Питання проектування силової частини регулятора в цій статті не розглядаються. Стаття висвітлює лише питання програмної реалізації керування PMSM. Приклад принципової схема силової частини буде розглянуто окремо.

Відео

BLDC Motors і PMSM. Висновки

Живлення бесколлекторного двигуна з постійними магнітами синусоїдальними струмами без сумніву має переваги, і дозволяє підвищити ефективність роботи двигуна. Корекція кута випередження (timing), дозволяє програмно знаходити компроміс між максимальним моментом на валу і швидкістю обертання ротора.

Схема управления бесколлекторными моторами BLDC, PMSM на микроконтроллере STM32

Скачати приклад можна за цим посиланням: https://github.com/avislab/STM32F103/tree/master/Example_PMSM

Дивись також:

Бесколлекторные моторы "на пальцах"

Что такое бесколлекторные моторы и как управлять бесколлекторными моторами:

Бажаю успіхів.

Дивись також:

Статті по безколекторним двигунам:

Дивись також:

Brushless Motors STM32
Коментарі:
Александр говорить:
29.03.2017 11:00
Спасибо за статью.
Подскажите, как правильно подключать датчики Холла (например SS41) к выводам STM32?

Александр говорить:
01.04.2017 14:33
А будет ли продолжение Вашей разработки, но в варианте Sensorless?

andre говорить:
01.04.2017 19:15
На этой схеме http://www.avislab.com/blog/wp-content/uploads/2014/04/Brushless_ESC.png
можно увидеть схему подключения SS41. См. вход H1, H2, H3

andre говорить:
01.04.2017 19:49
Sensorless - скорее всего нет.

Александр говорить:
03.04.2017 09:35
Я видел эту схему. Смутило, что она для Atmega168.
Там же другое напряжение питания и логический уровень.
Нужно ли менять номиналы резисторов?

andre говорить:
03.04.2017 10:22
Входа STM32 нормально работают и с 5В. Но правильнее подтягивающие резисторы (4.7К) подключить к 3.3 В, а не к 5В. Тогда логические уровни будут в полном порядке. Питание датчиков Холла обязательно оставить 5В.

Александр говорить:
03.04.2017 10:25
Спасибо

Александр говорить:
04.04.2017 20:17
Жалко, а нужно. Может подскажете, как мне самостоятельно с этим разобраться?

andre говорить:
05.04.2017 08:49
Если Вас интересует PMSM Sensorless, тогда это, скорее всего, Sensorless Field Oriented Control. Тогда ищите и читайте об векторном управлении. Для STM32 есть STM32 FOC SDK, STM32 PMSM FOC LIB. С этими вещами я пока только разбираюсь, поэтому реальную помощь оказать пока не смогу.

Если Вас интересует BLDC Sensorless, там все проще. Могу порекомендовать статью http://www.avislab.com/blog/brushless04/ Примеры на С для AVR http://www.avislab.com/blog/bldc-examples_ru/ можно попробовать сделать по аналогии для STM32.

Пример для BLDC Sensorless на микроконтроллере STM32 может и сделаю, но реально это будет не раньше осени 2017 года.

Александр говорить:
05.04.2017 11:06
Кстати, есть кое что интересное http://model.exponenta.ru/k2/Jigrein/md_120.htm :)

Александр говорить:
15.04.2017 11:35
На схеме регулятора, имеются диоды D4, D5, D6. 
Для чего они нужны? Разве недостаточно диодов в структуре мосфета?

andre говорить:
18.04.2017 07:58
В данном случае диод выполняет другие функции, и связаны они с обеспечением живучести драйвера IR2101. При включении по типовой схеме, предложенной в документации, IR2101 часто горели. На приведенной схеме регулятора (она не самая последняя) в схеме включения IR2101 не хватает еще одного резистора. См. Схему: http://www.avislab.com/blog/wp-content/uploads/2013/02/IR2101.png
D2, R3 – после добавления этих двух элементов микросхемы IR2101 перестали выходить со строя.

Александр говорить:
21.04.2017 18:46
Спасибо.
А вы не планируете примеры на библиотеке HAL? Было бы интересно.
На st.com есть проекты под Nuckeo F103, F302, F401 Six-step software library
http://www.st.com/content/ccc/resource/technical/document/user_manual/88/5d/e5/ec/83/18/4d/9f/DM00251088.pdf/files/DM00251088.pdf/jcr:content/translations/en.DM00251088.pdf

andre говорить:
21.04.2017 22:39
HAL - планирую, но позже. Спасибо за интересную ссылку.

Александр говорить:
23.04.2017 10:19
У ST плат немно по другому подключены датчики Холла и BEMF, а также есть резисторы на затвор-исток
Сами пакеты с кодом это X-CUBE-SPN7 и X-CUBE-SPN8
http://www.st.com/content/ccc/resource/technical/document/user_manual/group0/90/b6/9f/0c/50/c1/47/1d/DM00334922/files/DM00334922.pdf/jcr:content/translations/en.DM00334922.pdf

andre говорить:
23.04.2017 11:02
Хочу обратить Ваше внимание, что по приведенной ссылке рассматривается six-step firmware library. То есть это для управления BLDC моторами, а не PMSM.

Александр говорить:
28.04.2017 20:39
Запустился и меня двигатель, только контроллер на IRFP4668. Еще раз спасибо.
Возможно ли изменить программу, что бы регулировать PMSM_Timing в процессе работы двигателя, тем самым реализовав ослабление поля? Что для этого нужно сделать?

Александр говорить:
29.04.2017 07:32
Еще вопрос. Для чего нужны "сиськи" в таблице синусов. Почему не чистая синусоида?

andre говорить:
02.05.2017 09:50
«У такого подхода есть два преимущества:
1) максимальная амплитуда сгенерированного напряжения выше, чем при генерации чистой синусоиды на каждой фазе. Как следствие получим более высокий вращающий момент и скорость.
2) Каждый вывод двигателя треть времени подключен к земле, что сокращает потери мощности на коммутацию.»

andre говорить:
02.05.2017 09:56
Переменная PMSM_Timing доступна и программно ее можно корректировать в процессе работы. Вес переменной 1.875 градуса. т.е. если PMSM_Timing=15, получим опережение 15*1.875 = 28.125 градуса.

mansour bahrmai говорить:
20.12.2017 19:35
hi 
tnx for your good work, i have implemented this system but unfortunately it is not working properly. i mean when i switch from commutation to PMSM mode, the more works noisy and has to much vibration. may you please help me?

Додати коментар
Code
* - обов'язкові поля

Архіви