Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Реализация ПИД-регулятора #12

Closed
6 tasks done
kalaider opened this issue Mar 15, 2017 · 4 comments
Closed
6 tasks done

Реализация ПИД-регулятора #12

kalaider opened this issue Mar 15, 2017 · 4 comments
Assignees

Comments

@kalaider
Copy link
Member

kalaider commented Mar 15, 2017

Данные

ПИД-регулятор, Пропорциональный интегрально-дифференцирующий регулятор -- один из простейших статических регуляторов с обратной связью.

Его простейшая форма -- ПИ-регулятор -- представляется уравнением регулятора:

u[n+1] = K_p e[n] + K_p K_i T sum_(m=(n-M)..n) e[m]

где u[n+1] -- вычисленная величина следующего управляющего сигнала, e[n] -- текущая статическая ошибка регулирования, определяемая как разность e[n] = f[n] - f[n-1], f[n] -- обратная связь -- текущее значение управляемой величины, M -- "размер" памяти системы.

Коэффициенты K_p и K_i, а также M -- параметры ПИ-регулятора. В сумме они задают степень "инертности" регулятора, т.е. направленность регулирования в сторону большей чувствительности к мгновенным изменениям значения управляемой величины или в сторону большей чувствительности к общей тенденции изменения величины.

(За уточнением формулы и ее трактовки следует обратиться к ТАУ.)

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

При реализации алгоритма следует помнить о разрядности int, равной 16, а не 32 бит. Соответственно, диапазон значений int в ATmega8A есть -32768..0..+32767, что есть крайне мало. Для того, чтобы не наступило переполнение типа при суммировании, требуется ограничится достаточно малым M и достаточно малыми K_p, K_i.

Также следует понимать, что допускается понижение точности данных с 10-разрядного АЦП с целью увеличения возможного качества регулирования путем отбрасывания нескольких младших из 10 значимых разрядов получаемого кода (побитовый сдвиг вправо на s+1, что эквивалентно делению на 2^s).

Задача

Реализовать алгоритм ПИ-регулирования:

  • Инициализация работы АЦП
  • Чтение очередного отсчета сигнала с АЦП
  • Вычисление очередного отсчета регулирующего сигнала
  • Пересылка его в блок выработки ШИМ в требуемом масштабе ( Реализация мезанизма управления ШИМ #11 )
  • Отладочный вывод текущего отсчета сигналов, ошибки регулирования, а также нового отсчета регулирующего сигнала в соответствии с выработанным протоколом передачи данных ( Реализация обмена информацией по USART #10 )
  • Применение введенных коэффициентов регулятора к расчетам, а также отладочный вывод сигнала об их успешном получении и применении ( Реализация обмена информацией по USART #10 )
@kalaider
Copy link
Member Author

Дополнение к задаче

Установлены предварительные требования к целочисленным вычислениям формулы ПИД-регулятора.

  1. Все масштабные коэффициенты и параметры ПИД-регулятора целесообразно задавать в виде степени двойки. Тогда не потребуется применение математического умножения или деления. Эти операции заменятся левым и правым сдвигами.
  2. При снятии показаний 10-разрядного АЦП использовать левое выравнивание данных с целью вычитывания 8-битного значения из старшего регистра данных.
  3. Полученные 8-битные значения складываются с учетом M -- размера "памяти" ПИД-регулятора. При M = 2^7 = 128 даже при условии, что все складываемые значения -- 0xff = 2^8 - 1 = 255, переполнения int не наступит. В реальности же складываться будут не максимальные значения. Более того, среди значений будут как положительные, так и отрицательные.
  4. Значение регулирующего напряжения (16 бит) нужно отмасштабировать таким образом, чтобы оно уместилось в регистр OCR2 модуля генерации ШИМ.

Пример анализа формулы ПИД-регулятора

Обозначения

u[n+1] = K_p e[n] + K_p K_i T sum_(m=(n-M)..n) e[m] -- сама формула. Коэффициент K_p K_i T можно без потери общности заменить на просто K_i.

Пользуясь пунктом 0, введем обозначения: K_p = 2^kp, K_i = 2^ki, где kp, ki -- целые числа со знаком. Тогда операции умножения на, например, K_p в формуле заменятся на << kp, а деления (kp < 0) -- на >> (-kp). Без потери общности можно писать просто <<kp, понимая под <<kp, kp < 0 инструкцию >> (-kp).

Перепишем формулу ПИД-регулятора:

u[n+1] = ( e[n] << kp ) + ( { sum_(m=(n-M)..n) e[m] } << ki )

При вводе u в регистр OCR2 потребуется произвести еще одно масштабирование:

OCR2 = u[n+1] << ks

Представляя M = 2^km, получим полный набор величин, характеризующих ПИД-регулятор: kp, ki, km>0, ks.

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

Анализ

Пусть km = 7. Поскольку e[n] -- 8-битные, то их максимальное значение не превышает 2^8. Значит сумма из M = 2^km = 2^7 = 128 элементов не будет превышать 2^7 * 2^8 = 2^15. Разрядность int -- 16 бит. Даже с учетом того, что первый бит отводится под знак числа, переполнения не случится. Коэффициент K_i = 2^kp может быть использован для возвращения суммы в диапазон 8 бит (ki = -7) или другой требуемый диапазон (0 > ki > -7).

С первым членом суммы ситуация аналогична.

Разрядность числа u будет зависеть от ki и kp. Можно добиться приемлемой точности без использования ks. Однако не всегда.

Не стоит забывать, что чаще всего (при более или менее стабильном режиме работы) величины e[n] не должны сильно приближаться к максимальному значению. Потому коэффициенты регулирования придется подбирать "по обстановке" при тестировании приложения в боевых условиях.

@kalaider kalaider self-assigned this Mar 20, 2017
@kalaider
Copy link
Member Author

#20 -- реализовано.

@kalaider
Copy link
Member Author

Концепция ПИД-регуляции была понята неверно. "Память" регулятора бесконечно велика.

К реализации

@kalaider kalaider reopened this Mar 21, 2017
@kalaider
Copy link
Member Author

kalaider commented Mar 25, 2017

0cfd1ee исправляет проблему.

Память теперь понимается бесконечной.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants