打印

ADC转换滤波的烦恼

[复制链接]
1126|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiashengcheng|  楼主 | 2018-3-25 22:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void ADC_DCV_filter(void)
{       
#define N 5
char filter();
{
char count,i,j;
char value_buf[N];
        int sum=0;
        for(count=0;count<N;count++)
        {
        value_buf[count]=ADC2_Get_AdcValue(5);
//        delay();
        }
for(j=0;j<N-1;j++)
        {
        for(i=0;i<N-j;i++)
                {
                if(value_buf[i]>value_buf[i+1])
                {char temp;
                temp = value_buf[i];
                value_buf[i] = value_buf[i+1];
                value_buf[i+1] = temp;
                }
                }
        }
        for(count=1;count<N-1;count++)
        sum += value_buf[count];
        data_in_DCV =(sum/(N-2));
}       


ADC转换出来不滤波每次的结果都在1700-1900之间,这也算正常,
可是只要加上这个滤波,结果有时候会变成个位数,,,,,不知道何因,


难道是数据溢出了?

相关帖子

沙发
苏山人家| | 2018-3-25 22:39 | 只看该作者
本帖最后由 苏山人家 于 2018-3-25 22:45 编辑

不知道你想干啥,看上面像是排序,给你一个例子,也不用排序直接求和计算就好。
另外猜测问题是char溢出,你说每次获取都是1700-1900 可是value_buf类型是char
uint32_t fun(void)
{
   uint32_t sum = 0;
   uint32_t i = 0;   uint32_t tmp = 0;
   uint32_t max = 0;
   uint32_t min = UINT32_MAX;
#define N     5

   for(i=0; i < N;i ++)
  {
    tmp=ADC2_Get_AdcValue(5);
   //delay()
   if(tmp > max)max = tmp;
   if(tmp < min)min = tmp;
   sum += tmp;
  }
  sum  = sum - max;
  sum  = sum - min;
  return (sum / (N - 2));
}

使用特权

评论回复
板凳
xiashengcheng|  楼主 | 2018-3-26 21:34 | 只看该作者
本帖最后由 xiashengcheng 于 2018-3-26 21:41 编辑
苏山人家 发表于 2018-3-25 22:39
不知道你想干啥,看上面像是排序,给你一个例子,也不用排序直接求和计算就好。
另外猜测问题是char溢出,你说 ...

可以是可以了,估计是我硬件电路没有做好吧,波动还是有,滤波没有什么效果。还是要感谢您。。。

使用特权

评论回复
地板
linqing171| | 2018-3-26 23:11 | 只看该作者
value_buf[count]=ADC2_Get_AdcValue(5);    ====》 value_buf[i]=ADC2_Get_AdcValue(5);

这么一堆char,unsigned char最大才255
还有才滤波5次,太少了。

不过问题的重点应该还是电路有问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

107

帖子

1

粉丝