赞
踩
角度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;//否则积分不参与运算
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。