8-900-374-94-44
[email protected]
Slide Image
Меню

Stm32 частотник – инвертор на 1 кВт в кармане / Habr

Содержание

инвертор на 1 кВт в кармане / Habr

После написания статьи о принципах работы DC/AC преобразователей, достаточно много людей в комментариях просили пример реализации данной идеи в железе. Я обещал по возможности порадовать их чем-то интересным и эта возможность мне выпала. Поэтому данная статья в первую очередь посвящается людям, которые жаждали «железа».

Несколько недель назад один из моих знакомых, зная, что я люблю силовую электронику, скинул мне сообщение в котором была рекламная ссылка от STMicroelectronics. В данной ссылки расказывалось о новом решение от ST в области силовой электронике — PWD13F60. У меня само понятие «силовая электроника» в первую очередь ассоциируется с TI, Infineon, Linear, но никак не с ST. Мой взгляд на ST, как на «силового» производителя, пал в первый раз, когда вышел великолепный контроллер — STSPIN32F0. Второй раз я посмотрел именно сейчас.

PWD13F60 — это микросхема, в корпусе на подобии QFN, в которой уже содержится полный мост, то есть 4 высоковольтных Mosfet, а также драйвера к ним. Первая идея, когда у меня появилась при ознакомление с даташитом: «О, да это же киловатт в кармане!», отсюда и название статьи. Я не очень люблю различные отладочные платы и предпочитаю сразу делать какой-то «боевой» проект. На базе героя данной статьи было решено сделать DC/AC инвертор.

Статью я решил разбить на две части: схемотехника и код. Сегодня я раскажу о схемотехническом решение, поделюсь библиотеками, дизайном и первыми впечатлениями. Во второй части мы реализуем принципы управления, которые были описаны в моей первой статье.



Технические характеристики PWD13F60


Первое на что обращаешь внимание при ознакомление с данным модулем — он высоковольтный. Действительно компактных, интегрированных решений для работы с напряжением однофазной сети (220В AC/310В DC) не так много. Ко мне в руки попадало решение от TI на базе GaN транзисторов — LMG3410, оно мне очень понравилось, но к сожалению в продажу официальную оно пока не попало и уже около года весит на стадии «preview». Да решение от TI по все параметрам лучше, но толку от него если модули не купить? Увы и ах… Поэтому меня так заинтересовал модуль от ST! Да он на обычном кремнии, да он на несколько меньший ток, и да на 1+ МГц на нем вряд ли что-то построить можно, но это не так страшно и скорее мои придирки. Современные mosfet на кремнии вплотную подбираются к GaN, а частоты 1+ МГц пока что явная экзотика: дорогая и мало кому нужная.

Давайте откроем даташит на PWD13F60 и ознакомимся с его основными характеристиками:

  • Напряжение сток-исток: 600В
  • Сопротивление открытого канала:
    0.32 Ом
  • Максимальный ток канала (при 25 oC): 8A
  • Максимальный ток канала (при 100 oC): 6.9A
  • Максимальный импульсный ток: 32А
  • Управление логическим уровнем: 3.3 и 5В
  • Заряд затвора: 26 нКл
  • Время восстановление внутреннего диода: 93 нс

Глядя на данные ТТХ можно сделать тезисно несколько выводов. Во-первых, напряжение 600В позволяет реализовать большинство топологий: полный мост, полумост, LLC полумост, фазосдвигающий мост и прочие. Во-вторых, максимальный ток канала в 8А позволяет построить преобразователь с номинальной мощностью 1000 Вт. В-третьих, сопротивление канала 320 мОм это хороший показатель, хотя можно и лучше. В-четвертых, емкость затвора и скорость технологического диода, позволяют забраться в диапазон 200-300 кГц даже без применения резонансных топологий. В-пятых, управлять модулем можно напрямую с выводов МК, что очень удобно и упрощает схему.

Получается у нас весьма хороший модуль, который позволяет решить множество проблем. Стоит понимать, что 1000 Вт достижимы для DC/AC преобразователя, если вы захотите мостовой DC/DC с универсальным диапазоном 85-265В, то такую мощность вы не получите. При входе 85В вы просто упретесь в максимальный ток и охлаждение кристалла. Построить же импульсный блок питания на 300 Вт с универсальным входом и крайне малыми габаритами вы уже сможете однозначно.

Схемотехника


Перед тем как перейти к рассмотрению схемотехники мое тестовой платы, я хотел бы избавить людей, которые будут применять данный модуль в будущем, от огромной боли, а именно от создания 3D модели и футпринта. Я прикладываю библиотечные компоненты, которые создал в процессе проектирования платы — они проверены в реальной железке и ошибок не содержат:
  • Корпус модуля PWD13F60 в Solid Works и STEP — тут
  • Футпринт для Altium Designer — тут


Выглядит корпус вот таким образом:

Теперь для вас никаких препятствий, чтобы начать применять данный модуль. Переходим к схемотехнике. Все основные узлы, которые могут вызвать проблемы у разработчика уже «спрятаны» внутрь корпуса и правильно «приготовлены», вам остается только реализовать управление. Кстати данный модуль позволяет не только создавать преобразователи напряжения, но и управлять двигателями — это еще одна область применения, думаю любителям ЧПУ станков и робототехники это очень пригодится.

Минимальная обвязка, которая потребуется для старта: пара конденсаторов по питанию, пара бутстепных конденсаторов драйвера и ШИМ-контроллер, в моем случае это STM32F410. Вроде все просто, но есть один, на мой взгляд, супер важный минус — внутри модуля нет цепей защиты от КЗ! Их не то, что нет, но и не предусмотрен вывод аварийной остановки драйверов. Кстати у модуля TI своей защиты от КЗ тоже не было. Для меня загадка почему нельзя было впихнуть на кристалл еще 2 компаратора, которые бы измеряли ток на внешнем шунты и останавливали бы драйвер…

Этот недостаток не позволяет нам реализовать максимально быстродействующей аппаратной защиты от КЗ. Нам в любом случае придется подавать сигнал о превышение тока на ШИМ-контроллер и останавливать работу именно генерацией ШИМ-а. Это ощутимо увеличивает время реакции защиты, а при использовании DSP или МК при малейшем «подвисании» или задержке будет мгновенный бабах.

Тут можно пойти двумя путями — надеяться на свой шикарный код или поставить между ШИМ-контроллером и силовым модулем логический буфер, который защита и будет отключать. Второй вариант лучше, но усложняет схемотехнику и все равно вносит дополнительную задержку срабатывания, хотя и ощутимо меньшую, чем работа через DSP/МК. Я как полагается выбрал вариант плохой и наивно надеюсь на свой «идеальный» код. Во-первых, это просто отладочная плата на поиграться, поэтому от нее ничего не зависит и можно позволить себе такую вольность. Во-вторых, код внутри МК у меня будет простейший (ПИ-регулятор + генерация синуса), поэтому все критичные узлы я легко смогу отследить. Сделать тоже самое в большом полновесном проекте уже вряд ли получится, хотя зависит от квалификации разработчика, но у меня точно нет.

Я пошел по стандартному пути построения защиты: шунт + ОУ + повторитель. В качестве повторителя применил 2-й канал моего ОУ. Тут кстати еще один минус — если ваша задача сделать супер-компактное решение, то узлы защиты по току будут отнимать драгоценное место. В итоге у меня получилась вот такая простенькая схема (советую смотреть PDF, картинка кликабельная):

  • В формате PDF — тут
  • Лист для Altium Designer — тут


Так как устройство делалось исключительно для тестов данного модуля, то на схеме сплошной минимализм: микроконтроллер STM32F410 + PWD13F60 + DC/DC для питания цифровой части + LC фильтр из дросселя и пленки на 2.2 мкФ + защита по току + ОС по напряжению. В общем-то все. Данная схема реализует преобразование, например, 310В из выпрямленной сети, обратно в 220В. Если вы начинающий разработчик или не сильно опытный любитель, то я вам настоятельно советую сначала обкатывать все алгоритмы на напряжение 12-40В и только затем тыкаться в розетку. Это позволит вам не разориться на спаленных модулях и возможно выжить.

Защита по току реализована на сдвоенных ОУ D2 и D3 — OPA2337. Они быстрые и позволяют реализовывать полноценную работу цепи ОС на частотах до 400-600 кГц. Первая половина ОУ усиливает сигнал с шунта, а вторая половина работает как повторитель напряжения.

Печатная плата


Как и в случае со схемой — дизайн печатной платы открыт и доступен для ознакомления. Скачать PCB файл для Altium Designer можно тут. На особый шедевр не претендует, т.к. был спроектирован за пару часов, но тепловые расчеты и моделирование в базовой форме в Comsol проведены — перегрева страшного не будет, но небольшой алюминиевый радиатор на модуль все таки надо поставить, если собираетесь снимать ток более 4-5А. Так же сделал базовые расчеты и моделирование паразитных индуктивностей с последующей оптимизацией для их уменьшения. Габариты печатной платы получились —
100х45 мм
, что для преобразователя на 1000 Вт очень неплохо, особенно если учесть, что никаких премудростей и больших частот тут не требуется.



Плата двухслойная, шелкография и компоненты только на верхнем слое. Заказывал печатные платы на PCBway и обошлись они с доставкой почтой в 14$ за 10 штук:

В какую сумму вышли компоненты не скажу, т.к. заказывал на несколько разных проектов, но что-то около 20-25$ из которых

9$ стоил сам модуль PWD13F60. Думаю вы уже посчитали стоимость 4-х mosfet-ов и 2-х драйверов к ним и понял, что данный модуль весьма выгодное решение.

Компоненты все заказывал с Mouser через ПМ Электроникс, возят быстро и без накрутки, доставка курьером до квартиры бесплатная, поэтому рекомендую. Кому интересны конкретные компоненты — в файлике со схемой у каждого компонента прописан парт-номер и имеется ссылка (навести мышку на компоненты и нажать F1, откроется).

Отдельно скажу по монтажу. Я немного переживал по поводу корпуса PWD13F60, т.к. сам футпринт не был обкатан и возможность дефекта пайки смущала. Паять решил не феном, а чтобы наверняка — в печке. Флюс от Ersa и неплохая паста из КНР сделали свое дело — даже при не очень аккуратной установке микросхема сама отцентровалась за счет сил поверхностного натяжения, благо ребята из ST сделали корпус полностью симметричных, хотя и сложной формы. Так как я экспериментировал, то в печи все паять не стал, чтобы в случае убийства платы не пришлось бы все перепаивать — запаял в печи саму PWD13F60, STM32F410 и дроссель для dc/dc 12-3,3В. Остальное допаял уже паяльником и получилось вот так:


Вот такой модуль получился. Для проверки подаем 12В от внешнего источника, например, БП от роутера — разъем там стандартный под штырек 2.1 мм. Далее на силовой вход для начала можно подать с лабораторного БП около 20-30В и написав простейший код для STM, подергать мостом и посмотреть что на выходе. Если на холостом ходе все холодное — хорошо. На выход подключаем нагрузку из резисторов, чтобы потребляемый ток составлял 1А и смотрим на нагрев — модуль должен быть чуть теплый, перегрев не более 5 градусов. Если все так, то пишем код для генерации синуса, проверяем его опять на 20-30В и только потом можно подать выпрямленное напряжение сети. Советую первично подавать напряжение через лампу накаливания 40 Вт в разрыв +VIN, если на холостом ходе все хорошо, то такую же лампу 40 Вт добавляем на выход — работает? Тогда убираем лампу со входа. Радуемся рабочему инвертору.

Кстати, те, кто не хочет писать код, то могу на али купить микросхему EG8010, именно микросхему, а не модуль и получить такой же инвертор без необходимости писать код для STM32. Думаю многих любителей альтернативной энергетики это несомненно обрадует, т.к. не все могут и не всем хочется писать код по микроконтроллеры.

Итог


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

Предложенный дизайн платы уже проверен, каких-то проблем не обнаружено, с паразитными параметрами тоже все хорошо, поэтому кому интересно позаниматься изучением данного модуля и силовой электроники в целом, то рекомендую как минимум ознакомиться с ним, а может и повторить без изменений. Кстати архив с проектом в Altium Designer прилагаю — тут.

В следующей статье я адаптирую код из первой статьи и мы реализуем полноценный DC/AC инвертор, который можно будет в принципе даже использовать при построение инвертора для работы с солнечными панелями или ветрогенератором.

habr.com

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

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

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

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

Входы модели:
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

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

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

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

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

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

К выводу 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. Далее на ЦАП выводятся сигналы токов во вращающейся системе координат , проверяется, что эти сигналы является постоянным (с точностью до шумов АЦП). Если они синусоидальные, то проверяется с тех ли фаз измеряется ток, и нет ли инверсии измеряемого сигнала. Измеренные значения записываются.
4. Проверяется, что в результате измерения сигналов с энкодера выдается положительная механическая скорость вращения.
5. При выключенном вращении двигателя проверяется, что энкодер правильно измеряет угловое положение ротора.
6. В модели отключается выход PID Controller [speed] и в качестве уставки берется значение, полученное в п.3. Также для i_sd_ref берется значение измеренное в п.3.
7. Проверяется стабилизация токов , при необходимости настраиваются ПИ-регуляторы.
8. Подключается обратно PID Controller [speed], настраиваются его коэффициенты для стабилизации скорости.

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

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

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

Like this:

Like Loading…

akpc806a.wordpress.com

Разработка buck-преобразователя на STM32F334: принцип работы, расчеты, макетирование

В двух своих последних статьях я рассказал о силовом модуле и плате управления на базе микроконтроллера STM32F334R8T6, которые созданы специально для реализации систем управления силовыми преобразователями и электроприводом. Так же был рассмотрен пример DC/AC преобразователя, который являлся демонстрацией, а не завершенной конструкцией. Теперь пришло время сделать что-то простое, но полезное, а главное завершенное.

Большинство вопросов, касающихся проекта и силовой электроники, связаны с конкретными топологиями: кому-то интересно узнать алгоритм управления PFC, кому-то хочется научиться строить LLC полумост, но наиболее популярная топология — это несомненно buck. Ведь buck-преобразователь (он же buck converter) является основной для большинства интересных проектов: это и драйвер для LED светильников, и основа MPPT контроллера для солнечных панелей, и зарядные устройства и вообще много чего еще.

В сети достаточно много информации по buck, в том числе и даташиты, но она разрозненна и мне лично не встречался материал, где подробно описан процесс создания buck-преобразователя с цифровым управлением. Пора это исправить. Математики практически нет, объяснения «на пальцах», поэтому будет интересно всем, кто хоть как-то связан с электроникой.


Введение

Для начала нужно понять, что мы хотим получить в итоге и какие вводные у нас есть. Топология buck является понижающей, то есть позволяет построить понижающий преобразователь напряжения. Как вы увидите далее напряжение на выходе buck-преобразователя практически линейно зависит от напряжения на входе, поэтому необходимо добавить обратную связь. Сегодня я расскажу о простой обратной связи по напряжению (voltage mode), которая является наиболее наглядной и позволит вам понять принцип работы, при этом такой обратной связи вам хватит для реализации большинства задач.

В конце статьи мы получим работающий стабилизированный источник напряжения по топологии «синхронный buck», работающий на достаточно высокой частоте с цифровым управлением, реализованным на STM32F334R8T6 с применение High Resolution PWM (HRPWM). Диапазон входного напряжения — 15…60В, выходное напряжение — 12В, максимальный выходной ток — 2А.

Глава 1. Принцип работы топологии buck

Начну я рассказывать начиная с самых основ и постепенно будем улучшать наш преобразователь, т.к. «синхронный buck» это версия улучшенный вариант с повышенными КПД и сложностью управления. Базовый вариант топологии, который вы наверняка использовали, выглядит следующим образом:

Данная топология используется в маломощных преобразователях напряжения, например, для питания цифровых схем и прочих маломощных приборов. Понижающие dc/dc, которые вы применяете в своих устройствах наверняка реализованы на микросхемах по данной топологии. Пример такой микросхемы LMR16006.

Принцип работы у данной схемы очень простой, на транзистор VT1 подается ШИМ сигнал, сама работа разделяется на 2 этапа, которые чередуются друг за другом:

  • Стадия накопления энергии в LC-контуре. На данном этапе транзистор VT1 открыт и ток протекает через транзистор в нагрузку, попутно накапливая энергию в катушке индуктивности и выходной емкости:

  • Стадия разряда. На данном этапе транзистор VT1 закрывается и тут начинается самое интересное. Дроссель — эта такая штука, которая накапливает энергию если к нему приложить потенциал (открыть VT1) и отдает ее, если потенциал пропал (VT1 закрыли). При этом он стремится не просто отдать энергию, а сохранить значение тока и его направление, поэтому чтобы использовать данное свойство нужно добавить диод VT1, чтобы замкнуть цепь, ведь ток протекает только в замкнутой цепи:

Когда классе в 6-7м я познакомился с данной топологией, то не понял сразу почему диод не проводит ток на 1-й стадии, сейчас это кажется банальным, но думаю стоит упомянуть. Когда VT1 открыт, то на катод диода VD1 прикладывается потенциал +VIN, например, +20В, а на аноде диода соответственно потенциал земли. Чтобы ток через диод протекал должно быть ровно наоборот: потенциал на аноде должен быть больше потенциала на катоде, поэтому в buck-е на стадии накопления энергии диод «закрыт». На стадии разряда диод уже замыкает цепь, на его катод не действует потенциал +VIN и не «запирает» его. Надеюсь понятно объяснил.

Тут у вас должен был возникнуть вопрос: «А какое напряжение будет на выходе, если мы подали на вход 20В?». Как всегда все просто:

Как видно из формулы напряжение на выходе линейно зависит от коэффициента заполнения (duty) ШИМ сигнала, который мы подаем на транзистор VT1. Если кто-то не знает или забыл «коэффициент заполнение (duty)» — это отношение времени, которое транзистор находится в открытом состояние к длительности периода. Данный коэффициент может принимать значение от 0 до 1 или от 0 до 100%. Дальше мы будет оперировать именно этой цифрой при управление преобразователем, но для понимая сути давайте подставим это отношение в формулу:

Частота работы buck-преобразователя величина постоянная и выбирается при проектирование, в процессе работы она не меняется, а значит и период (T) величина постоянная. Получается, что выходное напряжение напрямую зависит двух физических величин:

  • от времени на которое мы открывает верхний транзистор (VT1) — чем дольше он открыт, тем больше энергии успевает накопиться в LC-фильтре и соответственно выше напряжение на выходе;
  • от входного напряжения, например, если мы зафиксировали заполнение на 50% и меняем Vin от 20 до 40В, то на выходе напряжение будет так же меняться от 10 до 20В.

Я думаю у вас начала прорисовываться общая картина и принцип работы, давайте теперь ее закрепим и посмотрим на реальные осциллограммы и проверим данное соотношение на практике. У меня собран макет buck-а, который нагружен светодиодом на 10 Вт. Я задействовал 3 канала осциллографа, которые включены в следующие точки:

Опыт №1 — Входное напряжение (Vin) постоянное 20В, изменяется коэффициент заполнения

  • Vin = 20V, D = 25%, Vout = D * Vin = 0,25 * 20V = 5V

  • Vin = 20V, D = 50%, Vout = D * Vin = 0,5 * 20V = 10V

Как вы можете видеть на осциллограммах — соотношение между выходным напряжение и коэффициентом заполнения верное. Конечно же это был «идеализированный» эксперимент, в реальности напряжение на входе не бывает стабильным и плавает в достаточно широком диапазоне. Давайте теперь посмотрим какова будет зависимость от входного напряжения при фиксированном заполнение.

Опыт №2 — Входное напряжение (Vin) изменяется, коэффициент заполнения постоянный и равен 50%

  • Vin = 15V, D = 50%, Vout = D * Vin = 0.5 * 15V = 7.5V

  • Vin = 20V, D = 50%, Vout = D * Vin = 0.5 * 20V = 10V

  • Vin = 30V, D = 50%, Vout = D * Vin = 0.5 * 30V = 15V

Теперь мы на практике убедились, что выходное напряжение так же линейно зависит от входного при фиксированном коэффициенте заполнения. Поняли уже как будет стабилизировать выход? Принцип стабилизации простой как сама формула — Vout равно 12В и константа, коэффициент заполнения мы можем менять с помощью микроконтроллера, значит если Vin увеличивается, то увеличивается и напряжение выхода и в этот момент мы уменьшаем коэффициент заполнения (duty) пока опять не станет 12В. Соответственно при уменьшение Vin мы начинаем увеличивать коэффициент заполнения пока опять же напряжение Vout не станет 12В.

На что еще хотелось бы обратить внимание в теоретическом разделе… Ах, да! Наверняка вам интересно, как ШИМ с амплитудой 20В после транзистора в итоге превратился в постоянное напряжение с мизерными пульсациями? Действительно, если мы поставим красный щуп осциллографа в исток транзистора VT1, зеленый щуп после LC-фильтра, то увидим такую картину:

Вы можете видеть, как LC-фильтр «смазывает» напряжение переменное в постоянное, а дело все в том, что энергия запасенная в индуктивности и емкости не может мгновенно израсходоваться, следовательно и напряжение не может мгновенно измениться. Получаем, что в момент, когда ШИМ перед дросселем стал 0В напряжение на выходе обеспечивается запасенной в фильтре энергией, которая не рассасывается мгновенно и ее хватает чтобы поддерживать напряжение в момент закрытия VT1. Это все на пальцах разумеется, если интересно углубиться, то как всегда советую для начал книгу Б.Ю. Семенова «Силовая электроника: от простого к сложному», там целая глава по buck (чопперу).

Борьба за КПД

Как я чуть ранее писал — это был базовый вариант топологии. Основной ее минус — высокие потери на запирающем диоде. Какой ток в несложных системах работающих на МК и CPLD? Обычно в пределах 1А, иногда 2А, если имеется какой-то TFT дисплей. В таком случае потери даже при использовании диода Шоттки составят 0,4В * 2А = 0,8 Вт. В принципе терпимо, рассеивать столько на корпусе SMA/SMB можно без проблем, хотя при напряжение 3.3В и 2А потери 0.8В — это все таки 12% КПД!

Теперь представим себе случай, когда ток у нас 20А. Это может быть и MPPT контроллер, и система питания большой FPGA и много чего еще. В таком случае потери составят 0,4В * 20А = 8 Вт! Что это значит? Например, в случае MPPT у вам будет меньше запасаться энергии в АКБ, в случае питания FPGA это будут дополнительные 8 Вт тепла, которые надо куда-то рассеивать и в обоих случаях это несомненно потеря общего КПД. Что можно сделать? А давайте заменим диод VD1 на еще один N-канальный Mosfet и получим вот такую схему:

Теперь транзистор VT2 выполняет роль диода, то есть проводит ток, когда VT1 закрыт. Диод, который был в базовой версии не требовал управления, сейчас же за улучшение характеристик мы вынуждены заплатить дополнительным каналом управления с ШИМ сигналом.

Для начала давайте посчитаем насколько мы уменьшили потери. Сопротивление канала современного mosfet-а составляет несколько мОм. В качестве примера давайте возьмем транзистор из моего силового модуля о котором я рассказывал в прошлых статьях — IPP083N10N5AKSA1 с сопротивление канала 8.3 мОм. Получаем статические потери равные 0,0083 * 20А * 20А = 3,32 Вт. Еще разумеется будут динамические потери, которые с адекватно спроектированным драйвером составят не более 20%, то есть суммарные потери у нас

www.pvsm.ru

STM32 – PMSM Control – Управление PMSM с помощью STM32

Управление 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 двигателем. Для его управления используется блочная коммутация (block commutation). Т.е. При достижении определенного положения ротора происходит коммутация (напряжение подается на определенные обмотки) и магнитное поле статора смещается и остается неподвижным до момента следующей коммутации пока ротор не провернется до определенного положения. Таким образом, магнитное поле статора вращается не плавно, а шагами. Это доступно продемонстрировано на этом фрагменте видео.

Наглядно это можно объяснить с помощью двух магнитов. Магнит статора как бы тянет к себе ротор. При этом магнит статора перемещается скачками и ждет пока ротор приблизиться, потом совершает следующий скачок. При этом в момент скачка дистанция между магнитами увеличивается, а их магнитное взаимодействие снижается, а при приближении магнитное взаимодействие увеличивается. Из-за этого и получаются пульсации момента. Если сделать движение более равномерным, выдерживая между “магнитами” постоянную дистанцию, усилие между магнитами пульсировать не будет, и движение будет происходить с меньшими потерями. Благодаря синусоидальному возбуждению, и достигается плавность вращения магнитного поля статора, что и дает эффект.

Как генерировать синусоиду?

Возникает вопрос, как получить трехфазную синусоиду с управляемой частотой и амплитудой? Чтобы управлять трехфазным двигателем с помощью синусоидальных токов, для каждой фазы требуется генерировать независимые напряжения. Это делается с помощью трех полумостов, по одному на каждый вывод двигателя. Каждый полумост состоит из двух ключей (верхний и нижний), обычно это MOSFET транзисторы.

Для генерации определенного уровня напряжения используется ШИМ (PWM). В зависимости от скважности ШИМ можно управлять средним напряжением Vout. Но форма сигнала Vout будет повторять сигнал ШИМ, т.е. будет прямоугольной как ШИМ сигнал, а не гладкой. Если это напряжение подать на низкочастотный фильтр, то на выходе фильтра будет напряжение пропорциональное коэффициенту заполнения ШИМ верхнего ключа. Управляя скважностью ШИМ можно получить произвольную форму напряжения на выходе, в том числе и требуемое напряжение синусоидальной формы.

По некоторым причинам, в устройствах управления двигателем не используют фильтры низких частот. Во-первых, сам двигатель действует как фильтр. Индуктивность и сопротивление обмоток двигателя создают RL фильтр. К тому же механическая инерция двигателя и нагрузка создают “механический” фильтр низких частот. При достаточно большой частоте PWM, флуктуации скорости ротора будут абсолютно не значительные. Во-вторых, Протекание тока через низкочастотный фильтр, например RC-фильтр, привело бы к существенным потерям мощности на самом фильтре.

Поскольку при генерации PWM используется комплементарная работа двух ключей (верхнего и нижнего) нужно учесть тот факт, что для закрытия ключа требуется некоторое время. Поэтому нужно выключать открытый ключ, и через некоторое время, необходимое для его закрытия, открывать комплементарный ключ. Это время получило термин Dead-time. У микроконтроллера STM32 этот вопрос решает таймер, который занимается генерацией PWM.

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

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

На рисунке 3-3 наглядно изображен этот алгоритм в сравнении с блочной коммутацией (как для BLDC).

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

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

Этого вполне достаточно. При необходимости Вы можете скорректировать таблицу.

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

При расчете PWM для каждой фазы, нужно учитывать и величину подаваемой на двигатель мощности. В примере в качестве регулятора мощности используется сигнал с потенциометра. При реализации замкнутой системы, например, со стабилизаций оборотов, этот показатель будет вычисляться математически с учетом текущей нагрузки, требуемых оборотов и параметров ПИД регулятора.

Датчики положения и их использование

Было бы идеально, если датчик положения ротора мог в любой момент информировать микроконтроллер о текущем положении ротора. В данном случае мы не имеем такой возможности. Три датчика Холла изменяют свое состояние 6 раз за один электрический оборот. Между этими событиями положение ротора достоверно не известно. Для определения текущего положения ротора между срабатываниями датчиков, мы вынуждены производить вычисления с учетом текущей скорости вращения ротора.

Определение скорости вращения

Для того чтобы генерировать напряжение, подаваемое на выводы двигателя нужной частоты, нужно знать скорость вращения двигателя. Для определения скорости вращения используются датчики положения. Вычисляя время между двумя переключениями датчиков положения (будем считать, что скорость вращения ротора за это время не изменяется), можно рассчитать частоту, с которой нам надо генерировать выходной сигнал. Таким образом, зная скорость, мы можем вычислить положение ротора в любой момент времени. Скорость вращения ротора может изменяется, и мы вынуждены периодически подстраивать выходное напряжение в соответствии с реальным положением ротора. Такая подстройка называется фазовая подстройка.

Фазовая подстройка

Удобнее всего фазовую подстройку выполнять, когда контроллер точно знает реальное положение ротора. В случае с тремя датчиками Холла – это момент изменения состояния датчиков. Именно в этот момент можно узнать точный угол ротора. Подстройка выполняется путем коррекции индекса положения в таблице выходных значений (в таблице синусов).

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

В момент старта скорость ротора не известна до тех пор, пока не произойдет последовательно два изменения состояния датчиков холла. Чтобы обеспечить нормальный запуск двигателя, пока скорость вращения ротора не известна, применяется блочная коммутация. Т.е. контроллер управляет двигателем как (BLDC). Этот метод был описан ране. Пример для STM32 найдете здесь. Карта напряжений, используемая в режиме блочной коммутации, показана на рис.3-3(штриховая синяя линия) на фоне с синусоидальным напряжением. Как только скорость вращения ротора будет определена, происходит переход к синусоидальному возбуждению.

Управление углом опережением коммутации

Данный алгоритм позволяет программно установить угол опережения коммутации, чтобы настроить фазу синусоиды и заставить ее опережать ротор. Подбором угла опережения можно добиться максимальной скорости или эффективности двигателя. В примере этот угол не изменяется на протяжении все работы. Но, он программно доступен и при необходимости его можно корректировать на ходу, например, в зависимости от текущей скорости вращения ротора двигателя.

Программная реализация для 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 для прямого и обратного направления вращения ротора.

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

Схема и двигатели, используемые в этом примере точно такие же, как и в предыдущем примере. Это позволит сравнить эффективность двух способов управления бесколлекторными двигателями с постоянными магнитами.

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

Видео

BLDC Motors и PMSM. Выводы

Возбуждение бесколлекторного двигателя с постоянными магнитами синусоидальными токами имеет несомненные преимущества. И позволяет повысить эффективность работы двигателя. Коррекция угла опережения (timing), позволяет находить компромисс между максимальным моментом на валу и скоростью вращения ротора.

Схема керування безколекторним двигуном BLDC, PMSM на STM32

Скачать пример можно по этой ссылке: https://github.com/avislab/STM32F103/tree/master/Example_PMSM

Смотри также ВИДЕО:

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

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

Успехов.

Смотри также:

Статьи по бесколлекторным моторам:

Смотри также:

www.avislab.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *