An ideal PID is based on the sum of a proportional, integrative and derivative contribution.
Controller's transfer function
Furthermore, an ideal PD amplifies measurement noise, and thus might lead to large control signals that can drive the actuator into saturation or might even cause damage. Therefore, it is necessary to filter of the derivative action in the high-frequency by defining a factor N. It usually takes on a value between 5 and 20.
A Python implementation of a discrete-time PID is provided.
Use the package manager pip to install the discrete-time PID.
sudo pip install git+https://github.com/chentyra/Discrete-TimePID.git#egg=discretepid
If the Python package was helpful to you, please give this repository a star! ⭐
First of all, include the library:
from discretepid import PID
To create PID object, call class's constructor where:
- The first value is proportional gain
$K_P$ - The second value is integrative time constant
$T_I$ - The third value is derivative time constant
$T_D$ - The fourth value is factor
$N$ - The fifth value is setpoint or the value that the PID is trying to achieve
pid = PID(1, 0.1, 0.05, 2, setpoint=1)
With this definition, PID object uses a step change setpoint. The definition of an optional sixth parameter a ramp change setpoint is used by PID object.
- The
ramping_rate
variable defines the time interval in seconds of the ramp duration.
pid = PID(1, 0.1, 0.05, 2, setpoint=1, ramping_rate=1)
The PID compute a new output_value
, on the basis of an input_value
, calling the object created.
output_value= pid(input_value)
from discretepid import PID
pid = PID(0.2, 0.6, 0.02, 5, setpoint=1)
while True:
control = pid(v)
The controller setpoint can be changed dynamically:
pid.setpoint = 3
The ramp duration can be changed dynamically:
pid.ramping_rate = 1
and can be reset calling reset_ramping_rate
method:
pid.reset_ramping_rate()
Warning
Setting the ramping_rate variable to 0 is equivalent to using a step change setpoint.
Optionally, a sample_time
can be definied as last attribute of the instruction which represents the amount of time between one call to another of the updating method:
pid.sample_time= 0.01
To avoid integral windup and to limit output value, attribute output_limits
can be set:
pid.output_limits = (0, None) # Output will always be positive, but with no upper bound
In order to turn off PID controller, set attribute auto_mode
to False:
pid.auto_mode = False
In the same way, to turn on PID controller, set attribute auto_mode
to True:
pid.auto_mode = True
When controlling the system manually, it is useful to set the value of the integral term to the value indicated by the attribute last_output
:
pid.set_auto_mode(True, last_output=1)
The PID controller can be reset calling the reset
method.
pid.reset()
The value of
Kp, Ti, Td, N, setpoint, ramping_rate = pid.components
Their values can be changed individually or all at once(setpoint is optional) when the PID is running:
pid.Kp = 1.0
pid.tunings = (1.0, 0.3, 0.01, 10,2) #Kp,Ti,Td,N,setpoint
The examples
folder contains several simulations to help you understand how to use PID controller.
Licensed under the MIT