Определение положения ротора в остановленном состоянии двигателя


29.11.2013

В этой статье предлагается решение для определения положения ротора для большинства типов бесколлекторных двигателей постоянного тока с постоянными магнитами.

За основу этой статьи взята статья Sensorless Detection of Rotor Position of PMBL Motor at Stand Still Авторы: Roustiam Chakirov, Yuriy Vagapov, and Andreas Gaede

Я позволил себе ее вольно перевести с некоторыми упрощениями и дополнениями, добавив в конце пример реализации и небольшой видеоотчет полученных результатов.

Этот метод обеспечивает надежный и быстрый запуск бесколлекторного двигателя, не зависит от применения датчиков и пригоден для разных схем управления. Метод основан на обнаружении нелинейностей в обмотках статора двигателя при различных положениях постоянных магнитов ротора (имеется ввиду пока мотор не вращается). Описанное решение предполагает включение обмоток статора по схеме звезда.

Ранее описаный метод запуска бесколлекторного бездатчикового двигателя при котором на начальном этапе ротор устанавливается в заведомо известное положение имеет ряд недостатков:

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

Если перед запуском двигателя определить положение ротора, можно избавиться от описанных выше недостатков. Точность ±30 электрических градусов вполне достаточна для решения этой задачи.

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

fig0

Определение положения ротора

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

Рис. 1 Рис. 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 приведены формы сигналов напряжения и тока средней точки при проведении измерений.

Рис.2 Рис.2

Для удачного измерения требуется:

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

Рис. 3 Рис. 3

Как можно видеть на рис. 3, достаточно трудно определить положение ротора по форме кривых. Потребуется некоторые дополнительные операции с данными. Потребуются значения:

f1

где Vrs - напряжения, во время импульса, когда напряжение подается от источника питания к фазе R, в то время как фаза S подключена к земле. По аналогии и остальные значения. Распределение этих значений показано на Рис. 4

Рис. 4 Рис. 4

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

Таблица 1

Результатом этого логического анализа является обнаружение двух сегментов в 60 °, один из которых соответствует фактическому положению ротора. Для того, чтобы определить какой один из двух правильный применим второй алгоритм. Функции:

f2

Рис. 5 показывает результаты функций F1, F2 и F3 соответствующие положению ротора.

Рис. 5 Рис. 5

Эти графики являются периодическими функциями с периодом в 360 электрических градусов и с разностью фаз в 120 ° между соседними кривыми. Поэтому эти функции могут интерпретироваться как сигналы "виртуального датчика Холла" аналогично датчику Холла в BLDC двигателях с датчиками. Таблица 2 показывает метод определения положения ротора исходя из значений ранее преведенных функций.

Таблица 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)). А измерения на фазах выполнялись с помощью аналоговых входов микроконтроллера. В результате получил более четкий и плавный запуск бесколлекторного двигателя. Что и демонстрирует следующее видео:

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

Успехов!

Статті по безколекторним двигунам:

Brushless Motors Корисно знати
Коментарі:
Додати коментар
Code
* - обов'язкові поля

Архіви