#MPU6050之2阶低通滤波,滤波效果⾮常好
难忘的老师作文⾃从打算搞⽆⼈机之后,最终倒在了姿态的问题上,每次到了调参数PID,飞机都不稳。之后锁定了⼏个可能的因素,⼀是参数没做到最佳,⼆就是电机⾼转速下,6050受到震动的情况下,姿态乱了,导致PID⽆法做到最佳。
经过各种排查,试过各种减震,效果还是不明显,⽆意中接触了穿越机的F3飞控,经过实验,发现穿越机在没有做减震的情况下,输出的数据⾮常平滑,看了代码,6050输出的数据是要经过2阶低通滤波。经过移植到树莓派后,终于做到了⾼频震动下,6050 的输出在0.3的误差,⽽不是原先的5度左右的误差。感觉⾮常好。⽽且反馈的⾮常快,并没有滞后。金泰亨身高
这次代码⽐较多。感谢cleanflight,感谢正点原⼦@ALIENTEK,这个是对⽅开源的代码移植出来的。再次感谢。
//传感器对齐定义的机体坐标系的安装⽅向
#define ACCEL_ALIGN CW0_DEG
/*传感器对齐定义的机体坐标系的安装⽅向*/
#define GYRO_ALIGN CW0_DEG
/*低通滤波参数*/
#define GYRO_LPF_CUTOFF_FREQ 80.0f
#define XYZ_AXIS_COUNT 3
biquadFilter_t gyroFilterLPF[XYZ_AXIS_COUNT];//⼆阶低通滤波器
Axis3i16 gyroADCRaw;//陀螺仪原始AD数据 x,y,z
哪吒画Axis3i16 gyroADC;//校准的AD数据 x,y,z吃醋的好处
Axis3f gyrof;//转换单位为°/s的数据 x,y,z
//软件⼆阶低通滤波参数(单位Hz)
#define ACCEL_LPF_CUTOFF_FREQ 15.0f
biquadFilter_t accFilterLPF[XYZ_AXIS_COUNT];//⼆阶低通滤波器
Axis3i16 accADCRaw;//加速度原始AD数据,x,y,z
Axis3i16 accADC;//校准后的AD数据 x,y,z
Axis3f accf;//转换单位为G的数据 x,y,z
//初始化⼆阶低通滤波
for(int axis =0; axis <3; axis++)
{
biquadFilterInitLPF(&gyroFilterLPF[axis], gyroUpdateRate, GYRO_LPF_CUTOFF_FREQ);
}
鬼故事短篇
//初始化软件⼆阶低通滤波
for(int axis =0; axis <3; axis++)
{
biquadFilterInitLPF(&accFilterLPF[axis], accUpdateRate, ACCEL_LPF_CUTOFF_FREQ);
}
//这⾥⽤在循环读取传感器数据之后⽤,每次都进⾏滤波
//软件低通滤波
for(int axis =0; axis <3; axis++)
{
乡6accf.axis[axis]=biquadFilterApply(&accFilterLPF[axis], accf.axis[axis]);
}
//软件⼆阶低通滤波
for(int axis =0; axis <3; axis++)
飞机哪个位置比较好{
gyrof.axis[axis]=biquadFilterApply(&gyroFilterLPF[axis], gyrof.axis[axis]);
修篱种菊什么意思}
代码就是⼤概就这么多。⾃此,经过滤波后的数据,再进⾏PID输出的时候,已经感觉⾮常平稳,接下来就是要调节PID的参数,直到能平稳飞起来。需要代码可以私信联系。