本帖最后由 victor3l 于 2012-6-30 08:07 编辑
匠人的书109页和114页的滤波程序是不是印刷错误啊在传参时没有给参数类型,这是不对的啊。匠人程序如下
#define N 12
unsigned char Data[];
unsigned char GlideAVerageValue(Data[])
{
unsigned char i;
unsigned char Value;
unsigned short Sum;
Sum = 0;
Data[N]=GetAD();
for(i = 0;i < N; i++)
{
Data = Data[i+1];
Sum +=Data;
}
Value = Sum/N;
return Value;
}
其实下面的这个程序和这个没有本质区别
ulong FilterDatChannel1(ulong temp)
{
uchar i;
static xdata ulong datBuf[8] = {0};
static uchar datCount;
xdata ulong sum = 0;
datBuf[datCount] = temp;
for(i = 0; i< 8; i++)
sum += datBuf;
sum = (ulong)(sum >> 3);//求均值
datCount++;
if(datCount == 8)
datCount = 0;
return sum;
}
匠人程序是从数组最高位开始更新队列,而这个程序是从数组最低位更新队列。
问题是:我用下面这个程序时,最终的显示能够很好的反应传感器的变化,用匠人的滤波后有数据但是数据不动了,不知为什么?
另外,我觉得匠人的这个程序可以改成unsigned char filter(uchar Data[],uchar temp)
参数Data为要处理的数据开辟队列,temp为要处理的数据。我现在要用这个函数来处理6路AD的数据,不知道可不可以?
我原来写的函数没有单独给数据开辟队列函数原型是ulong filter(ulong temp),一个一个用的时候没有entire当我算总重时,就出错了,别人说是交叉调用导致错误,要我为每个AD写个滤波函数,其实就是把函数名字改下了,内容没变。问题解决了,但是感觉程序太冗余,现在想用一个函数,在外部开辟6个队列来存数据,应该没问题吧?
谁有动态调整滤波系数的一阶滤波程序,让我参考下。 |