%
% Filename: example6m
%
% Description: M-file to demonstrate digital PID control of a geared
% DC motor.
%
figure(1) % put plot in figure 1
clf; % clear figure & memory
clear;
tmax = 0.3; % amount of time to run simulation
T = 0.001; % sample interval
Kp = 2000; % proportional controller gain
Kd = 0.0; % derivative controller gain
Ki = 0.0; % integral controller gain
wd = 0.18; % desired angular velocity (krpm)
eint = 0; % initialize error integral to zero
eprev1 = 0; % initialize past values of error
eprev2 = 0; % to zero
KT = 4.07; % motor torque constant
L = 0.00156; % motor inductance
J = 2.0; % motor rotor & load inertia
R = 1.89; % motor resistance
B = 13.0; % motor/gear/bearing friction
Kb = 3.01; % motor back emf constant
N = 6/1; % gear ratio
wprev1 = 0; % w[1] = w(0) = 0
wprev2 = 0; % w[0] = wdot(0)*T + w(0)
woprev1 = wprev1/N; % initial values for output
woprev2 = wprev2/N; % shaft speed
for n=2:tmax/T,
eprev2 = (wd - woprev2); % define errors
eprev1 = (wd - woprev1);
eint = eint + (eprev1 + eprev2)*T/2; % integrate e using trapezoidal rule
eder = (eprev1 - eprev2)/T; % differentiate e using Euler approx.
vaprev2 = Kp*eprev2 + Kd*eder + Ki*eint; % compute input voltage
w = (2-(R*J+B*L)*T/(L*J))*wprev1 + ...
((R*J+B*L)*T/(L*J) - 1 - (B*R+KT*Kb)*T*T/(L*J))*wprev2 + ...
KT*T*T/(L*J)*vaprev2; % DC motor difference eqn
wprev2 = wprev1; % store values for next iteration
wprev1 = w;
wo = w/N; % convert motor speed to output shaft
woprev2 = woprev1; % speed using gear ratio
woprev1 = wo;
nTvec(n-1) = n*T; % store nT,wo into vectors for plotting
wovec(n-1) = wo;
end
nTvec = [0*T 1*T nTvec]; % put IC's into nT,w vectors
wovec = [0 0 wovec];
plot(nTvec, wovec, 'o')
grid;
xlabel('time (sec)');
ylabel('angular velocity (krpm)');
ttle = ['Motor Step Response for Kp=', num2str(Kp), ', Kd=', num2str(Kd), ...
', Ki=', num2str(Ki)];
title(ttle);
MATLAB Plots Generated from Three Separate Runs: