Устойчивая настройка контроллера двигателя постоянного тока

Этот пример показывает, как надежно настроить ПИД-регулятор для двигателя постоянного тока с недостаточно хорошо известными параметрами.

Моделирование двигателя постоянного тока

Неопределенная модель двигателя постоянного тока выведена в "Робастности Контроллера Сервомотора для двигателя постоянного тока" пример. Передаточной функцией от приложенного напряжения до угловой скорости дают

где сопротивление, индуктивность, постоянный EMF, арматура постоянное, вязкое трение и инерционная загрузка являются физическими параметрами двигателя. Эти параметры не отлично известны и подвергаются изменению, таким образом, мы моделируем их как неопределенные значения с заданной областью значений или неуверенностью процента.

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 и отметьте большое изменение в усилении DC объекта.

step(P,getNominal(P),3)
legend('Sampled uncertainty','Nominal')

Устойчивая настройка ПИДа

Чтобы надежно настроить ПИД-регулятор для этого двигателя постоянного тока, создайте настраиваемый блок PID C и создайте модель CL0 с обратной связью обратной связи в рисунке 1. Добавьте, что анализ указывает 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 1:
Soft: [0.838,2.02], Hard: [-Inf,-Inf], Iterations = 74
Soft: [0.875,1.76], Hard: [-Inf,-Inf], Iterations = 29
Soft: [1.02,2.98], Hard: [-Inf,-Inf], Iterations = 31
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 = 186

Robust tuning of Design 2:
Soft: [0.838,2.08], Hard: [-Inf,-Inf], Iterations = 40
Soft: [0.875,1.76], Hard: [-Inf,-Inf], Iterations = 28
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 = 130

Robust tuning of Design 3:
Soft: [0.914,2.38], Hard: [-Inf,-Inf], Iterations = 50
Soft: [1.01,3.32], Hard: [-Inf,-Inf], Iterations = 27
Soft: [0.948,2.32], Hard: [-Inf,-Inf], Iterations = 107
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 = 236

Окончательное значение близко к 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, и программное обеспечение автоматически пытается достигнуть настраивающихся целей для целой области значений неуверенности.

Связанные примеры

Больше о