角度pid控制模块中函数:static void PID_Postion_Cal(PID_Typedef * PID,float target,float measure,int32_t dertT),为PID自整定函数:
首先初始化临时变量
float termI=0; //积分临时变量
float dt= dertT/1000000.0; //两次间隔时间换算成秒
然后做常规的PID运算计算:公式是:PID:比例环节+积分环节+微分环节。PID控制的所有环节都是对误差进行运算的,参数是根据实际情况自行调节。积分运算是误差乘以dt,微分运算是误差的变化除以dt(即当前误差值减去上一拍的误差值),乘积运算是误差乘以比例参数。PID的各个环控制的功能不同,比例运算是对系统做大角度调整。积分运算是做细调,微分运算是制动。因此调参时要根据具体情况对不同参数进行调整。
//误差=期望值-测量值
PID->Error=target-measure; //期望误差减去测量误差
PID->Deriv= (PID->Error-PID->PreError)/dt; //进行微分运算
PID->Output=(PID->P * PID->Error) + (PID->I * PID->Integ) + (PID->D * PID->Deriv); //PID:比例环节+积分环节+微分环节
PID->PreError=PID->Error; //当前误差付给上次误差 为做微分运算做准备
//仅用于角度环和角速度环的
由于对细节调节用到的积分较多,但这里是串行控制的外环控制,主要做大调解,因此不太需要用到积分。只有在着陆时候用到,而且还有对它进行一下限制,限制的范围根据不同飞机,实际做调整。这里主要用到的是微分和比例环。
if(FLY_ENABLE && offLandFlag) { //在使能或者是着陆模式时进行积分运算
if(fabs(PID->Output) < Thro ) //比油门还大时不积分
{
termI=(PID->Integ) + (PID->Error) * dt; //积分环节
if(termI > - PID->iLimit && termI < PID->iLimit && PID->Output > - PID->iLimit && PID->Output < PID->iLimit) //在-300~300时才进行积分环节
PID->Integ=termI;
}
} else {
PID->Integ= 0;//否则积分不参与运算
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)