PID

A PID is a control algorithm that takes a desired end position for something (a motor for example) and determines the most efficent way to reach it from the current position. It stands for Proportional Integral Derivative.

The difference between the desired output value and the input value is the 'error'. The PID algorithm determines a factor to multiply the error, and adds it to the input. Over time this will act to reduce the error, bringing the output value to the input. The PID determines the multiplying factor by adding three terms.

Proportional: The proportional term equals some constant times the error. (Kp * Error)

Integral: The integral term adds the previous errors, then multiplies by a constant. (Ki * Integral of Error)

Derivative: This term is the derivative of the error multiplied by a constant. (Kd * dError / dt)

Total adjustment = Error * [ (Kp * Error) + (Ki * Integral of Error) +  (Kd * dError / dt)]

The links below explain mroe clearly why there is a need for three terms. In general, the proportional term causes overshoots in adjustment, the integral term prevents the adjustment from getting stuck (ie it may get stuck at a very low error, meaning d/dt is zero, and the proportional adjustment may not be able to overcome friction). The derivative adjustment simply means the input is adjusted more for large errors, and then the adjustment reduces as the error goes down.

Useful Links
http://www.mstarlabs.com/apeng/techniques/pidsoftw.html

http://www.freestudy.co.uk/plc/pid.pdf

http://en.wikipedia.org/wiki/PID_controller

http://en.wikipedia.org/wiki/Control_loop

Very good article explaining the theory behind a PID http://www.pacontrol.com/PID.html

Simple pseudocode for programming a PID
(From the wikipedia page)

Here is a simple software loop that implements the PID algorithm in its 'ideal, parallel' form:

previous_error = 0 integral = 0 start: error = setpoint - actual_position integral = integral + (error*dt) derivative = (error - previous_error)/dt output = (Kp*error) + (Ki*integral) + (Kd*derivative) previous_error = error wait(dt) goto start

Useful Links
http://www.mstarlabs.com/apeng/techniques/pidsoftw.html

Good article explaining PID basics, with good graphs http://www.freestudy.co.uk/plc/pid.pdf

http://en.wikipedia.org/wiki/PID_controller

http://en.wikipedia.org/wiki/Control_loop

Very good article explaining the theory behind a PID http://www.pacontrol.com/PID.html

http://www.flightgear.org/Docs/XMLAutopilot/node2.html