FOC Position Control. Векторне управління - Стабілізація положення


23.11.2021

Безколекторні двигуни можливо використовувати не тільки як тяглові, а ще як сервоприводи для систем позиціювання. У цьому випадку їх не слід порівнювати з кроковими електродвигунами. Використовуючи Безколекторні двигуни можна побудувати більш досконалу систему утримування положення. Навіть як що вплив зовнішніх сил буде намагатися зрушити систему з заданого положення, двигун буде намагатися утримувати задане положення. А якщо зовнішні сили відхилять систему від заданого положення, двигун поверне її у задане положення. Для того, щоб система могла оцінювати положення, двигун має бути обладнаний датчиком положення (зазвичай енкодером). Використовуючи зворотній зв'язок з датчика положення, контролер зможе керувати двигуном для забезпечення утримання положення. Звісно, така система буде більш складною і більш дорогою за просту систему з кроковими електродвигунами без зворотного звʼязку.

Для реалізації системи стабілізації положення за допомогою MCSDK потрібно:

  • Безколекторний двигун (можна без датчиків Холла)
  • Енкодер, який монтується на вал двигуна, або такий на який можна передати оберти валу двигуна механічним шляхом
  • Контролер безколекторних двигунів на базі мікроконтролера STM32, який здатний працювати з векторним керуванням (FOC) та підтримується MCSDK

У прикладі я буду використовувати двигун Longs Brushless Motor Model: 57BL02 24VDC 3000RPM (www.longs-motor.com):

FOC Position Control. Brushless Motor Model: 57BL02

Енкодер квадратурний E38S6G5-600B-G24N:

FOC Position Control. Encoder E38S6G5-600B-G24N

У якості контролера я використаю свою тестову плату розроблену саме для вивчення MCSDK.

Схема, файли плати, відео про плату і знайдете за цим посиланням: https://blog.avislab.com/foc-brd/

Підключення

Схема підключення плати мотора та енкодера:

FOC Position Control. Схема підключення

Програмна реалізація виконана за допомогою MCSDK

FOC Position Control. Project

Для того щоб створити проект MCSDK потрібно вказати:

1. Тип керування (положення)

FOC Position Control. Control Mode

2. Вказати параметри мотора не помившись у визначенні кількості пар полюсів (не сплутати з кількістю полюсів). Це важливо.

FOC Position Control. Pole Pairs

3. В параметрах мотора в датчиках вказати параметри енкодера, точно вказавши кількість імпульсів на один оберт. Це важливо.

FOC Position Control. Encoder Aligment

Енкодери можуть бути з двома і з трьома виходами. У мене енкодер з двома виходами (Channel A, Channel B), тому у налаштуваннях галку "Encoder Alignment" не ставимо.

4. В Speed Sensing у якості датчика положення вказати енкодер.

FOC Position Control. Sensor Selection

А в налаштуваннях осьового датчика нічого не має бути

FOC Position Control. Auxiliary sensor

Завантажити проєктом для MCSDK можна за цим посиланням: Encoder.stmcx

Оскільки виходи енкодера потребують підтягуючих резисторів, як і датчики Холла, я вирішив їх підключити до виводів плати, призначених для датчиків Холла. У цьому проекті я не буду використовувати датчики Холла. У своїх експериментах мені не вдалося поєднати роботу відразу і датчиків Холла і енкодара. Хоча візуальна частина MCSDK дозволяє це налаштувати, мені не вдалося отримати робочий код для мого мікроконтролера.

Програмне керування положенням

Після генерації коду за допомогою MCSDK потрібно додати деякі операції для запуску роботи двигуна.

Треба ввімкнути двигун, і обов'язково дочекатися стабілізації положення.

  ...
  MC_ProgramPositionCommandMotor1(0.0, 0.0);

  MC_StartMotor1();
  while(MC_GetAlignmentStatusMotor1()!=TC_ALIGNMENT_COMPLETED){
	  HAL_Delay(10);
  }
  ...

Оскільки у мого енкодера немає сигналу CH_Z, положення мотора після стабілізації буде прийняте за 0. Якби був енкодер з трьома вхідними сигналами (CH1, CH2, CH_Z) мотор зайняв би початкове положення згідно сигналу енкодера. (Я так гадаю :))

Після чого командами MC_ProgramPositionCommandMotor1 можемо задавати положення в радіанах і період за який це положення має бути зайняте у секундах.

  ...
  HAL_Delay(2000);
  MC_ProgramPositionCommandMotor1(3.0, 0.9);
  HAL_Delay(2000);
  MC_ProgramPositionCommandMotor1(-3.0, 0.9);
  ...

Використання енкодера для ручного керування положення мотора

Якщо у програмі задати положення 0 і не міняти його, тоді, знявши з мотора енкодер і обертаючи вал енкодера, Двигун буде повторювати рухи енкодера. Таким чином можна зробити систему, яка повторює рухи, екзоскелет, наприклад :) Насправді, у такій системі з'являється певний недолік, про який Ви мабуть відразу здогадалися - відсутність зворотного зв'язку за положенням.

Тюнінг PID - регуляторів

Після того, як все зарухалось можна зайнятися підбором коефіцієнтів PID - регуляторів. Можна змінювати їх в проєкті: Encoder06.png або в коді програми. Наприклад, таким чином:

  PID_SetKP(&PIDSpeedHandle_M1, (int16_t)1000);
  PID_SetKI(&PIDSpeedHandle_M1, (int16_t)100);

  PID_SetKP(&PIDIqHandle_M1, (int16_t)500);
  PID_SetKI(&PIDIqHandle_M1, (int16_t)10);

  PID_SetKP(&PIDIdHandle_M1, (int16_t)500);
  PID_SetKI(&PIDIdHandle_M1, (int16_t)10);

Завантажити

Проєкт MCSDK для вказаних вище мотора(Longs Brushless Motor Model: 57BL02 24VDC 3000RPM), енкодера (E38S6G5-600B-G24N) і моєї плати можна завантажити тут: Завантажити проєктом для MCSDK можна за цим посиланням: Encoder.stmcx

Література :)

Детальніше про те, як працює MCSDK з системою позиціювання читайте у документації:

an5464-position-control-of-a-threephase-permanent-magnet-motor-using-xcubemcsdk-or-xcubemcsdkful-stmicroelectronics.pdf

Brushless Motors
Коментарі:
Виталий говорить:
11.01.2022 18:38
Здравствуйте, заказал изг. плат по вашему проекту. У меня есть вопрос по FOC. Вы не могли бы сделать один опыт. Включить мотор на движение по часовой стрелке, при этом руками крутить его против часовой. Т.е мотор выступает как сопротивление ручному вращению. Будут ли при исп. FOC ощущаться подергивания (перескоки полярностей полюсов).
Если есть возможность, то для этого опыта исп. управление svm или svpwm. По идее при FOC не должны ощущаться рывки, т.к полярность меняется плавно и вместе с углом положения ротора, в этом хорошо помогает энкодер. Очень интересно, как это на практике выходит.
Заранее спасибо!

andre говорить:
12.01.2022 08:15
Для того, чтобы мотор выступал как сопротивление ручному вращению, ним нужно управлять в режиме стабилизации момента. Если управлять в режиме стабилизации скорости или стабилизации положения, то регулятор приложит все усилия, чтобы сломать Вам руки. В режиме стабилизации момента заметных подергиваний не наблюдается. Касательно энкодера, то я его использовал только в режиме стабилизации положения. Совместно исползовать датчики Холла и энкодер у меня не получилось. Обратите внимание, что последние версии MCSDK (X-CUBE-MCSDK-Y) больше не поддрживают микроконтроллеры сери STM32F103.

Олексій говорить:
20.08.2022 23:07
Добрий день. Хотів запитати чи підійде ця схема (Position control) управління мотором для створення гіростабілізатора камери?

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

Архіви