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

2020-02-08 09:07发布

这是一个对电压的采集数据,里面还有许多涉及到的IO操作,用万用表测试5V电压很准,可是采集到的数据却又很大的波动
数据采集是有8通道,每次切换通道间隔60us,采用循环方式采集
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
yangzichen
1楼-- · 2020-02-08 13:25
补充下 我用16次采样,然后求平均,效果不好,求中位值效果也不好,最后一位跳动都在10mv,远远不能满足我的设计要求
JamesErik
2楼-- · 2020-02-08 16:08
看看我的帖子,很多高人指导。
yangzichen
3楼-- · 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
mored
4楼-- · 2020-02-08 22:19
 精彩回答 2  元偷偷看……
albert_w
5楼-- · 2020-02-09 00:57
mored 发表于 2012-7-23 15:58
硬件找原因吧,串1k并0.1u

是的, 万用表看到的是低频部分,也许高频有很多干扰,如果你有真有效值而且频率响应很宽的表,可以用交流测测看到底信号本身干净否
JamesErik
6楼-- · 2020-02-09 03:31
yangzichen 发表于 2012-7-23 15:49
正在看 ,但是对那段程序代码没有看明白,
软件滤波比较重要  曾经没软件滤波前AD跳动50个数 加滤波跳动5 ...

我不怎么上扣扣哈,那个滤波就是去掉最大最小值,然后求平均的。

一周热门 更多>