http://www.eeskill.com/article/id/58061
函 数 名:void Init_PID_uint(PID_uint *p)
功 能:初始化PID参数
说 明:调用本函数之前,应该先对Kp,Ti,Td做设置 ,简化了公式
入口参数:PID单元的参数结构体 地址
返 回 值:无
***********************************************************************/
void Init_PID_uint(PID_Uint *p)
{
p->k1=(p->Kp)+(p->Kp)*1024/(p->Ti)+(p->Kp)*(p->Td)/1024;
p->k2=(p->Kp)+2*(p->Kp)*(p->Td)/1024;
p->k3=(p->Kp)*(p->Td)/1024;
}
最后输出值为U_k,
U_k=(p->U_kk)+(p->k1)*ek-(p->k2)*(p->ekk)+(p->k3)*(p->ekkk);
链接在上,最后输出值是U_k ,U_k和k1,k2,k3相关,这里的k1,k2,k3 ,是怎么推导出来的?
我就是想问,k1,k2,k3这3个系数是如何推导出来的。上面的式子不明白是什么原理。
这三个系数应当是人工设置的“权重”,
最多就是做了些数学上的变换。
至于怎么设置,p、i、d的权重各设多少,
这是经验、对系统特性的了解,是程序和电路以外的内容了。
买本PID的书系统看一下,PID有很多种,看懂了自己都可以根据应用来改,这个没有一个定值。
你说的应该是Kp,Ti,Td 吧,这3个才是影响PID输出的系数,这里的k1,k2,k3应该是一个推导公式吧
PID_Uint
{
int U_kk;
int ekk;
int ekkk;
int Ur; //限幅输出值,需初始化
int Un; //不灵敏区
//int multiple; //PID系数的放大倍数,用整形数据的情况下,提高PID参数的设置精度 固定为256
int Kp; //比例,从小往大调
int Ti; //积分,从大往小调
int Td; //微分,用巡线板时设为0
int k1; //
int k2;
int k3;
};
一周热门 更多>