左移2位不是不对了 ?
大家好,我现在用 79F082的 ,用10位的 AD ,然后我想采样得到的结果先加起来,放在一起,然后多次采样求平均,不知道这样对不对?INT16U average ;
EA = 0;
EADC = 0;
ADCON &=0XBE; //ADCIF = go= 0
average = ADDL + ADDH<<2
if(++g == 4)
{
retuslt = average/4;
average = 0;
}
4次采样求平均,不知道对不对 ,感觉ADDH是8位,左移2位不是不对了 ?? 不推荐
为什么啊
当被测电压出现毛刺波动时,前后两次测量的结果会有较大波动。
有什么好的办法
冒泡排序、中间值取平均数法
采集一定次数的AD数据,比如说6次,将6次数据进行排序。
使用冒泡法进行排序,相邻的两个进行比较,第一轮是6与5、5与4、4与3、3与2、2与1,大的排在高位,小的在低位;经过第一轮后,虽然最大数无法求出,但是最小数已经得出。从第二轮开始,不需要将最小数加入比较,只需6与5、5与4、4与3、3与2即可,第二轮完成后可以得到第二小数。以此类推。。。。假设有X个数,需要比较X-1轮,每一轮比较的次数依次减少。
完成排序后,去除最大和最小数,再将中间数据相加再求平均值。
类堆栈法:此处说的堆栈,并非真的是使用堆栈来进行采样求值,而是说工作原理同堆栈类似。
此方法中,使用数组来存放采集的数据,我以6个数据为一个数组来说明。首次计算,先一次性采集一定次数的AD数据,每采集1个数据就移入数组,最早采集的数据位于数组底部,而最新采集到得数据位于数组顶部。采样6次后进行第一次求平均值,这样就完成了第一次的AD去抖求稳定值了。之后每次进行AD去抖求稳定值,只需要采集一次AD值,将前一次去抖求稳定值数组中最底层的数据推出,再将新采集得到的AD值移入数组并求平均值即可。 简单的说,就是第1次计算采集6次,第2次计算采集1次,第3次计算采集1次。。。。。。第N次计算采集1次。
写了个冒泡排序,不知道对不对?
void maopao(INT8U r[],n)
{
INT8U i,j;
INT8U temp;
for(i=1;i<n,i++)
{
j = 7;
for(j=j-i;j=0;j--)
{
if(r<r)
{
temp = r;
r = r;
r = temp;
}
}
}
}
对INT8U r的6个数据排序,正确吗 ?? 非常规做法啊。呵呵
average = ADDL + ADDH<<2
另外ADDH是8位的,左移2位 感觉不对 ??
adl=ADDL&0x03;
adh=ADDH*4;
adc_result1=(adh+adl); 这个,你在keil里面试试看就知道了。
我觉得不一定行。ADDH<<2好像会溢出的
结贴了,多谢大家讨论这么多哈,呵呵
页:
[1]