Свежие обсуждения
Микроконтроллеры

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

1 5

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

 

Можно плясать от общей формулы: Uy=Kp*x+Kд*dx/dt+Ki*integral(x,dt), где x=Uвых-Uoп — ошибка сигнала на выходе.

 

Uy - это все управляющее воздействие (в моем случае скважность) или изменение управляющего воздействия? Меня что-то смущает в этой формуле пропорциональная составляющая. Если записать пропорциональный регулятор как Uу=Kp*x, то выходит, что при нулевой ошибке у меня будет нулевой ШИМ, т. е. система заведомо неустойчивая. Может правильнее записать так:
ШИМ=ШИМ_предыдущий+Uу, где Uy=Kp*x+Kд*dx/dt+Ki*integral(x,dt) ?
Еще вопрос, как брать интеграл? Ну производную понятно как брать - из текущей ошибки вычитаю предыдущую и все, а вот интеграл? За несколько опросов АЦП или как? И за сколько опросов?

 

У меня сделанно так:
Power=(Tset-Tsr)*30.0 + Tset*0.85;
где: Tset - заданная температура (0...500.0); Tsr - текущая температура (после усреднения, 0...500.0); Power - регистр ШИМ (0...1024); 30.0, 0.85 - коэффициенты подбирались наугад.
При выходе на режим температура плавает на пару градусов, но мне этого достаточно.

 

Леха: то выходит, что при нулевой ошибке у меня будет нулевой ШИМ,
Это для случая поддержания нуля на выходе. А так надо ещё приплюсовать постоянное смещение к Uy.

Леха: Может правильнее записать так:
ШИМ=ШИМ_предыдущий+Uу, где Uy=Kp*x+Kд*dx/dt+Ki*integral(x,dt) ?

Так более правильнее: ШИМ=ШИМ_опорный+Uу, где ШИМ_опорный - значение ШИМ для получения на выходе Uоп в установившемся режиме при отсутствии возмущений.

Леха: Еще вопрос, как брать интеграл?

В простейшем случае это суммирование/вычитание с накоплением. Например, если ошибка >0 — делаем -1, если меньше 0 — делаем +1, если =0 не изменяем. Выполняем суммирование/вычитание один раз за период регулирования. Предусматриваем фиксацию значения в двух крайних положения, чтобы не было переполнения.

Сергей К: У меня сделанно так:
Power=(Tset-Tsr)*30.0 + Tset*0.85;

это пропорциональный регулятор.

 

Вариант ПИД паяльной станции, но на польском http://www.cyfronika.com.pl/kityavt2010/avt5228.pdf

 

Сергей К: У меня сделанно так:
Power=(Tset-Tsr)*30.0 + Tset*0.85;

Плавающая точка улыбнула))

Арс: Так более правильнее: ШИМ=ШИМ_опорный+Uу, где ШИМ_опорный - значение ШИМ для получения на выходе Uоп в установившемся режиме при отсутствии возмущений.
А мне кажется, что в качестве "опорного ШИМа" лучше использовать его предыдущее значение. Ведь опорный ШИМ не известен, кроме того, ток у меня не фиксированный, а может задаваться от 80 мА до 1,62 А. А используя предыдущее значение я постепенно получу тот самый "опорный ШИМ", когда у меня ошибка будет равна нулю.

Еще у меня такая проблема: ШИМ 8-битный, 1 разряд ШИМа = 24 мА, т. е. шаг регулирования тока 24 мА. АЦП 10-битный и 1 разряд тока = 3 мА. Ясно, что если его никак не обрезать, то регулятор никогда не будет устойчив и будет все время колебаться как минимум на +/- 24 мА. Значит коэффициенты дожны быть меньше 1. Так?

 

Леха: А мне кажется, что в качестве "опорного ШИМа" лучше использовать его предыдущее значение.
Это суррогатный интегратор получается При отдельной реализации ПИД не требуется складывать с предыдущим. Интегратор как раз и подтянет уровень до нужного в данный момент.

 

А где тогда взять это опорное значение? Не от балды же?
И вообще, если его нет, то смысл регулятора теряется. Он тогда превращается в стабилизатор нуля. Что-то я тут не пойму ничего...

 

Леха: А где тогда взять это опорное значение? Не от балды же?
Рассчитать по площади импульса.

Пример: Среднее значение сопротивления нагрузки 10 Ом, напряжение стабилизации 10В. Входное напряжение 15В. Сопротивление всей цепи прохождения тока 0.5 Ом. Т-период Шима. Длительность импульса ШИМ опорная будет равна: 10В/(15В -10В/10Ом*0.5Ом)*Т=10/14.5*Т=0.69*Т.