Определение положения ротора в остановленном состоянии двигателя
В этой статье предлагается решение для определения положения ротора для большинства типов бесколлекторных двигателей постоянного тока с постоянными магнитами.
За основу этой статьи взята статья Sensorless Detection of Rotor Position of PMBL Motor at Stand Still Авторы: Roustiam Chakirov, Yuriy Vagapov, and Andreas Gaede
Я позволил себе ее вольно перевести с некоторыми упрощениями и дополнениями, добавив в конце пример реализации и небольшой видеоотчет полученных результатов.
Этот метод обеспечивает надежный и быстрый запуск бесколлекторного двигателя, не зависит от применения датчиков и пригоден для разных схем управления. Метод основан на обнаружении нелинейностей в обмотках статора двигателя при различных положениях постоянных магнитов ротора (имеется ввиду пока мотор не вращается). Описанное решение предполагает включение обмоток статора по схеме звезда.
Ранее описаный метод запуска бесколлекторного бездатчикового двигателя при котором на начальном этапе ротор устанавливается в заведомо известное положение имеет ряд недостатков:
• требуется достаточно много времени для установки ротора в начальное положение и затухания колебаний • в начале запуска двигатель может вращаться в разных направлениях, что в некоторых случаях недопустимо • в некоторых случаях на валу двигателя присутствует удерживающий момент, не позволяющий выполнить позиционирование ротора.
Если перед запуском двигателя определить положение ротора, можно избавиться от описанных выше недостатков. Точность ±30 электрических градусов вполне достаточна для решения этой задачи.
Принцип определения положения ротора основан на особенностях строения двигателя, в частности магнитной и геометрической асимметрии, зависящей от положения ротора. Если Вы помните устройство бесколлекторного двигателя, то обратите внимание на тот факт, что в разных положениях ротора постоянные магниты по разному воздействуют своим магнитным полем на зубья статора. Соответственно, магнитное насыщение зубьев статора будет разным при разных положениях магнитов ротора.
Определение положения ротора
Чтобы определить уровень насыщения на обмотки подают импульс напряжения, замеряют импульсы напряжения на средней точке. Сравнив результаты измерений после подачи импульсов на разные фазы можно оценить положение ротора. Предлагаемый подход нуждается только в информации об изменении индуктивности двигателя и не требует знаний каких либо параметров двигателя. Основная идея является в том, чтобы использовать двигатель как часть измерительного моста. Другой частью являются резистивный делитель из двух резисторов, которые подключают к источнику питания двигателя и делят напряжение пополам. Фазы, которые включаются для измерения выбираются ключами для управления двигателем. См. рис. 1.Для упрощения понимания можете представить, что положение магнитов ротора изменяют индуктивность обмоток. Само значение индуктивности нас не интересует. Нам важна разница индуктивности разных фаз. Поскольку при подаче напряжения на обмотки фаз (см. рис. 1), напряжение Vst растет не скачкообразно, а в зависимости от индуктивности обмотки, мы можем измерять время за которое напряжение достигнет нужного уровня, или измерять напряжение через фиксированный отрезок времени после подачи импульса. Измеренное время или напряжение будет разниться. Проанализировав их, можем вычислить положение ротора.
Последовательно подаются 6 импульсов на фазы обозначенные (R, S, T) в соответствие с 6-ю положениями ключей. И измеряется напряжение средней точки. Таблица соответствия измерений напряжений и открытых ключей.
Vrs | top_r | bot_s |
Vrt | top_r | bot_t |
Vst | top_s | bot_t |
Vsr | top_s | bot_r |
Vtr | top_t | bot_r |
Vts | top_t | bot_s |
Экспериментальная реализация
На Рис. 2 приведены формы сигналов напряжения и тока средней точки при проведении измерений.Для удачного измерения требуется:
• амплитуда фазного тока должна быть в диапазоне номинального тока; • длина импульсов должна быть как можно короче, чтобы избежать любого движения ротора; • следующий импульс должен быть подан после того, как напряжение средней точки упадет до нуля, чтобы избежать воздействий вызванных подачей предыдущего импульса.
Как можно видеть на рис. 3, достаточно трудно определить положение ротора по форме кривых. Потребуется некоторые дополнительные операции с данными. Потребуются значения:
где Vrs - напряжения, во время импульса, когда напряжение подается от источника питания к фазе R, в то время как фаза S подключена к земле. По аналогии и остальные значения. Распределение этих значений показано на Рис. 4
Из рис.4 видно, что применяя простые логические функции можно определить положение ротора в пределах 180 электрических градусов. Эти функции приведены в таблице 1.
Результатом этого логического анализа является обнаружение двух сегментов в 60 °, один из которых соответствует фактическому положению ротора. Для того, чтобы определить какой один из двух правильный применим второй алгоритм. Функции:
Рис. 5 показывает результаты функций F1, F2 и F3 соответствующие положению ротора.
Эти графики являются периодическими функциями с периодом в 360 электрических градусов и с разностью фаз в 120 ° между соседними кривыми. Поэтому эти функции могут интерпретироваться как сигналы "виртуального датчика Холла" аналогично датчику Холла в BLDC двигателях с датчиками. Таблица 2 показывает метод определения положения ротора исходя из значений ранее преведенных функций.
Пример реализации алгоритма на GCC
// Таблица driveTable содержит значения, которые нужно выводить в порт для открытия ключей в соответствии с положением ротора.
driveTable[0] = ((1 << UL) | (1 << VH));
driveTable[1] = ((1 << UL) | (1 << WH));
driveTable[2] = ((1 << VL) | (1 << WH));
driveTable[3] = ((1 << VL) | (1 << UH));
driveTable[4] = ((1 << WL) | (1 << UH));
driveTable[5] = ((1 << WL) | (1 << VH));
// Функция возвращает значение, соответствующее положению в таблице driveTable
unsigned char GetPosition() {
unsigned char i;
unsigned char V[6]; // Массив для хранения результатов измерения напряжения
int F1, F2, F3;
DISABLE_DRIVING; // Отключаем все ключи
SET_PWM_COMPARE_VALUE(Motor.PWM_Top_Value); // Устанавливаем PWM 100% (при 0% ключи отрываться вообще не будут)
for (i=0; i<6; i++) // Цикл измерений
{
cli(); // отключаем все прерывания
DRIVE_PORT = driveTable[i]; // открываем нужные ключи
V[i] = adc_read(ADMUXTable[i]); // измеряем напряжение. Обратите внимание здесь задержки нет. Дело в том что на подготовку ADC в функции adc_read уходит некоторое время. Его оказалось вполне достаточно.
DISABLE_DRIVING; // отключаем ключи
sei(); // Включаем прерывания
StartupDelay(1); // Делаем паузу пока напряжение средней точки упадет до нуля
}
// Вычисляем функции, небходимые для определения положения ротора
F1 = (V[0]+V[3]+V[4]+V[1]) - (V[5]+V[2])*2;
F2 = (V[0]+V[3]+V[5]+V[2]) - (V[4]+V[1])*2;
F3 = (V[4]+V[1]+V[5]+V[2]) - (V[0]+V[3])*2;
i = 0;
if (F1>0) i |= (1<<2);
if (F2>0) i |= (1<<1);
if (F3>0) i |= (1<<0);
// В переменной i сейчас положение ротора от 1 до 6. В принципе, его можно вернуть, но нас больше интересует какие ключи нам надо сейчас открывать для работы двигателя
// Преобразовываем его в индекс для таблицы driveTable. В Вашей реализации преобразование может быть другим.
switch(i)
{
case 1: return 5;
case 2: return 3;
case 3: return 4;
case 4: return 1;
case 5: return 0;
case 6: return 2;
}
return 0; // return на случай непредвиденных обстоятельств
}
Заключение
Для многих алгоритм может показаться довольно сложным, но это не так. Для реализации этого алгоритма мне не понадобилось изменять схему привода, поскольку делитель в схеме уже был и использовался для определения момента пересечения нуля на свободной фазе (см. Управление бездатчиковыми бесколлекторными двигателями (Sensorless BLDC)). А измерения на фазах выполнялись с помощью аналоговых входов микроконтроллера. В результате получил более четкий и плавный запуск бесколлекторного двигателя. Что и демонстрирует следующее видео:
В эксперименте использовался двигатель от привода компьютерных жестких дисков и разработанный мною привод, о котором пойдет речь в следующих статьях.
Успехов!
Статьи по бесколлекторным моторам:
- Что такое Бесколлекторный мотор?
- Устройство бесколлекторного мотора
- Как управлять бесколлекторным мотором с датчиками Холла (Sensored brushless motors)
- Как управлять бесколлекторным мотором без датчиков (Sensorless BLDC)
- Запуск бездатчикового бесколлекторного мотора (Sensorless BLDC)
- Определение положения ротора бесколлекторника в остановленном состоянии
- Контроллер бесколлекторного мотора. Структура ESC
- Схема контроллера бесколлекторного мотора (ESC)
- Силовая часть контроллера бесколлекторного мотора
- Литература по бесколлекторнм моторам
- Примеры на С для управления бесколлекторными моторами
- Схема контроллера бесколлекторного мотора BLDC, PMSM на микроконтроллере STM32
- STM32. Управление бесколлекторным мотором (BLDC)
- STM32. Пример регулятора для бесколлекторного PMSM
- Видео о бесколлекторных моторах. BLDC, PMSM, векторное управление
Додати коментар
Недавні записи
- 🇺🇦 FOC Board STM32F103RB 🧩
- STM32 Motor control SDK - керування оборотами мотора за допомогою потенціометра 📑
- Flask✙Gunicorn✙Nginx➭😎
- STM32 Motor control SDK - програмне керування обертами мотора
- STM32 Motor control SDK - як створити перший проект
- Vue SVG. Приклад побудови живого параметричного креслення
- Вимірювання моменту мотора
- Vue SVG - компонент. Приклад 📑
- Flask + Vue 🏁 Финальный пример 🏁
- Flask, CORS, JSON-файл. Пример#6
Tags
bldc brushless stm32 motor web html css flask atmega foc git java-script pmsm raspberry-pi python websocket mongodb esp8266 nodemcu st-link tim timer docker ngnix programmator ssd1331 ssd1306 wifi uart meteo bme280 bmp280 i2c gps mpu-6050 mpu-9250 sensors 3d-printer options usb barometer remap watchdog flash eeprom rtc bkp encoder pwm servo capture examples dma adc nvic usart gpio books battery dc-dc sms max1674 avr lcd dht11 piezo rs-232 rfid solar exti bluetooth eb-500 displays ethernet led smd soldering mpx4115a hih-4000
Архіви