1.最速跟踪微分器TD
目的:比如位置控制时,使达到目标位置时,速度为0,无超调。
单片机里面用这种
fha或者fh函数第二种表达式为:
完整数学公式(看其他的教程都不完整)
理解的话
可以把
x1(t)看做当前位置
x2(t)看做当前速度
x1(k)第k步时的位置
x2(k)第k步时的速度
输出下一步的位置和速度
x1(k+1)下一步的位置
x2(k+1)下一步的速度
fh 计算出来的最优加速度
参数中:V(t)是目标值h、h0为积分步长,一般来说h可以等于h0,但是为了减少超调和减少震荡,才把他们分开,一般h0比h大,比如大20倍。当h0较大时,能够明显减少震荡,所以也叫滤波因子。减小h可以抑制噪声放大作用。r为速度因子,值越大,逼近速度越快,但是最好根据实际被控对象的可承受能力而定。
代码:
//ADRC最速跟踪微分器TD,改进的算法fhan
void Fhan_ADRC(Fhan_Data *fhan_Input,float expect_ADRC)//安排ADRC过度过程
{
float d=0,a0=0,y=0,a1=0,a2=0,a=0;
float x1_delta=0;//ADRC状态跟踪误差项
x1_delta=fhan_Input->x1-expect_ADRC;//用x1-v(k)替代x1得到离散更新公式
fhan_Input->h0=fhan_Input->N0*fhan_Input->h;//用h0替代h,解决最速跟踪微分器速度超调问题
d=fhan_Input->r*fhan_Input->h0*fhan_Input->h0;//d=rh^2;
a0=fhan_Input->h0*fhan_Input->x2;//a0=h*x2
y=x1_delta+a0;//y=x1+a0
a1=sqrt(d*(d+8*ABS(y)));//a1=sqrt(d*(d+8*ABS(y))])
a2=a0+Sign_ADRC(y)*(a1-d)/2;//a2=a0+sign(y)*(a1-d)/2;
a=(a0+y)*Fsg_ADRC(y,d)+a2*(1-Fsg_ADRC(y,d));
fhan_Input->fh=-fhan_Input->r*(a/d)*Fsg_ADRC(a,d)
-fhan_Input->r*Sign_ADRC(a)*(1-Fsg_ADRC(a,d));//得到最速微分加速度跟踪量
fhan_Input->x1+=fhan_Input->h*fhan_Input->x2;//跟新最速跟踪状态量x1
fhan_Input->x2+=fhan_Input->h*fhan_Input->fh;//跟新最速跟踪状态量微分x2
}