Определение положения ротора в остановленном состоянии двигателя
В этой статье предлагается решение для определения положения ротора для большинства типов бесколлекторных двигателей постоянного тока с постоянными магнитами.
За основу этой статьи взята статья 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 двигунів
- Література по безколекторним двигунам.
- Безколекторні двигуни. Приклади програм для мікроконтролера
- Схема регулятора BLDC на STM32
- STM32. Приклад. Керування безколекторним двигуном (BLDC)
- STM32. Приклад. Керування PMSM. Приклади програм
- Видео о бесколлекторных моторах. BLDC, PMSM, векторное управление (російською)
Недавні записи
- Text to speech. Українська мова
- LCD Display ST7567S (IIC)
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
Tags
docker sensors rtc led timer wifi remap sms css websocket mongodb bme280 rfid bluetooth esp8266 nodemcu bkp piezo bmp280 i2c mpu-6050 encoder examples avr brushless ngnix nvic displays bldc java-script pmsm barometer pwm lcd ethernet stm32 raspberry-pi capture usart gpio exti atmega meteo solar smd dma adc eeprom eb-500 flask python ssd1306 uart options flash mpx4115a html gps st-link 3d-printer servo dc-dc foc git books battery hih-4000 watchdog dht11 web tim programmator ssd1331 mpu-9250 usb rs-232 motor max1674 soldering
Архіви