Настройка ПИД-регулятора по частотной характеристике для физической модели Engee
Модель понижающего преобразователя
В модели представлен понижающий DC–DC-преобразователь. Импульсный преобразователь преобразует постоянное напряжение 30 В в регулируемое постоянное напряжение. В модели преобразователя используются MOSFET-транзисторы, управляемые ШИМ-сигналом, поэтому такую модель нельзя напрямую линеаризовать стандартным методом.
В этом примере рассматривается управление понижающим преобразователем с помощью ПИД-регулятора. Коэффициенты ПИД-регулятора будут рассчитаны с помощью приложения Настройка ПИД-регулятора по частотной характеристике.
Запуск модели:
engee.addpath(@__DIR__)
if "pidtune_physmod" in [m.name for m in engee.get_all_models()]
m = engee.open( "pidtune_physmod" ) # загрузка модели
else
m = engee.load( "pidtune_physmod.engee" )
end
engee.set_param!("pidtune_physmod/Feedback Controller/PID Controller", "P"=>"1.0", "I"=>"1.0", "D"=>"0.0", "N"=>"100.0")
results1 = engee.run(m, verbose=true)
Заданное напряжение изменяется с 15 до 25 В в момент времени 0,004 с.
t = results1["Output voltage"].time;
output_voltage = results1["Output voltage"].value;
сontrol_signal = results1["Control signal"].value;
reference_voltage = results1["Reference voltage"].value;
plot(layout=@layout([a; b; с]), legend=:outertopright)
plot!(t, output_voltage, subplot=1, ylabel="Напряжение, В", w = 2, label="Выходное напряжение", linecolor =:blue)
plot!(t, reference_voltage, subplot=2, ylabel="Напряжение, В", w = 2, label="Опорное напряжение", linecolor =:red)
plot!(t, сontrol_signal, subplot=3, xlabel="Время, c", ylabel="Коэф заполнения", w = 2, label="Сигнал управления", linecolor =:green)
Ток нагрузки действует с 0,0025 до 0,005 с. При исходных коэффициентах регулятора переходный процесс имеет заметное перерегулирование и большое время установления. Необходимо улучшить полосу пропускания и запас по фазе системы для повышения ее быстродействия.
cyclic_load_current = results1["Cyclic load current"].value;
supply_current = results1["Supply current"].value;
plot(layout=@layout([a; b]), legend=:outertopright)
plot!(t, cyclic_load_current, subplot=1, ylabel="Ток, А", w = 2, label="Дополнительный ток нагрузки", linecolor =:blue)
plot!(t, supply_current, subplot=2, xlabel="Время, c", ylabel="Ток, А", w = 2, label="Ток источника питания", linecolor =:green)
При настройке регулятора необходимо учитывать следующие особенности модели:
- отсутствие шума;
- выход регулятора задает коэффициент заполнения ШИМ;
- сигнал ШИМ ограничен диапазоном от 0 до 1;
- номинальное значение сигнала управления в установившемся режиме составляет 0.5.
Для понижающего преобразователя желательно обеспечить малое время нарастания и небольшое перерегулирование. Целевое время нарастания в этом примере равно 250 мкс, а перерегулирование должно быть меньше 10%.
Настройка ПИД-регулятора
ПИД-регулятор, который необходимо настроить, находится в подсистеме Feedback Controller. Откройте настройки блока ПИД-регулятор и нажмите кнопку Настроить. Через некоторое время откроется приложение Настройка ПИД-регулятора по частотной характеристике. При открытии приложение получает параметры блока: тип ПИД-регулятора (P, I, PI, PID и т. д.), форма ПИД-регулятора (параллельный, идеальный), период дискретизации, а также методы интегрирования и фильтрации производной, если применимо.
Приложение автоматически настраивает ПИД-регулятор по результатам двух симуляций. Во время первой симуляции вычисляется базовый отклик системы. Во время второй симуляции контур размыкается на входе объекта управления. К объекту прикладываются синусоидальные воздействия и ступенчатое воздействие. Затем приложение вычисляет разность откликов, полученных в двух симуляциях. Это позволяет исключить влияние возмущений, действующих в модели. Полученные данные используются для оценки частотной характеристики объекта управления, по которой рассчитываются коэффициенты ПИД-регулятора.
Настройка эксперимента
.png)
Желаемая частота среза:
Целевая частота среза приближенно оценивается как . Желаемому времени нарастания 250 мкс соответствует полоса пропускания около 8000 рад/с.
Желаемый запас по фазе
Запас по фазе 60° обычно соответствует перерегулированию около 10% или меньше.
Начало эксперимента
Возмущение следует подавать после завершения начального переходного процесса. В этой модели он заканчивается примерно к моменту 0.002 с, поэтому примем это значение за время начала эксперимента.
Длительность эксперимента
Длительность эксперимента можно оценить как 100/ωc, поэтому длительность эксперимента равна 0.0125 с.
Амплитуды синусоидального и ступенчатого сигналов
Тюнер подает синусоидальные воздействия на частотах [1/3, 1, 3, 10]ωc. Амплитуды синусоидальных и ступенчатого воздействий равны 0.1. При номинальном значении сигнала управления 0.5 такие воздействия не выводят его за допустимый диапазон.
После заполнения полей с настройками эксперимента нажмите Настроить, чтобы запустить две симуляции модели и рассчитать параметры ПИД-регулятора.
По завершении настройки в окне приложения в разделе Результаты отображаются настроенные коэффициенты усиления и расчетный запас по фазе. Проверьте, что рассчитанный запас по фазе близок к Желаемому запасу по фазе.
Проверка настроенного регулятора
Нажмите кнопку Обновить блок, чтобы записать настроенные коэффициенты в блок ПИД-регулятора, а затем выполните расположенные ниже ячейки, чтобы изучить поведение системы после настройки ПИД-регулятора.
.png)
results2 = engee.run(m, verbose=true)
t = results2["Output voltage"].time;
output_voltage = results2["Output voltage"].value;
сontrol_signal = results2["Control signal"].value;
reference_voltage = results2["Reference voltage"].value;
plot(layout=@layout([a; b; с]), legend=:outertopright)
plot!(t, output_voltage, subplot=1, ylabel="Напряжение, В", w = 2, label="Выходное напряжение", linecolor =:blue)
plot!(t, reference_voltage, subplot=2, ylabel="Напряжение, В", w = 2, label="Опорное напряжение", linecolor =:red)
plot!(t, сontrol_signal, subplot=3, xlabel="Время, c", ylabel="Коэф заполнения", w = 2, label="Сигнал управления", linecolor =:green)
cyclic_load_current = results2["Cyclic load current"].value;
supply_current = results2["Supply current"].value;
plot(layout=@layout([a; b]), legend=:outertopright)
plot!(t, cyclic_load_current, subplot=1, ylabel="Ток, А", w = 2, label="Ток циклической нагрузки", linecolor =:blue)
plot!(t, supply_current, subplot=2, xlabel="Время, c", ylabel="Ток, А", w = 2, label="Ток питания", linecolor =:green)