Академический Документы
Профессиональный Документы
Культура Документы
REPORT VERIFICATION
Date:
Instructor Name:
Signature:
1- Aim:
IN LAB TASK:
MATLAB representation
1. Transfer Function
We can represent the above open-loop transfer function of the motor in MATLAB by
defining the parameters and transfer function as follows. Running this code in the
command window produces the output shown below.
J = 3.2284E-6;
b = 3.5077E-6;
K = 0.0274;
R = 4;
L = 2.75E-6;
s = tf('s');
P_motor = K/(s*((J*s+b)*(L*s+R)+K^2))
RESULT:
P_motor =
0.0274
-------------------------------------------
2. State Space
We can also represent the system using the state-space equations. The following additional
MATLAB commands create a state-space model of the motor and produce the output shown
below when run in the MATLAB command window.
A = [0 1 0
0 -b/J K/J
0 -K/L -R/L];
B = [0 ; 0 ; 1/L];
C = [1 0 0];
D=[0];
motor_ss = ss(A,B,C,D)
RESULT:
motor_ss =
a=
x1 x2 x3
x1 0 1 0
x2 0 -1.087 8487
x3 0 -9964 -1.455e+06
b=
u1
x1 0
x2 0
x3 3.636e+05
c=
x1 x2 x3
y1 1 0 0
d=
u1
y1 0
System Analysis:
From the main problem, the dynamic equations in the Laplace domain and the open-loop transfer
function of the DC Motor are the following.
For the original problem setup and the derivation of the above equations, please refer to the DC
Motor Position: System Modeling page.
For a 1-radian step reference, the design criteria are given are the following.
J = 3.2284E-6;
b = 3.5077E-6;
K = 0.0274;
R = 4;
L = 2.75E-6;
P_motor = K/(s*((J*s+b)*(L*s+R)+K^2));
t = 0:0.001:0.2;
step(P_motor,t)
RESULT:
Step Response
7
5
Amplitude
0
0 0.05 0.1 0.15 0.2
Time (seconds)
From the above plot, we can see that when 1 volt is applied to the system the motor position
grows unbounded. This is obviously at odds with the given requirements, in particular, that there
be no steady-state error. The open-loop response of the system is not even stable. Stability of a
system can be verified with the MATLAB command isstable where a returned value of TRUE
(1) indicates that the system is stable and a returned value of FALSE (0) indicates that the system
is not stable
isstable(P_motor)
RESULT:
ans =
Stability of the system can also be determined from the poles of the transfer function where the
poles can be identified using the MATLAB command pole as shown below.
pole(P_motor)
RESULT:
ans =
1.0e+06 *
-1.4545
-0.0001
Closed-Loop Response
Let's now consider the closed-loop response of the system where the system schematic has the
following structure.
The closed-loop transfer function for the above with the controller C(s) simply set equal to 1 can
be generated using the MATLAB command feedback as shown below.
sys_cl = feedback(P_motor,1)
RESULT:
sys_cl =
0.0274
----------------------------------------------------
Step Response
1.4
1.2
1
Amplitude
0.8
0.6
0.4
0.2
0
0 0.05 0.1 0.15 0.2
Time (seconds)
pzmap(sys_cl)
RESULT:
Pole-Zero Map
40
30
20
)
-1
10
Imaginary Axis (seconds
-10
-20
-30
-40
-15 -10 -5 0
-1 5
Real Axis (seconds ) x 10
damp(sys_cl)
RESULT:
(rad/seconds) (seconds)
RESULT:
Mp =
0.0716
Ts =
0.1351
Proportional ControL:
Let's first try using a proportional controller with gain ranging from 1 to 21. An array of LTI
models, each with a different proportional gain, can be built using a for loop. The closed-loop
transfer functions can be generated using the feedback command. Add the following code to the
end of your m-file and run it in the MATLAB command window:
Kp = 1;
for i = 1:3
M(:,:,i) = pid(Kp);
Kp = Kp + 10;
end
sys_cl = feedback(M*P_motor,1);
t = 0:0.001:0.2;
step(sys_cl(:,:,1),'r', sys_cl(:,:,2),'b', sys_cl(:,:,3),'m', t)
ylabel('Position, \theta (radians)')
title('Response to a Step Reference with Different Values of K_p')
legend('Kp = 1', 'Kp = 11', 'Kp = 21')
RESULT:
Response to a Step Disturbance with Different Values of K p
1.4
Kp = 1
1.2 Kp = 11
Kp = 21
1
Position, (radians)
0.8
0.6
0.4
0.2
0
0 0.05 0.1 0.15 0.2
Time (seconds)
Kp = 21;
Ki = 100;
for i = 1:5
M(:,:,i) = pid(Kp,Ki);
Ki = Ki + 200;
end
sys_cl = feedback(M*P_motor,1);
t = 0:0.001:0.4;
step(sys_cl(:,:,1), sys_cl(:,:,2), sys_cl(:,:,3), t)
ylabel('Position, \theta (radians)')
title('Response to a Step Reference with K_p = 21 and Different Values of
K_i')
legend('Ki = 100', 'Ki = 300', 'Ki = 500')
RESULT:
Response to a Step Reference with K p = 21 and Different Values of Ki
1.8
Ki = 100
1.6 Ki = 300
Ki = 500
1.4
Position, (radians)
1.2
0.8
0.6
0.4
0.2
0
0 0.1 0.2 0.3 0.4
Time (seconds)
%distrubances
dist_cl = feedback(P_motor,M);
step(dist_cl(:,:,1), dist_cl(:,:,2), dist_cl(:,:,3), t)
ylabel('Position, \theta (radians)')
title('Response to a Step Disturbance with K_p = 21 and Different Values of
K_i')
legend('Ki = 100', 'Ki = 300', 'Ki = 500')
RESULT:
Response to a Step Disturbance with K p = 21 and Different Values of K i
0.08
Ki = 100
0.07 Ki = 300
Ki = 500
0.06
Position, (radians)
0.05
0.04
0.03
0.02
0.01
-0.01
0 0.1 0.2 0.3 0.4
Time (seconds)
PID control
%PID
Kp = 21;
Ki = 500;
Kd = 0.05;
for i = 1:3
M(:,:,i) = pid(Kp,Ki,Kd);
Kd = Kd + 0.1;
end
sys_cl = feedback(M*P_motor,1);
t = 0:0.001:0.1;
step(sys_cl(:,:,1), sys_cl(:,:,2), sys_cl(:,:,3), t)
ylabel('Position, \theta (radians)')
title('Step Response with K_p = 21, K_i = 500 and Different Values of K_d')
legend('Kd = 0.05', 'Kd = 0.15', 'Kd = 0.25')
RESULT:
Step Response with K p = 21, K i = 500 and Different Values of K d
1.4
Kd = 0.05
1.2 Kd = 0.15
Kd = 0.25
1
Position, (radians)
0.8
0.6
0.4
0.2
0
0 0.02 0.04 0.06 0.08 0.1
Time (seconds)
%distrubcances
dist_cl = feedback(P_motor,M);
t = 0:0.001:0.2;
step(dist_cl(:,:,1), dist_cl(:,:,2), dist_cl(:,:,3), t)
ylabel('Position, \theta (radians)')
title('Step Response with K_p = 21, K_i = 500 and Different values of K_d')
legend('Kd = 0.05', 'Kd = 0.15', 'Kd = 0.25')
RESULT:
Step Response with K p = 21, Ki = 500 and Different values of K d
0.06
Kd = 0.05
0.05 Kd = 0.15
Kd = 0.25
0.04
Position, (radians)
0.03
0.02
0.01
-0.01
0 0.05 0.1 0.15 0.2
Time (seconds)
%to determine the precise characteristics of the step response you can use the
right-click menu of the step response plot
%or you can use the MATLAB command stepinfo as shown below.
stepinfo(sys_cl(:,:,2))
ans =
RiseTime: 0.0046
SettlingTime: 0.0338
SettlingMin: 0.9103
SettlingMax: 1.1212
Overshoot: 12.1175
Undershoot: 0
Peak: 1.1212
PeakTime: 0.0122
From the above, we see that the response to a step reference has a settling time of roughly 34ms
(< 40 ms), overshoot of 12% (< 16%), and no steady-state error. Additionally, the step
disturbance response also has no steady-state error. So now we know that if we use a PID
controller with
= 21, = 500, and = 0.15,
all of our design requirements will be satisfied.