ПИД-регулятор для двигателя
ПИД-регулятор держит скорость или угол вала, сколько бы ни менялась нагрузка. Разбираем по документам Microchip, TI и учебнику Kuphaldt, как записать его в дискретной форме для микроконтроллера, выбрать период, защитить интегратор от насыщения, построить каскад «ток — скорость — положение» и настроить коэффициенты. С примером на энкодере и кодом на C в целых числах.
Обновлено Редакция GAW
ПИД-регулятор (PID, пропорционально-интегрально-дифференциальный) вычисляет управляющее воздействие по ошибке e — разности между заданием и измерением — как сумму трёх составляющих (AN964, уравнение 1):
Для двигателя заданием служит скорость или угол, измерением — сигнал энкодера, датчика тока или противо-ЭДС, а выходом — скважность ШИМ или задание тока для внутреннего контура. AN532 называет ПИД самым распространённым алгоритмом управления сервоприводом: он не всегда оптимален, но понятен и легко настраивается.
Коротко
- P реагирует на текущую ошибку, но один оставляет установившуюся ошибку (AN937).
- I копит прошлые ошибки и убирает остаток; без защиты насыщается, пока выход упирается в предел.
- D реагирует на скорость изменения и усиливает шум; в контуре скорости её обычно не ставят (AN1078).
- Период постоянный, от прерывания таймера: около 1 мс у сервоконтура AN532, 50 мкс у контура тока FOC в AN1078.
- Каскад «ток → скорость → положение»: внутренний контур быстрее внешнего и настраивается первым (Kuphaldt, разд. 31.2).
- Насыщение — выход ограничивают, а интегратор останавливают, пока выход в пределе (AN532).
Три составляющие
| Составляющая | Что делает | Чем опасна |
|---|---|---|
| P — пропорциональная | выход пропорционален ошибке: чем больше отклонение, тем сильнее коррекция | при большом Kp — колебания; одна P оставляет остаточную ошибку |
| I — интегральная | копит сумму ошибок и сдвигает выход, пока ошибка не станет нулевой | медленная, при большом Ki — колебания; насыщение при ограниченном выходе |
| D — дифференциальная | реагирует на скорость изменения, «притормаживает» подход к заданию | усиливает шум измерения; на скачке задания даёт выброс |
В установившемся режиме ошибка равна нулю, и P-составляющая тоже ноль: скважность, нужную двигателю на заданной скорости, держит интегратор. Поэтому для привода почти всегда нужна хотя бы ПИ-структура — на графиках AN937 пропорциональный регулятор ни при одном из четырёх коэффициентов не выходит точно на задание, а останавливается с ненулевой ошибкой.
Дискретная форма на микроконтроллере
Микроконтроллер вычисляет регулятор раз в период Ts, поэтому интеграл заменяют суммой, а производную — разностью (AN964, уравнения 2–4):
Ту же формулу пишут через постоянные времени: Ki = Kp/Ti, Kd = Kp · Td. Множители KiTs и Kd/Ts считают заранее — в цикле остаются три умножения и сложения. AN964 выбирает частоту 256 Гц, чтобы деление на частоту превратилось в сдвиг; с готовыми коэффициентами это не нужно.
Такая запись — позиционный алгоритм: каждый раз вычисляется сам выход. Есть и скоростной алгоритм (алгоритм приращений): вычисляется изменение выхода Δu, которое прибавляют к прошлому значению. Kuphaldt (разд. 29.15.2) отмечает его преимущество: при смене коэффициента на ходу выход не прыгает.
Период должен быть постоянным. Коэффициенты KiTs и Kd/Ts верны только при неизменном Ts. Регулятор вызывают из прерывания таймера, а в AN532 прерывание синхронизировано с ШИМ: оно приходит раз в 16 периодов ШИМ 15,625 кГц, то есть каждые 1,024 мс. Как подобрать предделитель и период таймера — в калькуляторе таймера.
| Документ | Что регулируется | Период |
|---|---|---|
| AN1078 | токи Id, Iq в векторном управлении | 50 мкс (20 кГц) |
| SPRABQ3 | токи и скорость в векторном управлении | 100 мкс (10 кГц) |
| AN532 | положение и скорость коллекторного двигателя | 1,024 мс |
| AN937 | скорость двигателя на плате PICDEM MC | интеграл каждую 1 мс, разность ошибок каждые 4 мс |
| AN964 | угол перевёрнутого маятника | 3,9 мс (256 Гц) |
Ориентиры из AN532: электрическая постоянная времени двигателей — от 0,5 мс, механическая — от 20 мс. Контур тока работает со скоростью электрических процессов, контур скорости — механических. AN964 оценивает нужную частоту для маятника в 30 Гц и берёт с запасом в 8 раз больше.
Насыщение интегратора
Выход регулятора всегда ограничен: скважность не бывает больше 100 %, ток — больше допустимого. Если ошибка держится долго, а выход уже в пределе — вал заторможен, двигатель разгоняется с предельным током, — интегратор продолжает копить ошибку без пользы. Когда помеха исчезает, накопленная сумма держит выход в пределе, пока не «размотается», и скорость сильно перескакивает задание (AN532). Kuphaldt и TI в SPRUHJ1 описывают то же явление под названием windup.
Три способа защиты из документов:
- Не интегрировать при насыщении (AN532, AN937): пока выход в пределе, сумма не меняется. Удобная разновидность — разрешать интегрирование, если оно уводит выход из предела.
- Ограничить сумму ошибок (AN937): накопленную ошибку сравнивают с пределом и не дают выйти за него.
- Обратный расчёт (AN1078): превышение неограниченного выхода над пределом умножают на Kc и вычитают из суммы; AN1078 советует Kc = Ki.
В каскаде предел выхода внешнего регулятора — это ограничение задания внутреннего: регулятор скорости выдаёт задание тока не больше допустимого тока двигателя.
Производная: по измерению и с фильтром
Если D считать по ошибке, скачок задания даёт бесконечную производную и выброс выхода. Kuphaldt (разд. 29.7) описывает вариант, который есть во многих регуляторах: D считают по изменению измерения, а не ошибки, — при неизменном задании это то же самое, а скачок задания выброса не даёт. Знак при этом меняется: −Kd · Δy/Ts. AN937 тоже упоминает D по выходу объекта как альтернативу.
Вторая проблема — шум: D отвечает на скорость изменения, а у шума она огромная. AN964 ставит перед АЦП аналоговый фильтр Бесселя с частотой среза 60 Гц и ограничивает D-составляющую в коде; AN937 вычисляет разность ошибок только раз в четыре периода. В программе удобен фильтр первого порядка того же вида, что в AN1078 и AN1292: y(n) = y(n − 1) + K (x(n) − y(n − 1)), где K меньше 1.
В контуре скорости AN1078 обходится без D вообще: скорость меняется медленно, а D-составляющая вызывает резкие изменения скважности и срабатывание защиты по току.
Каскад: ток, скорость, положение
Одним ПИД сразу по углу вала управлять трудно: ток двигателя задаёт ускорение, а угол — его двойной интеграл. Kuphaldt (разд. 31.2) показывает классическую схему сервопривода — три вложенных контура: регулятор положения выдаёт задание скорости, регулятор скорости — задание тока (момента), регулятор тока — напряжение на двигателе. Каждый внутренний контур упрощает объект для внешнего: при замкнутом контуре скорости регулятор положения видит не «разгоняющийся», а просто интегрирующий объект.
Два правила каскада (Kuphaldt, разд. 31.2):
- Внутренний контур быстрее внешнего. Если внешний регулятор меняет задание быстрее, чем внутренний успевает его отработать, каскад не работает.
- Настраивают изнутри наружу. Сначала ток, потом скорость, потом положение: внешний регулятор полагается на отлаженный внутренний. TI в SPRABQ3 отлаживает векторное управление в том же порядке — контуры токов, затем скорость.
TI в SPRUHJ1 даёт для каскада «ток — скорость» расчётную методику. Для контура тока в последовательной форме ПИ Ki,series = R/L, Kp,series = L · ωтока. Для контура скорости вводится коэффициент демпфирования δ: чем он больше, тем устойчивее и медленнее контур. При δ = 1 система неустойчива, ниже 2 — большое перерегулирование, выше 30 — слишком медленный отклик. В примере TI для двигателя с R = 0,4 Ом и L = 0,6 мГн при полосе скорости 800 рад/с и δ = 4 полоса контура тока получается 2126 рад/с, а коэффициенты — Kpseries = 1,28 и Kiseries = 667 для тока, 133 и 3,29 для скорости. Как это применяется в векторном управлении — в статье «Векторное управление (FOC)».
Задание для контура положения обычно не ступенька, а профиль. В AN532 скорость растёт с постоянным ускорением A до предела, держится и снижается — трапеция, а для короткого перемещения треугольник. Каждый период новое задание считается так: V(k) = V(k − 1) + A, P(k) = P(k − 1) + V(k − 1) + A/2.
Как настраивать
Вручную, по AN1078. Обнулить I и D, увеличивать P, пока отклик на изменение задания не станет быстрым без заметного перерегулирования и колебаний; затем понемногу увеличивать I, пока ошибка не начнёт уходить в ноль — в большинстве систем I нужно немного. Если появились колебания вокруг задания, уменьшить I и увеличить P. AN937 советует похожее: начать с малых коэффициентов, настроить один P и добавлять остальные составляющие по одной. AN532 записывает задание, скорость и ошибку каждый период и подбирает коэффициенты по графикам — то же можно сделать, выводя данные в UART.
По Зиглеру — Никольсу (Kuphaldt, разд. 30.3.1). Отключить I и D и поднимать Kp, пока контур не начнёт колебаться с постоянной амплитудой. Этот коэффициент — критический Ku, период колебаний — Pu. Дальше по таблице:
| Регулятор | Kp | Ti | Td |
|---|---|---|---|
| П | 0,5 Ku | — | — |
| ПИ | 0,45 Ku | Pu / 1,2 | — |
| ПИД | 0,6 Ku | Pu / 2 | Pu / 8 |
P-регулятор с Kp = 0,5 Ku, по Kuphaldt, даёт затухание колебаний примерно в четверть амплитуды за период — быстрый отклик ценой заметного перерегулирования. Kuphaldt предупреждает: чтобы найти Ku, систему приходится доводить до границы устойчивости, а это опасно для оборудования. И ещё одно условие (разд. 30.3): колебания должны ограничиваться самой системой, а не тем, что выход регулятора или датчик упирается в предел. Если скважность ШИМ на пиках достигает 0 или 100 % или срабатывает ограничение тока, это уже не те колебания — найденные Ku и Pu будут неверными; коэффициент уменьшают, пока волна не станет симметричной синусоидой.
Пример (наш расчёт): контур скорости при периоде 1 мс начал колебаться при Ku = 40 с периодом Pu = 20 мс. Для ПИД: Kp = 24, Ti = 10 мс, Td = 2,5 мс, то есть KiTs = KpTs/Ti = 2,4 на период и Kd/Ts = KpTd/Ts = 60.
Расчётом, если известны параметры двигателя и нагрузки, — по методике SPRUHJ1 из предыдущего раздела.
Пример: регулятор скорости по энкодеру, 1 кГц
Коллекторный двигатель с энкодером на 500 периодов на оборот; таймер в режиме энкодера считает все фронты (x4) — 2000 отсчётов на оборот. Регулятор вызывается раз в 1 мс, выход — значение сравнения таймера ШИМ от 0 до 999. Все числа ниже — наш расчёт.
Измерение скорости. Скорость — приращение счётчика за период. Задание 1500 об/мин = 25 об/с = 50 000 отсчётов в секунду = 50 отсчётов за 1 мс. Шаг измерения — один отсчёт за период, то есть 0,5 об/с или 30 об/мин: 2 % от задания. Соседние выборки скачут на ±1 отсчёт, и D-составляющая превращала бы каждый скачок в рывок ШИМ — ещё одна причина обойтись ПИ. Точнее измеряют по нескольким периодам (окно 10 мс даёт шаг 3 об/мин, но добавляет запаздывание) или по времени между импульсами. Как устроены энкодеры и режимы счёта — в статье «Энкодеры».
Первые периоды. Коэффициенты подобраны для примера: Kp = 10 единиц ШИМ на отсчёт/мс ошибки, KiTs = 2 на период. Пуск с места:
| k | Измерено, отсчётов/мс | Ошибка e | P = 10 · e | Интегратор | Выход |
|---|---|---|---|---|---|
| 0 | 0 | 50 | 500 | 0 + 2 · 50 = 100 | 600 |
| 1 | 4 | 46 | 460 | 100 + 92 = 192 | 652 |
| 2 | 9 | 41 | 410 | 192 + 82 = 274 | 684 |
Заторможенный вал. Пусть вал удержан 100 мс при ошибке 50. P = 500, интегратор растёт на 100 за период, и уже на пятом периоде выход 500 + 500 = 1000 упирается в предел 999.
- Без защиты интегратор через 100 мс достигает 10 000, неограниченный выход — 10 500. После освобождения вала выход останется в пределе, пока P + интегратор не опустится ниже 999. Если двигатель перескочил задание на 10 отсчётов/мс (300 об/мин), P = −100, и интегратор должен упасть с 10 000 примерно до 1100, теряя по 20 за период, — это около 450 мс полной скважности при скорости выше заданной.
- С остановкой интегратора, как в коде ниже, он замирает на 400 — последнем значении, при котором выход был ниже предела, — и выход уходит из предела, как только ошибка начинает уменьшаться.
Код на C
Регулятор в целых числах: коэффициенты и интегратор хранятся в формате Q8 (значение · 256), что даёт дробные коэффициенты без плавающей точки. Подробнее о форматах — в статье «Фиксированная точка».
#include <stdint.h>
// Gains and integrator in Q8 (value * 256); output in PWM compare counts.
typedef struct {
int32_t kp; // Kp, Q8
int32_t ki; // Ki * Ts, Q8
int32_t kd; // Kd / Ts, Q8
int32_t integ; // integrator state, Q8
int32_t d_filt; // filtered derivative term, Q8
int32_t prev_meas; // measurement of the previous sample
int32_t out_min; // output limits, compare counts
int32_t out_max;
} pid_ctrl_t;
// One controller step; call at a fixed period from a timer interrupt.
int32_t pid_step(pid_ctrl_t *c, int32_t setpoint, int32_t meas)
{
int32_t err = setpoint - meas;
int32_t p = c->kp * err;
// Derivative of the measurement, not of the error: no kick on a setpoint step.
// First-order low-pass filter: y += (x - y) / 4.
int32_t d_raw = -c->kd * (meas - c->prev_meas);
c->prev_meas = meas;
c->d_filt += (d_raw - c->d_filt) / 4;
int32_t integ_next = c->integ + c->ki * err;
int32_t u = (p + integ_next + c->d_filt) / 256; // Q8 -> compare counts
// Clamp the output. Keep the new integrator value only if it does not drive the
// output further into the limit (conditional integration, AN532 and AN937).
if (u > c->out_max) {
u = c->out_max;
if (err < 0) {
c->integ = integ_next;
}
} else if (u < c->out_min) {
u = c->out_min;
if (err > 0) {
c->integ = integ_next;
}
} else {
c->integ = integ_next;
}
return u;
}
Контур скорости из примера: таймер энкодера читается раз в 1 мс, разность двух 16-битных значений счётчика правильна и при его переполнении — AN532 пользуется тем же свойством дополнительного кода.
#include <stdint.h>
// Board-specific, implemented elsewhere.
uint16_t encoder_count(void); // timer counter in encoder mode, x4
void pwm_set_compare(int32_t value); // 0..999
void irq_disable(void);
void irq_enable(void);
static pid_ctrl_t speed_pid = {
.kp = 10 * 256, // 10 compare counts per count/ms of error
.ki = 2 * 256, // Ki * Ts = 2 per sample
.kd = 0, // speed loop without D, as in AN1078
.out_min = 0,
.out_max = 999,
};
static volatile int32_t speed_ref = 50; // counts per 1 ms: 1500 rpm at 2000 counts/rev
static uint16_t last_count;
// Call once before the 1 ms timer interrupt is enabled.
void speed_loop_init(void)
{
last_count = encoder_count(); // no false speed step on the first tick
speed_pid.prev_meas = 0; // the shaft is at rest: measured speed 0
speed_pid.integ = 0;
}
// Main-loop side: on an 8-bit MCU even one 32-bit volatile store is not atomic.
void speed_set(int32_t ref)
{
irq_disable(); // board-specific, e.g. cli() on AVR
speed_ref = ref;
irq_enable(); // e.g. sei()
}
// Timer update interrupt, every 1 ms (interrupts are off here, the read is safe).
void control_tick_1ms(void)
{
uint16_t now = encoder_count();
uint16_t diff = (uint16_t)(now - last_count); // modulo 2^16: correct across wrap-around
int16_t speed = (int16_t)diff; // values above 32767 -> negative: implementation-defined
// before C23, two's complement in GCC and C23
last_count = now;
pwm_set_compare(pid_step(&speed_pid, speed_ref, speed));
}
Задание speed_ref меняют из основной программы, а читают в прерывании, поэтому оно объявлено volatile. Но volatile не делает доступ атомарным: на 8-битном контроллере даже одна запись 32-битной переменной — несколько команд, и прерывание может прочитать половину старого и половину нового значения. Поэтому запись в speed_set() обёрнута запретом прерываний; так же защищают обновление нескольких связанных переменных (задание, коэффициенты) — см. статью «Прерывания и общие данные». Перед запуском таймера speed_loop_init() берёт last_count из текущего показания счётчика, иначе первый же период покажет ложную скорость. Приведение разности к int16_t для значений больше 32 767 до C23 определяется реализацией; GCC и Clang, как и C23, используют дополнительный код, но переносимый вариант — сравнить diff с 32 768 и вычесть 65 536 вручную. Для реверса выход делают знаковым (−999…999), а знак переводят в направление H-моста, как в управлении коллекторным двигателем. Сам pid_step() не зависит от железа, и его удобно проверить тестами на компьютере: подать последовательность измерений и сравнить выходы с расчётом.
Время расчёта невелико даже на 8-битных контроллерах: в AN937 полный ПИД на PIC18 занимает 437 тактов (43,7 мкс на 40 МГц), в AN532 — 0,2 мс на PIC17C42 с частотой 16 МГц.
Типичные ошибки
- Период вызова плавает. ПИД в
loop()Arduino или в основном цикле с задержками получает разный Ts, и коэффициенты KiTs и Kd/Ts теряют смысл. Нужен таймер. - Интегратор без защиты. Заторможенный вал, разгон с предельным током или выключенный драйвер — и после снятия помехи большой выброс скорости (AN532).
- D по ошибке и без фильтра. Каждый скачок задания и каждый отсчёт энкодера дают рывок выхода. Берите D по измерению с фильтром или откажитесь от неё в контуре скорости (AN1078).
- Переполнение в целых числах. Произведение коэффициента в Q8 на ошибку и сумма интегратора должны помещаться в int32; для выхода и интегратора полезна арифметика с насыщением.
- Внешний контур быстрее внутреннего. Регулятор положения с большим Kp при медленном контуре скорости раскачивает привод; настраивайте каскад изнутри наружу (Kuphaldt, разд. 31.2).
- Перепутан знак обратной связи. Если энкодер считает в обратную сторону, регулятор разгоняет двигатель до упора. Проверьте направление счёта при разомкнутом контуре, прежде чем включать регулятор.
- Слишком грубое измерение скорости. При малой скорости за период набегает один-два отсчёта, и регулятор работает почти вслепую. Увеличьте окно измерения или измеряйте период импульсов.
Частые вопросы
Как часто вызывать ПИД-регулятор двигателя?
Период должен быть намного короче постоянных времени объекта. AN532 приводит для двигателей электрическую постоянную от 0,5 мс и механическую от 20 мс и вызывает сервоконтур положения и скорости раз в 1,024 мс. Контуры тока работают быстрее: в векторном управлении AN1078 — каждые 50 мкс. Главное — постоянный период: его задают прерыванием таймера, а не циклом loop().
Что такое насыщение интегратора и как с ним бороться?
Пока выход регулятора упирается в предел (например, ШИМ 100 % при заторможенном вале), ошибка не уходит, и интегратор растёт без пользы. Когда помеха исчезает, накопленная сумма держит выход в насыщении, и скорость сильно перескакивает задание (AN532). Защита — не интегрировать, пока выход в насыщении (AN532, AN937), ограничить сумму ошибок или вычитать из неё превышение выхода над пределом, как в AN1078.
Нужна ли D-составляющая в регуляторе скорости?
Обычно нет. AN1078 не использует её в контуре скорости: скорость меняется медленно, а D дёргает скважность ШИМ и может вызвать срабатывание защиты по току. Сигнал скорости с энкодера дискретный и шумный, а D усиливает именно быстрые изменения. Если D нужна, её считают по измерению, а не по ошибке, и пропускают через фильтр нижних частот.
Как настроить ПИД-регулятор двигателя?
Порядок из AN1078: обнулить I и D, увеличивать P, пока отклик на ступеньку не станет быстрым без перерегулирования, затем понемногу добавлять I, пока ошибка не уйдёт в ноль; при колебаниях уменьшить I и увеличить P. В каскаде сначала настраивают внутренний контур тока, потом скорость, потом положение. Метод Зиглера — Никольса требует довести контур до незатухающих колебаний, причём, по Kuphaldt, амплитуда должна ограничиваться самой системой, а не насыщением выхода или датчика, иначе Ku и Pu получатся неверными. Ограничение тока драйвера при этом — только страховка: во время измерения оно не должно срабатывать.
Почему ПИД-регулятор скорости на Arduino дёргает двигатель?
Частые причины — неровный период вызова (расчёт в loop() вместо прерывания таймера), грубое измерение скорости и D-составляющая. Энкодер на 2000 отсчётов на оборот при периоде 1 мс даёт шаг измерения 30 об/мин: соседние выборки скачут на отсчёт, а D превращает этот скачок в рывок ШИМ. Помогают постоянный период, измерение по нескольким периодам или по времени между импульсами и регулятор без D.
Источники
- Microchip. AN937: Implementing a PID Controller Using a PIC18 MCU (DS00937A), 2004 — только P оставляет установившуюся ошибку; насыщение интегратора — ошибка копится, пока выход объекта в насыщении, лечится пределами суммы ошибок или пропуском интегрирования при насыщении; D от ошибки бывает слишком резкой, можно брать D от выхода объекта; разность ошибок считают раз в несколько периодов; порядок настройки: разомкнутая система, требования, периоды, начинать с малых коэффициентов, сначала только P; уравнения 1–4; на плате PICDEM MC: kp = 96, ki = 80, kd = 16 (масштаб 16), интеграл каждую 1 мс, разность ошибок каждые 4 мс; табл. 3 — 437 тактов, 43,7 мкс на 40 МГц
- Microchip. AN532: Servo Control of a DC-Brush Motor (DS00532C), 1997 — ПИД — самый распространённый алгоритм сервоуправления; рис. 5 — дискретный ПИД с блоком против насыщения: интегратор останавливается, пока выход в насыщении, иначе после большой ошибки он «разматывается» с сильными колебаниями; ПИД за 0,2 мс (800 тактов) на 16 МГц, период около 2 кГц доступен; рис. 8 — прерывание раз в 16 периодов ШИМ 15,625 кГц: 1,024 мс; обработчик 0,25 мс; электрическая постоянная времени двигателей от 0,5 мс, механическая от 20 мс; позиция по разности двух 16-битных счётчиков, переполнение не мешает; трапецеидальный и треугольный профиль скорости, V(k) = V(k−1) + A, P(k) = P(k−1) + V(k−1) + A/2; настройка по записанным откликам
- Microchip. AN964: Software PID Control of an Inverted Pendulum Using the PIC16F684 (DS00964A), 2004 — уравнение 1 — C(t) = KP·E + KI·∫E dt + KD·dE/dt; уравнения 2–4 — dE/dt ≈ [E(n) − E(n−1)]/Ts, ∫E dt ≈ Ts·ΣE(n), форма с K, TI, TD: KI = K/TI, KD = K·TD; D очень чувствительна к шуму — аналоговый фильтр Бесселя 60 Гц перед АЦП; частота 256 Гц — степень двойки для сдвигов, в 8 раз выше оценки минимума 30 Гц; ограничение D-составляющей ±120 в коде
- Microchip. AN1078: Sensorless Field Oriented Control of a PMSM (DS01078B), 2010 — рис. 9 — ПИ с ограничением выхода, Excess = U − Out, Sum = Sum + Ki·Err − Kc·Excess, Kc обычно равен Ki; D не используют: скорость меняется медленно, D дёргает ШИМ и вызывает срабатывание защиты по току; настройка: I = D = 0, P до хорошего отклика без перерегулирования, затем медленно I, при колебаниях уменьшить I и увеличить P; внешний контур скорости, внутренние — токи Id и Iq; уравнение 4 — фильтр первого порядка; контур 50 мкс
- Texas Instruments. InstaSPIN-FOC and InstaSPIN-MOTION User's Guide (SPRUHJ1I, revised October 2021) — разд. 11.1 — параллельная и последовательная форма ПИ, Kpseries = Kp, Kiseries = Ki/Kp; насыщение (windup) и ограничение интегратора; разд. 11.2 — для контура тока Kiseries = R/L, Kpseries = L · полоса; разд. 11.3 — каскад скорости и тока, полюс контура тока выше нуля регулятора скорости; разд. 11.4–11.5 — коэффициент демпфирования δ: spdKiseries = Kpseries/(δ²·L), spdKpseries = δ·spdKiseries/K, K = 3·P·λr/(4J); δ = 1 — неустойчиво, меньше 2 — большое перерегулирование, больше 30 — слишком медленно; пример: R = 0,4 Ом, L = 0,6 мГн, λr = 0,0054 В·с/рад, J = 2·10⁻⁴ кг·м², 8 полюсов, полоса скорости 800 рад/с, δ = 4 — полоса тока 2126 рад/с, Kpseries = 1,28, Kiseries = 667, spdKiseries = 133, K = 162, spdKpseries = 3,29
- Tony R. Kuphaldt. Lessons In Industrial Instrumentation, v2.33 (CC BY 4.0), 2024 — разд. 29.7 — D по измерению вместо ошибки убирает выбросы выхода при скачке задания; D «сходит с ума» от шума; разд. 29.14 — насыщение интегратора, ограничение выхода; разд. 29.15.2 — позиционный и скоростной (приращений) алгоритм, у скоростного выход не прыгает при смене коэффициента; разд. 30.3.1 — метод Зиглера — Никольса по критическому коэффициенту: П — 0,5Ku; ПИ — 0,45Ku и τi = Pu/1,2; ПИД — 0,6Ku, τi = Pu/2, τd = Pu/8; затухание в четверть амплитуды; систему приходится доводить до границы устойчивости; разд. 31.2 — каскад: вторичный контур должен быть быстрее, его настраивают первым; сервопривод: положение (ПИ) → скорость (ПИ) → ток (ПИД); разд. 30.3.1: для определения Ku и Pu колебания должны ограничиваться самой системой, а не насыщением датчика или исполнительного элемента; при насыщении на пиках коэффициент уменьшают до симметричной синусоиды
- Texas Instruments. SPRABQ3: Sensorless Field Oriented Control of 3-Phase Permanent Magnet Synchronous Motors (July 2013) — разд. 9 — порядок отладки: контуры токов (уровень 3), затем замыкание контура скорости (уровень 5); выход регулятора скорости — задание тока Iq; ПИ-регуляторы с ограничениями выхода; прерывание 10 кГц
Нашли ошибку?
Смотрите также
- ДвигателиКоллекторные, шаговые, бесколлекторные двигатели и сервоприводы: драйверы, управление, выбор
- Векторное управление (FOC)Кларк и Парк, ПИ-регуляторы Id и Iq, SVPWM, шунты, угол ротора, ослабление поля
- Управление коллекторным двигателемКлюч и диод, ШИМ, H-мост, реверс, торможение, датчики скорости
- СервоприводыУстройство, импульс и угол, постоянное вращение, ток, питание, Arduino Servo
- Энкодеры: инкрементальные и абсолютныеКвадратурный сигнал, x1/x2/x4, EC11, HEDS-5540, AS5600, таймер STM32, дребезг, код
- Режим энкодера таймераАппаратный счёт сигналов A и B инкрементального энкодера
- Фиксированная точкаФормат Q, умножение со сдвигом, округление, насыщение, q15 и _Fract
- Арифметика с насыщениемОграничение результата границей диапазона вместо переполнения
- БИХ-фильтрЦифровой фильтр с обратной связью: формула, коэффициент, время отклика
- Прерывания и общие данныеISR на AVR и Cortex-M, атомарность, критические секции, кольцевой буфер
- Коллекторный двигатель: обороты, ток, КПДМеханическая характеристика, ток останова, мощность, КПД, ШИМ, редуктор
- Таймер AVR и STM32Предделитель, OCRnA, PSC и ARR под частоту, мёртвое время, энкодер