% % Filename: example7.m % % Description: M-file to demonstrate discrete-time control of a DC motor. % clear; % clear matlab memory tmax = 0.20; % amount of time to run simulation T = 0.001; % sample interval Kp = 700; % proportional controller gain Kv = 0.4; % derivative controller gain Ki = 1000; % integral controller gain wd = 1.0; % desired angular velocity (krpm) eint = 0; % initialize error integral 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 wprev1 = 0; % w[1] = wdot(0)*T + w(0) wprev2 = 0; % w[0] = w(0) = 0 eprev1 = wd - wprev1; % initialize errors eprev2 = wd - wprev2; nTvec = [0 T]; wvec = [wprev2 wprev1]; % store ICs for plotting for n=2:tmax/T, eint = eint + eprev2*T; % sum (integrate) e eder = (eprev1 - eprev2)/T; % differentiate e using Euler approx. vaprev2 = Kp*eprev2 + Kv*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; eprev2 = eprev1; eprev1 = wd - wprev1; nTvec(n+1) = n*T; % store nT,w into vectors for plotting wvec(n+1) = w; end plot(nTvec, wvec, 'o'); grid; xlabel('time (sec)'); ylabel('angular velocity (krpm)'); ttle = ['Motor Step Response for Kp=', num2str(Kp), ', Kv=', num2str(Kv), ... ', Ki=', num2str(Ki)]; title(ttle);MATLAB Plots Generated: