基于ADUC7060的常用数字滤波方法
0赞由于单片机执行速度和存储空间都很有限,而有些系统对实时性要求又较高,因此,采用以下几种简单有效的滤波方法可取得不错的效果。下面以导航系统中GPS传感器和MEMS陀螺为例,介绍在ADUC7060中实现滤波的程序。
1 .限幅滤波
以GPS传感器为例,由于导航电文数据每200ms更新一次,我们事先已经知道航模的爬升率(竖直方向速度)和最大水平航速,那么必然可以根据前一时刻的数据断定航模飞机当前时刻的高度上/下限和水平航速的上限。如果当前时刻的测量值超出限幅范围,则本次测量值无效,放弃本次值,用前一时刻值代替当前测量值 ,在ADUC7060单片机中用C语言实现如下 :
float max_Filter()
{
float new_value;
new_value = V_calculate();
if ( ( new_value - value > A ) || ( value - new_value > A )
return value;
else
return new_value;
}
2. 一阶滞后滤波
由于飞行器初始时刻的速度及高度等信息是确定和可信的,而随后时刻的数据必然会与初始时刻存在关联,所以可以通过引入一个滤波因子Factor,它代表了你对当前时刻数据的信任程度,一般在0和1之间取一个小数。下面是程序中使用的滤波C代码。
float delay_Filter(float Factor,float NowData,float PreData)
{
return Factor*PreData + (1-Factor) * NowData;
}
Factor的大小会影响滞后时间,显然Factor越小滞后越小,但滤波作用相对较弱。考虑到飞行器起飞时数据误差较大,而飞行一段时间后,达到一定高度就没有太多信号的反射,数据误差较小,可以设置Factor = k/2^k,每次更新一次数据k计数加1,这样做可以使滤波作用先强后弱,滞后时间先长后短,当接近目标时带来的滞后会很小,几乎可以忽略。
从本质上看,一阶滞后滤波属于数字信号处理中的IIR滤波。
3.中位值平均滤波
作为惯性技术新兴的重要研究领域,MEMS陀螺仪以其高性能、小尺寸、低能耗、重量轻、可靠性高等优点,获得了长足的发展,在低成本导航系统中获得了越来越广泛的应用。但目前硅微机械陀螺性能还比较低,表现为随机误差较大,易受环境影响等。
在实际应用中,MEMS陀螺仪的数据输出频率要大于系统对MEMS陀螺仪数据的使用频率,例如,我们使用的ADuC7060单片机AD采样速率可达1MSPS,而实际应用中使用频率只有200HZ,在每次使用陀螺仪数据的时间间隔内,MEMS陀螺仪实际上输出了多个数据,对数据进行实时滤波处理后再使用显然可以提高精度。先将每次使用陀螺仪数据的时间间隔内陀螺仪输出的数据进行实时中位值平均滤波处理,将去掉最大值和最小值后的均值作为使用值,可以显著抑制MEMS陀螺仪的随机误差。单片机C程序代码如下:
/*寻找具有奇数(odd)个数的采样序列的中位值*/
float Avg_MedianFilter(int n,int SortData[])
{
int i,j,k,sum;
for(i = 0;i< n;i++)
{
for(j = n-1;j > i;j--)
{
if(SortData[j] < SortData[j-1])
{
Swap(&SortData[j],&SortData[j-1]);
}
}
}
for(k=1;k<n-1;k++)
sum += SortData[k];
return (float)(sum/(n-2));
}
/*交换两个数的值*/
void Swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
