Перейти к содержанию

ПИД-регулятор для двигателя

ПИД-регулятор держит скорость или угол вала, сколько бы ни менялась нагрузка. Разбираем по документам Microchip, TI и учебнику Kuphaldt, как записать его в дискретной форме для микроконтроллера, выбрать период, защитить интегратор от насыщения, построить каскад «ток — скорость — положение» и настроить коэффициенты. С примером на энкодере и кодом на C в целых числах.

Обновлено Редакция GAW

ПИД-регулятор (PID, пропорционально-интегрально-дифференциальный) вычисляет управляющее воздействие по ошибке e — разности между заданием и измерением — как сумму трёх составляющих (AN964, уравнение 1):

u(t)=Kp e(t)+Ki∫0te dt+Kd dedt.u(t) = K_p\,e(t) + K_i \int_0^t e\,dt + K_d\,\frac{de}{dt}.

Для двигателя заданием служит скорость или угол, измерением — сигнал энкодера, датчика тока или противо-ЭДС, а выходом — скважность ШИМ или задание тока для внутреннего контура. 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):

u(n)=Kp e(n)+KiTs∑k=0ne(k)+KdTs(e(n)−e(n−1)).u(n) = K_p\,e(n) + K_i T_s \sum_{k=0}^{n} e(k) + \frac{K_d}{T_s}\bigl(e(n) - e(n-1)\bigr).

Ту же формулу пишут через постоянные времени: 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 раз больше.

Дискретный ПИД-регулятор с ограничением выходаОшибка e равна разности задания r и измерения y. Пропорциональная ветвь умножает ошибку на Kp, интегральная копит сумму ошибок, умноженную на Ki·Ts, дифференциальная берёт разность двух последних измерений, умноженную на Kd/Ts, и пропускает её через фильтр нижних частот. Сумма трёх ветвей проходит ограничитель и идёт на ШИМ. Пока выход упирается в ограничение, интегратор останавливается.r(k)−eKp · eсейчасKi·Ts · Σeпрошлоеy(k)−Kd/Ts · ΔyтенденцияФНЧ1-го порядкаΣограничениеu(k) → ШИМвыход в насыщении — интегратор стоп
Дискретный ПИД по рис. 5 AN532: интегратор останавливается при насыщении выхода; D считается по измерению (Kuphaldt, разд. 29.7) и проходит фильтр первого порядка

Насыщение интегратора

Выход регулятора всегда ограничен: скважность не бывает больше 100 %, ток — больше допустимого. Если ошибка держится долго, а выход уже в пределе — вал заторможен, двигатель разгоняется с предельным током, — интегратор продолжает копить ошибку без пользы. Когда помеха исчезает, накопленная сумма держит выход в пределе, пока не «размотается», и скорость сильно перескакивает задание (AN532). Kuphaldt и TI в SPRUHJ1 описывают то же явление под названием windup.

Насыщение интегратора: перерегулирование после остановки валаСверху — скорость, снизу — выход регулятора. После ступеньки задания вал удерживается, скорость остаётся нулевой, выход упирается в максимум. Без защиты интегратор продолжает расти, и после освобождения вала выход ещё долго остаётся в насыщении, а скорость сильно перескакивает задание. С остановкой интегратора выход сразу уходит из насыщения, перерегулирование малое.вал удержанωзаданиеuu maxвремяинтегратор останавливаетсябез защиты от насыщения
Насыщение интегратора, качественно (по описанию AN532): без защиты выход остаётся в пределе и после освобождения вала, скорость перескакивает задание

Три способа защиты из документов:

  • Не интегрировать при насыщении (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) показывает классическую схему сервопривода — три вложенных контура: регулятор положения выдаёт задание скорости, регулятор скорости — задание тока (момента), регулятор тока — напряжение на двигателе. Каждый внутренний контур упрощает объект для внешнего: при замкнутом контуре скорости регулятор положения видит не «разгоняющийся», а просто интегрирующий объект.

Каскад контуров привода: положение, скорость, токРегулятор положения сравнивает заданный угол θ* со счётчиком энкодера и выдаёт задание скорости ω*. Регулятор скорости сравнивает его со скоростью, вычисленной как приращение счётчика за период, и выдаёт задание тока i*. Регулятор тока по сигналу шунта задаёт напряжение моста. Внутренний контур тока самый быстрый, внешний контур положения самый медленный.θ*−ПИположениеω*−ПИскоростьi*−ПИтокUМостШИМДвигательЭнкодерток (шунт)Δ счёта / Tsскоростьположение (счётчик энкодера)самый быстрый контур
Каскад контуров сервопривода по разд. 31.2 Kuphaldt и рис. 11-6 SPRUHJ1: ток с шунта, скорость и положение со счётчика энкодера

Два правила каскада (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. Дальше по таблице:

РегуляторKpTiTd
П0,5 Ku——
ПИ0,45 KuPu / 1,2—
ПИД0,6 KuPu / 2Pu / 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Измерено, отсчётов/мсОшибка eP = 10 · eИнтеграторВыход
00505000 + 2 · 50 = 100600
1446460100 + 92 = 192652
2941410192 + 82 = 274684

Заторможенный вал. Пусть вал удержан 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.

Источники

  1. 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 МГц
  2. 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; настройка по записанным откликам
  3. 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 в коде
  4. 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 мкс
  5. 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
  6. 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 колебания должны ограничиваться самой системой, а не насыщением датчика или исполнительного элемента; при насыщении на пиках коэффициент уменьшают до симметричной синусоиды
  7. Texas Instruments. SPRABQ3: Sensorless Field Oriented Control of 3-Phase Permanent Magnet Synchronous Motors (July 2013) — разд. 9 — порядок отладки: контуры токов (уровень 3), затем замыкание контура скорости (уровень 5); выход регулятора скорости — задание тока Iq; ПИ-регуляторы с ограничениями выхода; прерывание 10 кГц

Нашли ошибку?