Этот пример показов, как надежно настроить ПИД-регулятор для двигателя постоянного тока с несовершенно известными параметрами.
Неопределенная модель двигателя постоянного тока получена в примере «Robustness of Servo Controller for DC Motor». Передаточная функция от приложенного напряжения к скорости вращения задается как
где сопротивление, индуктивность, постоянная ЭДС, постоянная якоря, вязкое трение и инерционная нагрузка являются физическими параметрами двигателя. Эти параметры не полностью известны и подвержены изменениям, поэтому мы моделируем их как неопределенные значения с заданной областью или процентной неопределенностью.
R = ureal('R',2,'Percentage',40); L = ureal('L',0.5,'Percentage',40); K = ureal('K',0.015,'Range',[0.012 0.019]); Km = K; Kb = K; Kf = ureal('Kf',0.2,'Percentage',50); J = ureal('J',0.02,'Percentage',20); P = tf(Km,[J*L J*R+Kf*L Km*Kb+Kf*R]); P.InputName = 'Voltage'; P.OutputName = 'Speed';
Функции времени и частотной характеристики, такие как step
или bode
автоматическая выборка неопределенных параметров в их области значений. Это полезно для оценки влияния неопределенности. Для примера постройте график переходной характеристики неопределенного объекта P
и обратите внимание на большие изменения усиления постоянного тока объекта.
step(P,getNominal(P),3) legend('Sampled uncertainty','Nominal')
Чтобы надежно настроить ПИД-регулятор для этого двигателя постоянного тока, создайте настраиваемый блок ПИД C
и создайте модель с обратной связью CL0
цикла обратной связи на фигура. Добавьте точку анализа dLoad
на выходе объекта для измерения чувствительности к нарушению порядка нагрузки.
C = tunablePID('C','pid'); AP = AnalysisPoint('dLoad'); CL0 = feedback(AP*P*C,1); CL0.InputName = 'SpeedRef'; CL0.OutputName = 'Speed';
Фигура 1: Управление ПИД двигателя постоянного тока
Существует много способов задать желаемую эффективность. Здесь мы фокусируемся на чувствительности к нарушению порядка нагрузки, сходу и динамике замкнутой системы.
R1 = TuningGoal.Sensitivity('dLoad',tf([1.25 0],[1 2])); R2 = TuningGoal.MaxLoopGain('dLoad',10,1); R3 = TuningGoal.Poles('dLoad',0.1,0.7,25);
Первый гол R1
задает требуемый профиль для функции чувствительности. Чувствительность должна быть низкой при низкой частоте для хорошего подавления помех. Второй гол R2
накладывает -20 дБ/десятилетие схода за 10 рад/с. Третий гол R3
задает минимальное затухание, минимальное демпфирование и максимальную естественную частоту для полюсов с обратной связью.
viewGoal(R1)
viewGoal(R2)
viewGoal(R3)
Теперь можно использовать systune
для надежной настройки коэффициентов ПИД, то есть для достижения целей проекта для всех возможных значений неопределенных параметров двигателя постоянного тока. Поскольку локальные минимумы могут существовать, выполните три отдельные настройки из трех различных наборов начальных значений усиления.
opt = systuneOptions('RandomStart',2);
rng(0), [CL,fSoft] = systune(CL0,[R1 R2 R3],opt);
Nominal tuning: Design 1: Soft = 0.838, Hard = -Inf Design 2: Soft = 0.838, Hard = -Inf Design 3: Soft = 0.914, Hard = -Inf Robust tuning of Design 2: Soft: [0.838,2.01], Hard: [-Inf,-Inf], Iterations = 40 Soft: [0.875,1.76], Hard: [-Inf,-Inf], Iterations = 29 Soft: [0.935,2.77], Hard: [-Inf,-Inf], Iterations = 27 Soft: [1.35,1.35], Hard: [-Inf,-Inf], Iterations = 35 Final: Soft = 1.35, Hard = -Inf, Iterations = 131 Robust tuning of Design 1: Soft: [0.838,1.96], Hard: [-Inf,-Inf], Iterations = 65 Soft: [0.875,1.75], Hard: [-Inf,-Inf], Iterations = 30 Soft: [1.02,2.98], Hard: [-Inf,-Inf], Iterations = 34 Soft: [1.34,1.36], Hard: [-Inf,-Inf], Iterations = 32 Soft: [1.35,1.35], Hard: [-Inf,-Inf], Iterations = 20 Final: Soft = 1.35, Hard = -Inf, Iterations = 181 Robust tuning of Design 3: Soft: [0.914,2.35], Hard: [-Inf,-Inf], Iterations = 58 Soft: [0.998,2.83], Hard: [-Inf,-Inf], Iterations = 60 Soft: [0.948,2.32], Hard: [-Inf,-Inf], Iterations = 55 Soft: [1.32,1.41], Hard: [-Inf,-Inf], Iterations = 30 Soft: [1.35,1.35], Hard: [-Inf,-Inf], Iterations = 22 Final: Soft = 1.35, Hard = -Inf, Iterations = 225
Окончательное значение близко к 1, поэтому цели настройки почти достигнуты во всей области значений неопределенностей. Настроенный ПИД-регулятор
showTunable(CL)
C = 1 s Kp + Ki * --- + Kd * -------- s Tf*s+1 with Kp = 33.8, Ki = 83.2, Kd = 2.34, Tf = 0.028 Name: C Continuous-time PIDF controller in parallel form.
Затем проверьте, как этот ПИД отклоняет нарушение порядка шаговой нагрузки для 30 случайным образом выбранных значений неопределенных параметров.
S = getSensitivity(CL,'dLoad'); clf, step(usample(S,30),getNominal(S),3) title('Load disturbance rejection') legend('Sampled uncertainty','Nominal')
Эффективность отбраковки остается неизменной, несмотря на большие изменения объекта. Можно также проверить, что функция чувствительности надежно остается внутри предписанной границы.
viewGoal(R1,CL)
Устойчивая настройка с systune
легко. Просто включите неопределенность объекта в настраиваемую модель замкнутой системы с помощью ureal
объекты, и программное обеспечение автоматически пытается достичь целей настройки для всей области значений неопределенностей.