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

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

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

Неопределенная модель двигателя постоянного тока получена в примере «Robustness of Servo Controller for DC Motor». Передаточная функция от приложенного напряжения к скорости вращения задается как

$$P(s) = {K_m \over J L s^2 + (J R + L K_f) s + K_m K_b + R K_f}$$

где сопротивление, $R$индуктивность, $L$постоянная ЭДС, $K_b$постоянная якоря, $K_m$вязкое трение и $K_f$инерционная нагрузка являются$J$ физическими параметрами двигателя. Эти параметры не полностью известны и подвержены изменениям, поэтому мы моделируем их как неопределенные значения с заданной областью или процентной неопределенностью.

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

Похожие примеры

Подробнее о