Реализация векторного частотного преобразователя для управления асинхронным электродвигателем с применением MATLAB и STM32F4

Целью настоящего проекта является создание частотного преобразователя для проведения исследований в области управления асинхронным электроприводом. Т.е. интересно было не только реализовать векторное управление, но и добиться чтобы запрограммированные алгоритмы легко модифицировались и настраивались.

Именно в связи с желанием максимально упростить кодирование, было принято решение использовать MATLAB Embedded Coder для генерации кода на языке Си по модели Simulink.

Векторное управление реализовано по классической схеме в модели EmbeddedFOC.mdl

VFD_Struct

Входы модели:
theta — угловое положение ротора (электрический угол)
enable — если enable=1, то активизируется векторное управление, если enable=0 — то скалярное
I_a, I_b — токи фаз A и B с датчиков (в А)
scalar_freq — задание частоты для скалярного режима (в Гц)
omega_ref — задание частоты для векторного режима (в рад/сек)
i_sd_ref — задание тока намагничивания для векторного режима (в А)
scalar_ampl — амплитуда выходного напряжения для скалярного режима (нормированное значение, от 0 до 1)

Выходы модели:
u_abc — выходы напряжения фаз A,B,C (нормированное значение от -1 до 1)
i_s_dq — ток статора во вращающейся синхронной системе координат (в А)
slip — скорость скольжения
debug — выход для отладочных сигналов

Центральной частью является подсистема в блоке FOC

VFD_FOC

она реализует векторный алгоритм управления токами статора с ориентацией системы координат по полю (field-oriented control). Фактически подсистема состоит из трех ПИ-регуляторов: стабилизатора тока намагничивания i_{sd}, стабилизатора квадратурного тока i_{sq} и стабилизатора механической скорости вращения \omega, вырабатывающего уставку для тока i_{sq}. Получаемые значения напряжений u_{sd},u_{sq} пересчитываются в трехфазные питающие напряжения относительно неподвижной системы координат с помощью инверсных преобразований Парка и Кларка.

Для верификации алгоритма в EmbeddedFOC.mdl созданы две модели:
– pure_SimPowSys_model_scalar.mdl — управление двигателем в скалярном режиме,
– pure_SimPowSys_model_vector.mdl — управление в векторном режиме.

Некоторые технические подробности реализации:
– выбрана одношаговая схема интегрирования (ode1),
– время дискретизации модели — 1 мс,
– арифметика с плавающей точкой единичной точности (float)
– реальная время выполнения одного цикла алгоритма — порядка 150 мкс

В качестве аппаратной платформы выбрана плата STM32F4DISCOVERY, процессор STM32F4 которой позволяет реализовывать сложные численные алгоритмы и содержит всю необходимую периферию. Фрагменты кода для генерации ШИМ и считывания инкрементального энкодера взяты из библиотеки STM32 FOC firwmare libraries v2.0.

Подключение к микроконтроллеру показано на рисунке:

1

К выводу PC1 подключен переменный резистор для изменения уставки скорости. Кнопка User на плате включает векторный режим управления (первоначально после включения работает скалярный режим).

Для силового модуля был использован частотный преобразователь китайского производства. Он состоит из платы управления и платы ключей, соединяемых проводом-шлейфом. Плата STM32F4DISCOVERY была подключена вместо штатной платы управления. Назначение контактов в разъеме следующее (может это кому-то сэкономит время):

1 — +VCCA
2 — -VCCA
3 — U_dc (напряжение, пропорциональное на шине постоянного тока: 0,827 В для 280 В, 0,655 для 223 В)
4 — для датчика температуры (не подключено)
5,6 — I_dc (сигнал с датчика тока на шине постоянного тока)
7,8 — GND,
9 — PWM_H, фаза W,
10 — PWM_L, фаза W,
11 — PWM_H, фаза V,
12 — PWM_L, фаза V,
13 — PWM_H, фаза U,
14 — PWM_L, фаза U,
15 — ключ тормозного резистора, катод оптопары (через резистор)
16 — логический сигнал защиты по току на шине постоянного тока,
17,18 — GND,
19,20 — +5 V,
21 — управление вентилятором (не подключено),
22 — не подключено,
23 — GND_24V
24 — +24V
25 — GND_24V
26 — +24V

В качестве датчиков тока использовались Allegro ACS712 на ток 5A.

Что нужно сделать для того, чтобы настроить плату под конкретное железо:
1. Задать параметры POLE_PAIR_NUM (число пар полюсов двигателя) и ENCODER_PPR (число метод энкодера на оборот) в файле stm32f10x_encoder.c

2. Задать параметр I_MAX — ток, которому соответствует максимальное значение на входе АЦП датчиков тока (файл main.c)

3. Можно отредактировать определение переменной TimerPeriod для настройки частоты ШИМ-а (сейчас используется 5 кГц) — файл main.c

4. В подсистеме Observer [omega_slip] (модель EmbeddedFOC.mdl) во встраиваемой MATLAB-функции вписать постоянную времени ротора двигателя (tau_r), для этого понадобятся значения полной индуктивности ротора (индуктивность намагничивания + собственная индуктивность) и сопротивления ротора

5. В подсистеме FOC (модель EmbeddedFOC.mdl) подобрать параметры ПИ-регуляторов: PID Controller [flux], PID Controller [torque], PID Controller [speed].

6. Сгенерировать код для EmbeddedFOC.mdl (нажать Ctrl+B) в открытой Simulink модели

7. Переместить файлы EmbeddedFOC.c, EmbeddedFOC.h, EmbeddedFOC_data.c, EmbeddedFOC_private.h. EmbeddedFOC_types.h из каталога EmbeddedFOC_ert_rtw (он создается там где лежит EmbeddedFOC.mdl) в папку Matlab в проекте для Keil uVision

Важно еще заметить, что по сгенерированный код модифицирован следующим образом: в файле rtwtypes.h строка
typedef double real_T;
заменена на
typedef float real_T;
что дает использование арифметики с плавающей точкой одинарной точности, поскольку STM32F4 имеет встроенную поддержку только одинарной точности

Наладка производится в следующей последовательности:
1. Запускается вращение двигателя в скалярном режиме (enable = 0).
2. С помощью вывода фазовых токов на два канала ЦАП проверяется, что датчики тока работают правильно и АЦП измеряет.
3. Далее на ЦАП выводятся сигналы токов во вращающейся системе координат i_{sd},i_{sq}, проверяется, что эти сигналы является постоянным (с точностью до шумов АЦП). Если они синусоидальные, то проверяется с тех ли фаз измеряется ток, и нет ли инверсии измеряемого сигнала. Измеренные значения i_{sd},i_{sq} записываются.
4. Проверяется, что в результате измерения сигналов с энкодера выдается положительная механическая скорость вращения.
5. При выключенном вращении двигателя проверяется, что энкодер правильно измеряет угловое положение ротора.
6. В модели отключается выход PID Controller [speed] и в качестве уставки i_{sq} берется значение, полученное в п.3. Также для i_sd_ref берется значение i_{sd} измеренное в п.3.
7. Проверяется стабилизация токов i_{sd},i_{sq}, при необходимости настраиваются ПИ-регуляторы.
8. Подключается обратно PID Controller [speed], настраиваются его коэффициенты для стабилизации скорости.

Все вместе было проверено на мотор-редукторе SEW-Eurodrive DT71C4

SAM_0674

Скачать:
модели для Simulink,
проект для Keil uVision

статья с более связным описанием просходящего