eCircuit Center 

About SPICE 
SPICE Basics  Running SPICE
 CIRCUIT COLLECTION 
SPICE Commands  SPICE Demos and Downloads 
PID ControllerCIRCUIT
PID1.CIR Download the SPICE file Tuning the PID controller can be like learning to roller blade, ski or maybe riding a bull. Until you've done it a few times, the literature you've read really doesn't hit home. But after after few attempts (and falls), you find it wasn't so bad after all  in fact it was kind of fun! The PID controller is every where  temperature, motion, flow controllers  and its available in analog and digital forms. Why use it? It helps get your output (velocity, temperature, position) where you want it, in a short time, with minimal overshoot, and with little error. In many applications the PID controller can do the job  but as usual, with compromises. After a short intro to the PID terms and an example control system, you'll get a chance tune a PID controller.
THE PID CONTROLLER You've probably seen the terms defined before: P Proportional, I  Integral, D  Derivative. These terms describe three basic mathematical functions applied to the error signal , Verror = Vset  Vsensor. This error represents the difference between where you want to go (Vset), and where you're actually at (Vsensor). The controller performs the PID mathematical functions on the error and applies the their sum to a process (motor, heater, etc.) So simple, yet so powerful! If tuned correctly, the signal Vsensor should move closer to Vset. Tuning a system means adjusting three multipliers Kp, Ki and Kd adding in various amounts of these functions to get the system to behave the way you want. The table below summarizes the PID terms and their effect on a control system.
THE CONTROL SYSTEM The SPICE circuit for the Control System looks pretty much like the block diagram.
TUNING THE PID CONTROLLER Although you'll find many methods and theories on tuning a PID, here's a straight forward approach to get you up and soloing quickly.
HANDSON DESIGN Run a simulation of the circuit file PID1.CIR. VSET generates a 10V step input voltage to the control system. You can adjust the PID terms at the EPID source that adds the P, I and D terms at V(3), V(4) and V(5). Initially, the PID multipliers are set to KP=1, KI=0 and KD=0.
SET KP. Plot the system input V(1) and the sensor output (12). Although the response looks smooth, what is the sensor voltage compared to the desired 10V? The output falls short by 5V! To reduce this error, increase KP to 10 (Change EPID to look like ... 10 0 0 ). Wow, the output now reaches 9V, reducing the error to 1V. But as you can see, the output is getting wild with overshoot and ringing. Push KP up higher to 20 or 30. Yes, the error reduces, but the overshoot gets worse. Eventually, your system will become unstable and break out into song (oscillate). Back off KP to 20 or so. SET KD. The derivative term can rescue the response by counteracting the KP drive
when the output is changing. Start with a small value like KD=0.2 and
rerun the simulation (Change EPID to look like
... SET KI. With KP=20, KI=0 and KD=0.5 the response looks respectable, but the final error is a disappointing 0.5V (or 5%)! Now, try the KI term. This will integrate the remaining error into a drive signal big enough to reduce the error further. Start with KI = 10 ( EPID should look like ... 20 10 0.5 ). Check out the last half of the V(12)  the sensor output moves slowly toward 10V! You might want to put up a cursor on the plot to monitor the exact value of V(12). The bigger you make KI, the faster it will move toward 10V. Like the other terms, a value is reached where the KI does more harm than good as the system becomes less stable.
DIVING DEEPER Diving a little deeper you can get a clearer view of the PID components. Before we go beneath the surface, set KP=10, KI=0 and KD=0. INSIDE P Run a couple of simulations with KP=10 and KP 20. Plot V(1) and V(12). What is the final error for each case? You may have noticed the errors of 1 and 0.5V are proportional to the gains of 10 and 20. You can estimate the error by Verror ≈ Vset / KP for large KP. What kind of gain do you need for a 1% error? You can easily calculate it as a gain of 100. However, we've already seen how large gain cause overshoot, ringing and oscillations! KP can't do it alone. INSIDE D KD counteracts KP  let's see how. Set KP back to 10 and run a simulation. Plot the P function V(3) which is really Verror. Now plot the D term V(5) which we know is dVerror / dt. To get a good view of D, set the YAxis limits to +100 /200V. Notice how dVerror / dt swings negative when Verror is initially positive. How does this help? Essentially D counteracts the P term potentially reducing ringing and oscillations. The nice thing about the D term is that it goes to zero as the output settles. This makes sense  no change in output, no derivative term. Add in some of the D function by setting the multipliers to KP=10, KI=0 and KD=0.5. The initial overshoot should be significantly reduced. INSIDE I We've seen how a large gain produces a small error. However, big KP gets you into big trouble with overshoot and ringing. Alternatively, an integrator can also give you a big gain by accumulating even a small error over time. Run a simulation with KP=10, KI=0 and KD=0.5 and plot the I term at V(4). What does it look like? Notice, a ramp function, representing Verror integrated over over time, builds up to a significant drive voltage. Add in the I function by setting KP=10, KI=40 and KD=0.5. The I term completes the controller's job by moving the output toward an error of zero.
SIMULATION NOTE Need a handy way to combine multiple signals such as the PID sum? A controlled source can be a function of multiple inputs described by a polynomial. What is this polynomial? The equation is defined by a coefficient list at the end of the statement. The example below
creates a polynomial of the form
or more generally,
In fact, you can get higher order terms and cross terms by extending the coefficient list
If you're not using a term, you need to put a 0 in its place; you can't just leave it out. This feature is great for simpler polynomials. Keeping track of the coefficient list for large polynomials can get crazy fast.
SPICE FILE Download the file or copy this netlist into a text file with the *.cir extention. PID1.CIR  THE PID CONTROLLER * * SET POINT VSET 1 0 PWL(0MS 0MV 1MS 10V 2000MS 10V) RSET 1 0 1MEG * * CALCULATE ERROR EERROR 2 0 1 12 1 RERROR 2 0 1MEG * * P  PROPORTIONAL TERM EP 3 0 2 0 1 RP 3 0 1MEG * * I  INTEGRAL TERM GI 0 4 2 0 1 C1 4 0 1 R1 4 0 1MEG * * D  DERIVATIVE TERM GD 0 5 2 0 1 L1 5 0 1 * * ADD PID TERMS, ADJUST PID MULTIPLIERS EPID 6 0 POLY(3) (3,0) (4,0) (5,0) 0 1 0 0 RPID 6 0 1MEG * * AMPLIFIER EAMP 7 0 6 0 1 RAMP 7 0 1MEG * * PROCESS BLOCK WITH TIME LAG (PHASE SHIFT) EOUT 8 0 7 0 100 RP1 8 9 100K CP1 9 0 1UF RP2 9 10 100K CP2 10 0 1UF * * SENSOR BLOCK WITH TIME LAG ESENSOR 11 0 10 0 0.01 RP3 11 12 10K CP3 12 0 1UF * * ANALYSIS .TRAN 10MS 2000MS * * VIEW RESULTS .PRINT TRAN V(1) V(12) .PROBE .END
© 2002 eCircuit Center 
