сайт для палких паяльників

Управление 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

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

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

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

Успехов.

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

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

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

4 комментария: STM32 – PMSM Control – Управление PMSM с помощью STM32

  • Владимир говорить:

    Добрый день. Спасибо за очень полезный цикл статей.
    Вы не могли бы написать статью по работе с ЖК экранами.
    Заказал в китае жк-шку на 3.2″, 320×480 на HX8357B. Никогда еще не имел дела с STM32. Делаю первые шаги…

  • Александр говорить:

    Здравствуйте. Не пробовали управлять PMSM с инкрементальным энкодером?

    • andre говорить:

      Добрый день. Нет, к сожалению, не приходилось.

  • Серж говорить:

    Доброго Вам здоровья. Огромную работу Вы сделали, за что низкий поклон. Я делаю сдвижную дверь в ванную комнату на STM32 ,использую BLDC и хотел использовать Вашу разработку но появились нюансы… Старт не уверенный иногда вообще стоит пока не подтолкнёш но самое интерестное реверс (не работает ) . Мотор с датчиками холла. Буду признателен за помощь… Не безвозмездно разумееться…

Translate
Архіви

© 2011-2018 Андрій Корягін, Кременчук - Київ, Україна