有个AD数据画出来的图,大家帮我看看怎么滤波比较合适

2020-02-08 09:07发布

这是一个对电压的采集数据,里面还有许多涉及到的IO操作,用万用表测试5V电压很准,可是采集到的数据却又很大的波动
数据采集是有8通道,每次切换通道间隔60us,采用循环方式采集
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
yangzichen
2020-02-08 17:42
JamesErik 发表于 2012-7-23 14:46
看看我的帖子,很多高人指导。

正在看 ,但是对那段程序代码没有看明白,
软件滤波比较重要  曾经没软件滤波前AD跳动50个数 加滤波跳动5个数
int filter(unsigned char channel)
{
        unsigned char i;
        unsigned int idata adc_value[8];        //AD转换缓冲区        
     unsigned int adc_value_ave=0;
        unsigned int max_value=0,min_value=0,max_index=1,min_index=1;

           for (i=0;i<8;i++) //连续转换8次
        {
            adc_value = get_AD_result(channel); //将单次ADC转换结果放入缓冲区         
         //   delay(10);        //每次转换延迟时间
        }
                for(i=1;i<8;i++) // 去掉第一次测量值
                {
                        adc_value_ave+=adc_value;        
                }
                adc_value_ave/=7; // 去掉一个值外的平均值                                                                           
                for(i=1;i<8;i++) // 计算最大值和最小值索引号 排序
                { //排序 最大值第1位(1) 最小值最后1位(i)
                        if(adc_value>adc_value_ave)//大于平均值
                        {                                                  
                                if((adc_value-adc_value_ave)>max_value)                                                                                 
                                {                                 
                                        max_value=adc_value;
                                        max_index=1;
                                }
                        }               
                        else  //小于平均值
                        {
                                if((adc_value_ave-adc_value)>min_value)
                                {
                                        min_value=adc_value_ave-adc_value;
                                        min_index=i;
                                }
                        }
                }
                adc_value_ave=0;        
                for(i=1;i<8;i++) // 计算去掉最大值和最小值后的总和
                {
                        if((i!=max_index)&&(i!=min_index))//去掉最大值和最小值
                        {
                                adc_value_ave+=adc_value;        
                        }
                }
                if(max_index!=min_index) // 如果测量值不同
                {
                        adc_value_ave/=5; // 计算平均值
                }
                else        // 如果测量值相同
                {
                        adc_value_ave/=6; // 计算平均值
                }
        
                return adc_value_ave;

}         
你能加个QQ私聊吗  305834138

一周热门 更多>