搜索
bottom↓
回复: 14

单片机AD采样请教

[复制链接]

出0入0汤圆

发表于 2015-12-4 09:16:40 | 显示全部楼层 |阅读模式
请教一下大家一个8位单片机采样,我用的单片机是12位AD,现在对AD采样,采样处理后转换出来的温度要精确到小数点后一位即转换出来是AA.X,      AA.X是处理好后看到的十进制温度值。因为12位AD中是分两个寄存器存放的,一个存放8位AD值,另一个存放4位AD值,现在我把8位AD值采样32次求得平均值用作AA,即整数部分显示,把另外4位用作.X显示,问题出来了,那4位转换成10进制数后跳动很很厉害,一时间显示个“0”,又一舜间显示个“9”或8 或其它数,请问大家有没有什么好的方法处理一下这个4位AD?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入8汤圆

发表于 2015-12-4 09:21:41 | 显示全部楼层
你那样做不对, 把12位全取出来,32次平均后再转为AA.x格式。

出0入4汤圆

发表于 2015-12-4 09:31:43 | 显示全部楼层
  1. unsigned int getad(void) {
  2.     unsigned int adres_ad0 = 0;
  3.     ADON = 1; //使能AD
  4.     NOP();
  5.     NOP();
  6.     NOP(); //采样电容充电
  7.     ADGO = 1; //开启AD
  8.     while (ADGO);
  9.     adres_ad0 = ADRESH; //00000000 00001111
  10.     adres_ad0 = adres_ad0 << 8 | ADRESL;
  11.     ADON = 0;
  12.     //if(adres_ad0>=2047)
  13.     //{return(4095);}                                //禁止AD转换
  14.     return (adres_ad0);
  15. }
复制代码

出0入0汤圆

 楼主| 发表于 2015-12-4 09:37:55 | 显示全部楼层
lw2012 发表于 2015-12-4 09:21
你那样做不对, 把12位全取出来,32次平均后再转为AA.x格式。

现在问题是取出来后,再平均,转换为AA.X,后面的那位X跳动得很严重

出0入0汤圆

 楼主| 发表于 2015-12-4 09:38:42 | 显示全部楼层

luybpotter ,能不能文字说明具体点

出0入8汤圆

发表于 2015-12-4 09:45:32 | 显示全部楼层
数据总线 发表于 2015-12-4 09:37
现在问题是取出来后,再平均,转换为AA.X,后面的那位X跳动得很严重

那就把平均次数加大,
单片机的速度比人的速度快的多,
要想稳定显示,简单的平均算法不是最好的。

出0入79汤圆

发表于 2015-12-4 09:52:36 | 显示全部楼层
12位 算不算什么高精度  一般单片机里面集成的ADC  INL 和 DNL 不超过 4LSB 。跳的 厉害 可能是你的 传感器 或硬件 问题  硬件问题解决了 再用软件滤波算法。。

出0入0汤圆

发表于 2015-12-4 10:29:46 | 显示全部楼层
如果跳的历害,有二种方法,一种是采用软件滤波看能不能做到,另一种是用12位进行采样后,降低精度(当然前提是降下来的精度是你产品能接受的)。还有一种,是在进行显示更新的时候,可以进行延时更新,在感观上是可以看到显示变化不那么历害的

出0入0汤圆

发表于 2015-12-4 10:31:20 | 显示全部楼层
BOERLBH 发表于 2015-12-4 09:52
12位 算不算什么高精度  一般单片机里面集成的ADC  INL 和 DNL 不超过 4LSB 。跳的 厉害 可能是你的 传感器 ...

太对了,何况跳动又怎么样,在误差范围内就可以了

出0入0汤圆

发表于 2015-12-4 11:09:27 | 显示全部楼层
我也遇到过同样的情况,由于中间太忙就没怎么弄,至今还未解决。不过当时试了坛里前辈们的一些办法,我用的是中值滤波,有所改善。

出0入0汤圆

发表于 2015-12-4 11:30:18 | 显示全部楼层
取十次,分别去掉最大值和最小值,再求平均值

出0入10汤圆

发表于 2015-12-4 12:02:04 来自手机 | 显示全部楼层
用什么显示的,显示刷新太快也会抖动,

出0入4汤圆

发表于 2015-12-4 14:10:50 | 显示全部楼层
数据总线 发表于 2015-12-4 09:38
luybpotter ,能不能文字说明具体点
  1. unsigned int getad(void) {
  2.     unsigned int adres_ad0 = 0;
  3.     ADON = 1; //使能AD
  4.     NOP();
  5.     NOP();
  6.     NOP(); //采样电容充电
  7.     ADGO = 1; //开启AD
  8.     while (ADGO);   //等待AD转换完成
  9.     adres_ad0 = ADRESH; //00000000 00001111  12位AD的高4位存到adres_ad0
  10.     adres_ad0 = adres_ad0 << 8 | ADRESL;    //取完整的12位结果
  11.     ADON = 0;//关AD
  12.     return (adres_ad0);//返回12位AD值
  13. }
复制代码

LZ取AD值有问题,要完整取出12位。
如果抖动厉害的话,可以加上软件滤波,如限幅平均值法

出0入0汤圆

发表于 2015-12-6 07:47:54 | 显示全部楼层
平均+递推滤波可以做到不跳

出0入0汤圆

发表于 2015-12-6 22:58:56 | 显示全部楼层
用软件滤波不错,可以百度一下10种经典的软件滤波算法。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-16 01:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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