Clear Filters
Clear Filters

PID implementation using code

20 views (last 30 days)
Sanjeet Kulkarni
Sanjeet Kulkarni on 24 Nov 2022
Commented: Sanjeet Kulkarni on 28 Nov 2022
I have implemented a PID controller using simulink pid block for a system. I was trying to implement the same thing using a PID code (formula) in a matlab function block and compare the performances. However, I am getting differences in both the cases. Unable to figure out where exactly is the problem.
For simulink block I have implemented antiwindup, similarly I have done it in the code.
PID code as in the matlab function is as below:
function y = fcn(error,kp,ki)
dt = sampletime;
persistent integral newintegral
if isempty(integral)
integral = 0;
if isempty(newintegral)
newintegral = 0;
newintegral = integral + (error*dt);
output = kp*error + ki * integral;
if output>48000
elseif output<3000
output =3000;
integral = newintegral;
y = output;
Is there anything that I am implementing wrong in the code? Requesting some help/direction.
Thank you

Answers (1)

Sam Chak
Sam Chak on 25 Nov 2022
Wouldn't it be simpler if you obtain the signal directly from the Integrator block, and then feed it into the MATLAB function block? Something like this
function y = fcn(err, errint, Kp, Ki)
where err is the error signal and errint is the intergral of error signal.
Sam Chak
Sam Chak on 25 Nov 2022
Two questions.
Does your Anti-Windup involve some sort of integration but not the Integral action of the PID controller?
Is "integral" as a special variable or the built-in MATLAB integral function?
Sanjeet Kulkarni
Sanjeet Kulkarni on 28 Nov 2022
I have used the clamp method of antiwindup, where in the integral action should be clamped to the maximum and mininum limits of the actuator.
Have declared integral as a persistent variable (not the built in function).

Sign in to comment.




Community Treasure Hunt

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

Start Hunting!