关于pid算法,如果实际应用?
以下代码为pid算法的位置式实现方式 ,
struct _pid{
float SetSpeed; //定义设定值
float ActualSpeed; //定义实际值
float err; //定义偏差值
float err_last; //定义上一个偏差值
float Kp,Ki,Kd; //定义比例、积分、微分系数
float voltage; //定义电压值(控制执行器的变量)
float integral; //定义积分值
}pid;
void PID_init(){
printf("PID_init begin \n");
pid.SetSpeed=0.0;
pid.ActualSpeed=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.voltage=0.0;
pid.integral=0.0;
pid.Kp=0.2;
pid.Ki=0.015;
pid.Kd=0.2;
printf("PID_init end \n");
}
float PID_realize(float speed){
pid.SetSpeed=speed;
pid.err=pid.SetSpeed-pid.ActualSpeed;
pid.integral+=pid.err;
pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pi
d.err_last);
pid.err_last=pid.err;
pid.ActualSpeed=pid.voltage*1.0;
return pid.ActualSpeed;
}
.假设一个系统(通过调解pwm占空比去控制mos管的电流,电流采样反馈再影响占空比)
1)在例子中,realize每次输入的值为200,相当于最终目的是200,那么 输出量的反馈,在哪反应出来?(也就是我的系统中,电流采样反馈这个量,pid的算法根本 也是按输出量,通过计算kp,ki,kd,根据这些改变输入量)
实际应用的时候,比如我要把某个物理量固定在2000,那么代入这个realize的值就是2000,那么,与反馈量无关?不需要?
2)pid.voltage是用于控制执行器的量,pid.actualspeed为返回值,它的得出与voltage有关.,在上面的系统里,这个actualspeed应该与占空比有关吧?相当于用这个返回值乘某个系数用于占空比的设置?这个输入的值,如果是固定的值,比如我想稳在2000
3)我的系统,通过mos管电压来控制id,应该不用考虑控制延时的问题吧?即这边调整了mos管的电压,一个周波后(用于计算反馈量所需要采样的时间),马上可以通过pid算法去计算,并反馈影响控制.