Урок 75. Разработка ПИД-регулятора скорости вращения двигателя постоянного тока.

ПИД-регулятор

Проверим измеритель скорости вращения на реальном двигателе, управляя им без обратной связи. Разработаем ПИД-регулятор стабилизации скорости вращения.

Предыдущий урок     Список уроков     Следующий урок

В предыдущем уроке мы научились измерять период импульсов дискретного сигнала. Теперь мы можем определить скорость вращения двигателя, используя сигнал с датчика Холла.

 

Измерение скорости вращения двигателя.

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

 

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!
 

Программа позволяет регулировать скорость вращения мотора с помощью ШИМ, без обратной связи. Кроме того она измеряет скорость и выводит ее значение в последовательный порт.

Вычисление скорости происходит в строке:

Serial.print( 60000000. / ((float)tempPeriodTime * 0.0625 * NUM_PULS_REV));

  • 60000000. – это минута, переведенная в микросекунды;
  • tempPeriodTime * 0.0625 – реальное время периода импульсов на выходе датчика Холла;
  • NUM_PULS_REV – число импульсов на один оборот.

Загружаем, запускаем монитор последовательного порта.

Монитор

Вместо датчика у нас к выводу 8 подключен тестовый сигнал (вывод 5). На нем формируются импульсы с периодом примерно 10 мс, что соответствует скорости 3000 об/мин. Убеждаемся, что программа показывает такое значение скорости. Вращением переменного резистора проверяем, что ШИМ регулируется во всем диапазоне.

Подключаем к выводу 8 датчик Холла и подаем питание 12 В.

Монитор

Скорость вращения мотора изменяется переменным резистором, измеритель показывает правильную скорость.

Но ШИМ стабильно держится на значении 200, а скорость все время “дергается” в небольших пределах. Логично предположить, что я не смог приклеить постоянные магниты на абсолютно одинаковом расстоянии друг от друга. А значит, время прохождения одного магнита под датчиком отличается от другого. В результате два соседних импульса датчика Холла имеют разные периоды.

Давайте усредним период для двух соседних импульсов.

 

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!
 

Если раньше при стабильном ШИМ равном 200 скорость “прыгала” от 2305 до 2357, то после усреднения диапазон изменений стал значительно уже 2310…2312.

Монитор

Это всего 0,09 %, или ± 0,045 %.

Определяем, в каком диапазоне скоростей работает наш мотор. У меня двигатель равномерно вращается, начиная со скорости 300 об/мин. Его максимальная скорость вращения немногим более 2600 об/мин. Эти параметры потребуются в следующем разделе.

Теперь у нас есть все, чтобы стабилизировать скорость вращения двигателя.

 

Разработка ПИД-регулятора скорости вращения.

Кто не знает, что такое ПИД-регулятор убедительно советую прочитать урок 40.Он полностью посвящен пропорционально-интегрально-дифференцирующим регуляторам.  Еще надо  просмотреть начало урока 39. Там есть раздел ”Общие сведения о регуляторах”.

Скажу только, что в нашем устройстве:

  • регулируемый параметр – это измеренная скорость;
  • регулирующий элемент – значение ШИМ.

Вот окончательный скетч устройства.

 

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!
 

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

  • В основном цикле loop() происходит измерение напряжения на аналоговом входе A0, усреднение его значения и вычисления заданной скорости.

Константа NUM_AVERAGE_ADC задает количество выборок для усреднения, а значит и инерционность реакции на изменение заданной скорости.

Полный диапазон задатчика скорости – напряжения на выводе A0 масштабируется в диапазон допустимых скоростей регулятора. При изменении напряжения в диапазоне 0…5 В, заданная скорость меняется в диапазоне, определенном константами  MIN_VELOCITY …  MAX_VELOCITY (минимальное и максимальное значения скорости).

setVelocity= MIN_VELOCITY + (MAX_VELOCITY - MIN_VELOCITY) * (float)averageAdc / NUM_AVERAGE_ADC / 1023.;

  • В обработчике прерывания по переполнению таймера 1 вырабатывается признак остановки двигателя flagVelZerro.

if( numOverflowTimer1 > periodTimeStop ) flagVelZerro= true;

Если таймер 1 переполнился заранее рассчитанное количество раз (periodTimeStop), то это означает, что в течение соответствующего времени с датчика Холла не пришел ни один импульс. Время, при котором двигатель считается остановленным, рассчитывается исходя из константы ZERRO_VELOCITY.

// вычисление периода импульсов остановленного двигателя
periodTimeStop= 14648 / NUM_PULS_REV / (unsigned long)ZERRO_VELOCITY;

  • Если двигатель вращается (flagVelZerro != true), то в основном цикле вычисляется измеренная скорость.

measuredVelocity= 60000000. / ( (float)averageVel / NUM_AVERAGE_VEL * 0.0625 * NUM_PULS_REV);

Число выборок для усреднения измеренной скорости определяется константой NUM_AVERAGE_VEL. При готовом результате формируется признак flagVel.

  • При остановленном двигателе (flagVelZerro == true) искусственно вырабатывается признак  flagVel= true;. Это необходимо для того, чтобы ПИД-регулятор работал при остановленном двигателе. Что-то же должно начинать его крутить.
  • В основном цикле проверяется состояние сигнала включения (вывод PIN_ON). Если работа мотора запрещена, то программный блок ПИД-регулятора пробрасывается. Запрещается работа ШИМ и интегральное звено устанавливается на начальное значение (константа INT_BEGIN).
  • Блок собственно ПИД-регулятора вызывается при условии, что:
    • разрешена работа двигателя;
    • рассчитана новая измеренная скорость
    • с предыдущего вызова прошло время не менее REG_TIME мс.

Т.е. константа REG_TIME определяет временную дискретность работы регулятора.

  • Математика самого регулятора полностью повторяет формулы из учебников.
  • В основном цикле с периодом, заданным константой DISPLAY_TIME, в последовательный порт выводятся: заданная и измеренная скорости, период импульсов датчика Холла и значение ШИМ.

Основное по программе все.

 

Проверка работы ПИД-регулятора на тестовом сигнале.

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

Отключим питание 12 В, отключим датчик Холла от 8 вывода, соединим 8 и 5 выводы. Т.е. подадим на вход измерения скорости тестовый сигнал.

Загрузим программу в плату.

 

Зарегистрируйтесь и оплатитеВсего 60 руб. в месяц за доступ ко всем ресурсам сайта!
 

Подадим разрешающий сигнал на вывод PIN_ON.

Проверяем, что:

  • Заданная скорость меняется вращением переменного резистора в пределах 300 … 2600.
  • Измеренная скорость определяется частотой тестового сигнала и равна 1500.

Выключаем интегральную часть. Пропорциональный коэффициент задаем равным 0,01.

#define K_P 0.01 // пропорциональный коэффициент
#define K_I 0.  // интегральный коэффициент

Загружаем скетч в плату, открываем монитор последовательного порта.

Устанавливаем заданную скорость больше измеренной и проверяем, что:

ШИМ = начальное значение интегрального звена + (заданная скорость – измеренная скорость) * пропорциональный коэффициент.

Монитор

В моем случае ШИМ = 25 + (2217 – 1500) * 0,01 = 32

Проверяем тоже самое для заданной скорости меньше измеренной.

Монитор

В моем случае ШИМ = 25 + (1100 – 1505) * 0,01 = 21

Проверяем интегральное звено. Отключаем пропорциональную часть, интегральный коэффициент устанавливаем равным 0,001.

#define K_P 0. // пропорциональный коэффициент
#define K_I 0.001  // интегральный коэффициент

Загружаем, открываем монитор.

Устанавливаем заданное значение скорости 1600. Убеждаемся, что ШИМ нарастает начиная со значения 25 со скоростью 1 единица в сек. С учетом того, что в монитор данные выводятся каждые 0,2 сек, нарастание ШИМ на 1 должно происходить через каждые 5 строк.

Монитор

Поясню.

Ошибка рассогласования равна 1600 – 1500 = 100. За одну временную дискретность регулятора (0,1 сек) приращение = 100 * 0,001 = 0,1. Приращение 0,1 десять раз в секунду получается 1 в секунду.

Проверяем для отрицательного рассогласования. Задаем скорость равной 1400.

Монитор

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

 

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

 

Предыдущий урок     Список уроков     Следующий урок

 

1

Автор публикации

не в сети 2 дня

Эдуард

279
Комментарии: 1936Публикации: 197Регистрация: 13-12-2015

9 комментариев на «Урок 75. Разработка ПИД-регулятора скорости вращения двигателя постоянного тока.»

    • Здравствуйте!
      Такой же, как и для других типов двигателей. Обычно инкрементальный. Например, металлический диск с прорезью и датчик Холла.

      0
  1. Здравствуйте. При тестировании скетча с измерением частоты вращения двигателя проскакивают ложные значения частоты вращения. Например при стабильной частоте 1030 об/мин периодически в мониторе отображается рандомные показания, например V= 1714285.75 rpm. Скетч не менял, только частоту ШИМ снизил. В качестве датчика использую оптический прерыватель. В чем проблема может быть?

    0
    • Здравствуйте!
      Вероятная ошибка — помехи на входе захвата (ICP). На этом входе стоит триггер, который запоминает любой, самый короткий, выброс. Подключите сигнал с выхода оптрона отдельной витой парой, непосредственно к выводу платы Ардуино.
      Внешний подтягивающий резистор не забыли?

      0
      • Спасибо за скорый ответ) Резистор стоит. Пока проблема не решилась и с ПИД регулятором соответственно двигатель делает рывки из за этого.

        0
      • Подключился логическим анализатором к пину захвата, там все сигналы от датчика приходят без помех, с одинаковой частотой. В программе может быть ошибка? Может быть так, что прерывания накладываются друг на друга? Заметил еще, что скетч, который только считает обороты работает без ошибок, а в скетче, который управляет двигателем и считает обороты уже проскакивают ложные значения от датчика.

        0
  2. При подключении к пину захвата тестового сигнала с пина 5, так же идет ошибка. При стабильных 5800 rpm, проскакивает 6500 rpm, каждый 10-15й вывод информации.

    0

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

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

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".