STM32 - PMSM Control
Керування 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
Дивись також:
Бесколлекторные моторы "на пальцах"
Что такое бесколлекторные моторы и как управлять бесколлекторными моторами:
Бажаю успіхів.
Дивись також:
Статті по безколекторним двигунам:
- Бесколлекторный мотор постоянного тока. Что это такое?
- Устройство бесколлекторного мотора
- Управление бесколлекторным мотором с датчиками Холла (Sensored brushless motors)
- Управление бесколлекторными моторами без бездатчиков (Sensorless BLDC)
- Запуск бесколлекторного мотора без бездатчиков (Sensorless BLDC)
- Определение положения ротора бесколлекторного мотора в остановленном состоянии
- Регулятор бесколлекторного мотора. Структура (ESC)
- Схема регулятора бесколлекторного мотора (Схема ESC)
- Силова частина регулятора BLDC двигунів
- Література по безколекторним двигунам.
- Безколекторні двигуни. Приклади програм для мікроконтролера
- Схема регулятора BLDC на STM32
- STM32. Приклад. Керування безколекторним двигуном (BLDC)
- STM32. Приклад. Керування PMSM. Приклади програм
- Видео о бесколлекторных моторах. BLDC, PMSM, векторное управление (російською)
Дивись також:
- 1. STM32. Програмування STM32F103. Тестова плата. Прошивка через UART та через ST-Link
- 2. STM32. Програмування. IDE для STM32
- 3. STM32. Програмування STM32F103. GPIO
- 4. STM32. Програмування STM32F103. Тактування
- 5. STM32. Програмування STM32F103. USART
- 6. STM32. Програмування STM32F103. NVIC
- 7. STM32. Програмування STM32F103. ADC
- 8. STM32. Програмування STM32F103. DMA
- 9. STM32. Програмування STM32F103. TIMER
- 10. STM32. Програмування STM32F103. TIMER. Захоплення сигналу
- 11. STM32. Програмування STM32F103. TIMER. Encoder
- 12. STM32. Програмування STM32F103. TIMER. PWM
- 13. STM32. Програмування STM32F103. EXTI
- 14. STM32. Програмування STM32F103. RTC
- 15. STM32. Програмування STM32F103. BKP
- 16. STM32. Програмування STM32F103. Flash
- 17. STM32. Програмування STM32F103. Watchdog
- 18. STM32. Програмування STM32F103. Remap
- 19. STM32. Програмування STM32F103. I2C Master
- 20. STM32. Програмування STM32F103. I2C Slave
- 21. STM32. Програмування STM32F103. USB
- 22. STM32. Програмування STM32F103. PWR
- 23. STM32. Програмування STM32F103. Option bytes
- 24. STM32. Програмування STM32F103. Bootloader
- STM32. Скачати приклади
- System Workbench for STM32 Інсталяція на Ubuntu
- Keil uVision5 – IDE для STM32
- IAR Workbench – IDE для STM32
- Керування безколекторним двигуном постійного струму (BLDC) за допомогою STM32
- Керування PMSM за допомогою STM32
Спасибо за статью. Подскажите, как правильно подключать датчики Холла (например SS41) к выводам STM32?
А будет ли продолжение Вашей разработки, но в варианте Sensorless?
На этой схеме http://www.avislab.com/blog/wp-content/uploads/2014/04/Brushless_ESC.png можно увидеть схему подключения SS41. См. вход H1, H2, H3
Sensorless - скорее всего нет.
Я видел эту схему. Смутило, что она для Atmega168. Там же другое напряжение питания и логический уровень. Нужно ли менять номиналы резисторов?
Входа STM32 нормально работают и с 5В. Но правильнее подтягивающие резисторы (4.7К) подключить к 3.3 В, а не к 5В. Тогда логические уровни будут в полном порядке. Питание датчиков Холла обязательно оставить 5В.
Спасибо
Жалко, а нужно. Может подскажете, как мне самостоятельно с этим разобраться?
Если Вас интересует 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 года.
Кстати, есть кое что интересное http://model.exponenta.ru/k2/Jigrein/md_120.htm :)
На схеме регулятора, имеются диоды D4, D5, D6. Для чего они нужны? Разве недостаточно диодов в структуре мосфета?
В данном случае диод выполняет другие функции, и связаны они с обеспечением живучести драйвера IR2101. При включении по типовой схеме, предложенной в документации, IR2101 часто горели. На приведенной схеме регулятора (она не самая последняя) в схеме включения IR2101 не хватает еще одного резистора. См. Схему: http://www.avislab.com/blog/wp-content/uploads/2013/02/IR2101.png D2, R3 – после добавления этих двух элементов микросхемы IR2101 перестали выходить со строя.
Спасибо. А вы не планируете примеры на библиотеке 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
HAL - планирую, но позже. Спасибо за интересную ссылку.
У 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
Хочу обратить Ваше внимание, что по приведенной ссылке рассматривается six-step firmware library. То есть это для управления BLDC моторами, а не PMSM.
Запустился и меня двигатель, только контроллер на IRFP4668. Еще раз спасибо. Возможно ли изменить программу, что бы регулировать PMSM_Timing в процессе работы двигателя, тем самым реализовав ослабление поля? Что для этого нужно сделать?
Еще вопрос. Для чего нужны "сиськи" в таблице синусов. Почему не чистая синусоида?
«У такого подхода есть два преимущества: 1) максимальная амплитуда сгенерированного напряжения выше, чем при генерации чистой синусоиды на каждой фазе. Как следствие получим более высокий вращающий момент и скорость. 2) Каждый вывод двигателя треть времени подключен к земле, что сокращает потери мощности на коммутацию.»
Переменная PMSM_Timing доступна и программно ее можно корректировать в процессе работы. Вес переменной 1.875 градуса. т.е. если PMSM_Timing=15, получим опережение 15*1.875 = 28.125 градуса.
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?
Недавні записи
- LCD Display ST7567S (IIC)
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
- DC-DC для IGBT драйверів ізольований 2 W +15 -8 вольт
Tags
battery soldering java-script ngnix adc rs-232 flask esp8266 watchdog web exti solar mongodb rtc sms pwm usart books ethernet smd git websocket meteo css python dc-dc displays led ssd1306 eeprom gpio barometer max1674 mpx4115a brushless motor mpu-6050 timer sensors remap servo bldc atmega pmsm 3d-printer flash encoder examples dma raspberry-pi tim ssd1331 piezo mpu-9250 rfid eb-500 foc bme280 gps nvic dht11 bluetooth hih-4000 stm32 st-link docker uart avr html wifi bmp280 bkp nodemcu options usb lcd programmator i2c capture
Архіви