Discrete PID controller simulation

14 views (last 30 days)
Stepan Podhorsky
Stepan Podhorsky on 11 Sep 2019
Commented: mustafa sgaban on 13 May 2022
Hello,
I have implemented a discrete PID controller in C language via the Simulink
S-function. Here is my C code which I have inserted into the text field in the
Outputs tab in the S-function Builder
double tmp; // temporary control value
double satU;
double dup; // increment of proportional part
double dui; // increment of integral part
double dud; // increment of derivative part
double du; // increment of control value
dup = Kp[0]*(xD[0] - xD[1]); // dup(k) = Kp*[e(k) - e(k-1)]
dui = (Kp[0]*T[0])/(2*Ti[0])*(xD[0] + xD[1]); // dui(k) = (Kp*T)/(2*Ti)*[e(k) + e(k-1)]
dud = (Kp[0]*Td[0])/T[0]*(xD[0] - 2*xD[1] + xD[2]); // dud(k) = (Kp*Td)/T*[e(k) - 2*e(k-1) + e(k-2)]
du = dup + dui + dud; // du(k)
tmp = xD[3] + du; // u(k) = u(k-1) + du(k)
// antiwind-up
if(tmp > Umax[0]){
satU = Umax[0];
}else if(tmp < Umin[0]){
satU = Umin[0];
}else{
satU = tmp;
}
y0[0] = satU;
Here is the C code which I have inserted into the text field in the
Discret Update tab in the S-function Builder
xD[0] = u0[0] - u1[0]; // e(k) = sp - cv
xD[2] = xD[1]; // e(k-2) = e(k-1)
xD[1] = xD[0]; // e(k-1) = e(k)
xD[3] = u2[0]; // bumpless transition: u(k-1) = tr
I have prepared following simulation for the testing purposes
Control_loop.JPG
i.e. controller controls FOPDT system with transfer function
and transport delay . Parameters of the
PID controller are set in following manner: .
It is worthwile to say that the control value of the PID controller
is saturated in range . I have chosen sampling period
in respect to the system time constant (the sampling period
is used by the PID algorithm and also by the ZOH blocks).
Simulation output (without switching between controller output and manually set
control value) is given below
Simulation_output.JPG
The controlled variable oscillates and I don't understand why. The same setting of
the controller behaves correctly in analog case with PID controller block from Simulink library.
I have tried smaler sampling period values but results are same. Can anybody give me an advice
what I am doing wrong?
  1 Comment
mustafa sgaban
mustafa sgaban on 13 May 2022
where you put the values of Kp, Ti,Td?
deosnt include in the code

Sign in to comment.

Answers (0)

Products


Release

R2015a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!