找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3493|回复: 6
收起左侧

用单片机+NTC采集温度,显示时会有1℃左右的上下抖动,该如何滤波处理?

[复制链接]
ID:975927 发表于 2021-12-18 14:00 | 显示全部楼层 |阅读模式
本人采取了中位值平均滤波和算数平均滤波后再取滤完的值进行二次递推平均滤波处理,抖动现象出现频率确实大大减小,不过还是偶尔会出现,还请各位大佬推荐几种更加优化的算法(ps:听说滞回比较算法效果很好,想请教一下该怎么写。)
以下是我采取的算法,有什么不足也可以指出。

单片机源程序如下:
                if(ad_flag)
                {
                        ad_flag=0;
                        
                        //算术平均滤波
                        advalue_t=getADCValueOnce(INPUT_NTC);
                        adsum_t += advalue_t;
                        adcount_t++;
                        if(adcount_t>=16)
                        {
                                adcount_t=0;
                                val_t=adsum_t>>4;
                                adsum_t=0;
                                //temperature = NTCADBinarySearch(val_t);
                                
                                //递推平均滤波法(二阶)
//        adcount++;
//                                if(adcount<5)
//                                {
//                                        value_buf[3]=val_t;
//                                        value_buf[2]=value_buf[3];
//                                        value_buf[1]=value_buf[2];
//                                        value_buf[0]=value_buf[1];
//                                }
//                                if(adcount==5)
//                                {
//                                        adcount=0;
//                                        for(j=0;j<4;j++)
//                            {
//                                    adsum+=value_buf[j];
//                            }
//                            advalue=adsum/4;
//                                  adsum=0;               
//                                  temperature = NTCADBinarySearch(advalue);
//                                }




                        }
                }
                        
                        //中位值平均滤波法,相比较算数平均滤波法,显示的振荡现象基本不会发生,但仍偶尔出现
//                        value_buf[adcount_t] = getADCValueOnce(INPUT_NTC);
//                        adcount_t++;
//                        if(adcount_t>=16)
//                        {
//                                adcount_t=0;
//                                for (j=0;j<15;j++)  
//        {  
//          for (i=0;i<15-j;i++)  
//          {  
//              if ( value_buf[i ]>value_buf[i+1] )  
//              {  
//                   adtemp_t = value_buf[ i];  
//                   value_buf[i ] = value_buf[i+1];  
//                   value_buf[i+1] = adtemp_t;  
//              }  
//          }
//                          }
//                          for(m=1;m<15;m++)  
//                          {
//                                   adsum_t += value_buf[m];
//                          }
//                                val_t=adsum_t/14;
//                          adsum_t=0;
//                                temperature = NTCADBinarySearch(val_t);                          
//                        }
//                }
                display(temperature,1);
回复

使用道具 举报

ID:94031 发表于 2021-12-18 15:09 | 显示全部楼层
滤波算法和你拿温度来干什么有关,光显示稳些好,如果用来控制,滞后不能太大,滤波要求不一样。
回复

使用道具 举报

ID:401564 发表于 2021-12-18 15:19 | 显示全部楼层
如果是12位的ADC,算法不重要的,130次累加,去掉最大和最小值,基本就差不多了,再用复杂的算法,效果也是一样的
如果是10位的ADC,对于NTC来说,正负1摄氏度的误差是正常的,测量温度越高,误差越大,你非得要它平稳,说白了就是显示上的好看而已,误差依然存在
ADC模块本身的误差,加上电源波动和分压电阻的误差,这几个加一块,1摄氏度的跳动是正常的,那些所谓的0.0几的温度是分辨率而已,不是精度
回复

使用道具 举报

ID:883242 发表于 2021-12-18 15:24 | 显示全部楼层
显示分辨率只有1℃,那么就应该抖,比如算出来温度在24.499℃和24.500℃之间,那么显示24℃和25℃之间来回抖动那就是合情合理的,正常的现象。

真要是强迫症,一定看不得抖动,加滞回好了,比如从24.0℃上升到24.6℃显示才会从24℃变成25℃,而从24.6℃下降到24.4℃温度才会从25℃变成24℃。
回复

使用道具 举报

ID:935267 发表于 2021-12-18 16:14 | 显示全部楼层
沙发大侠说得对,深有同感。
回复

使用道具 举报

ID:262 发表于 2021-12-18 17:03 | 显示全部楼层
这个应该是要做产品,楼主是希望显示稳定,毕竟用户他不懂分辨率滤波这些,如果显示不稳定用户会觉得产品有问题
回复

使用道具 举报

ID:213173 发表于 2021-12-18 18:51 | 显示全部楼层
不必在软件滤波和电源精度上下太大功夫。硬件滤波是必须要有的。采样速度、采样时间、采样次数以及显示刷新频率都会影响数据稳定。如果测温范围宽,NTC分压电阻取值也要斟酌。给你一个实例参考。 -30~150度数码管温度计(对分查表法).zip (31.27 KB, 下载次数: 99)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表