|
发表于 2015-11-4 15:51:21
|
显示全部楼层
这是我用的两个PID函数,和最终程序略有差异
- //位置式PID算法,用于温控
- void dopid_t(void)
- {
- static S16 err1,err2;//上次误差,上上次
- S32 err0,add;//本次误差
- S32 temp_s32;
- err0=Ts-Tr;
- add=(S32)Pid_p*(err0-err1)+(S32)Pid_i*err0+(S32)Pid_d*((err0-err1)-(err1-err2));
- err2=err1;
- err1=err0;//保存本次误差
- if(add>500*1000)add=500*1000;//增量限幅
- if(add<-500*1000)add=-500*1000;
- Iout=Iout+add;//改变输出,12位DAC控制电流
- //电流输出极限限幅
- if(Iout>4095*1000)Iout=4095*1000;//输出限幅
- if(Iout<-4095*1000)Iout=-4095*1000;
- }
- //增量式PID算法,用于四轴
- void DoPid_x(void)
- {
- static idata S16 temp_i;//积分
- idata S16 err0,err1;//本次误差、上次误差
- //static U8 n=0;//波形监测用
- err0=GADegYZ-set_x;//当前角度-设定角度
- //degv0=Mpu_Gx;//角速度可直接用陀螺仪数据
- err0=amplmt(err0,200);//防止数据太大而溢出
- temp_i=amplmt(temp_i+err0,KK*5);//积分限幅
- mot_dx=err0*Pidx_p+temp_i*Pidx_i+amplmt(err0-err1,500)*Pidx_d;
-
- mot_dx=amplmt(mot_dx,KK*15);//输出限幅
- }
- //--------------------------------------------------
- //限幅
- //--------------------------------------------------
- S16 amplmt(S16 v,S16 amp)
- {
- if(v>amp)v=amp;
- if(v<-amp)v=-amp;
- return v;
- }
复制代码
这里有个资料:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|