搜索
bottom↓
回复: 13

AD采样数据运算处理

[复制链接]

出0入0汤圆

发表于 2012-3-30 08:57:19 | 显示全部楼层 |阅读模式
本帖最后由 wsm80828 于 2012-3-30 11:39 编辑

z=ADC*5/1023/0.2982   
这个算式如果用移位处理要怎么做呢?搞了半天没搞好,请教大家一下.

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-3-30 10:02:59 | 显示全部楼层
小数变成整数才好处理吧?你参考一下 程序匠人的移位法多字节乘法,除法,看合不合你用。你GOogle一下就行了,新论坛比较难上附件,再加上公司网的龟速 。。。。

出0入0汤圆

发表于 2012-3-30 10:15:13 | 显示全部楼层
可以考虑放大N倍,在把结果缩小N倍的方法试试。

出0入42汤圆

发表于 2012-3-30 10:29:42 | 显示全部楼层
本帖最后由 jimmy_xt 于 2012-3-30 11:02 编辑

此楼计算有误~抱歉
----------------------------------------------------------------------------------------------------

z被我扩大了100倍,预计是10bitADC,也就是ADC是int类型
计算如下,误差没计算,但是肯定小于1%
  1. z=(ADC>>3)+((ADC*21)>>10);
复制代码
也就是,做了如下处理:

z值扩大100倍后=ADC×149.1/1024.
近似为=ADC×149/1024
考虑到149×1023会超出uint16类型上界,故拆分为ADC×128/1024+ADC×21/1024

(ADC>>3)+((ADC×21)>>10)

出0入0汤圆

 楼主| 发表于 2012-3-30 10:47:12 | 显示全部楼层
本帖最后由 wsm80828 于 2012-3-30 10:49 编辑
jimmy_xt 发表于 2012-3-30 10:29
z被我扩大了100倍,预计是10bitADC,也就是ADC是int类型
计算如下,误差没计算,但是肯定小于1%也就是,做 ...


这个算出来值不对    BAT_V=513
BAT_V=(BAT_V>>3)+((BAT_V*21)>>10)=74
应该是BAT_V=BAT_V*5/0.2982/1023=8.4

出0入42汤圆

发表于 2012-3-30 10:57:01 | 显示全部楼层
wsm80828 发表于 2012-3-30 10:47
这个算出来值不对    BAT_V=513
BAT_V=(BAT_V>>3)+((BAT_V*21)>>10)=74
应该是BAT_V=BAT_V*5/0.2982/10 ...

我想当然了……
稍等,我搞错除数与被除数了……

出0入42汤圆

发表于 2012-3-30 11:00:55 | 显示全部楼层
本帖最后由 jimmy_xt 于 2012-3-30 11:03 编辑

重新计算中……

出0入0汤圆

 楼主| 发表于 2012-3-30 11:41:10 | 显示全部楼层
使用5000/4096举个例子
使用方法:
5000/4096=0b1.001110001   
(使用PC中的计算器得到 5000=1001110001000B 除4096=移12位 = 1.001110001B)
小数后面移 3 4 5 9   (小数后面第3位,第4位,第5位,第9位是"1")
分别移了   3 1 1 4 位
倒序移位   4 1 1 3
因此:
  z = x + (x>>4);  //等效z=(x*5000ul)/4096;
  z = x + (z>>1);
  z = x + (z>>1);
  z = x + (z>>3);
==================================
以上是论坛牛人方法,不知用在这里合不合适?

出0入0汤圆

 楼主| 发表于 2012-3-31 21:33:16 | 显示全部楼层
顶一下,高手还没出现么?

出0入0汤圆

发表于 2012-3-31 22:16:34 | 显示全部楼层
z= ADC*5/1023/0.2982        //注意此处应为1024
= ADC*[(5/0.2982)/1024]
= ADC*[2*(5/0.2982)/2048]
= ADC*(10/0.2982) / 2048
= ADC*(32+2-1/2+1/32) / 2048
= [(ADC<<5)+(ADC<<1)-(ADC>>1)+(ADC>>5) + 1024] / 2048

加的那个1024是进行四舍五入处理;如果精度要求不高,“+(ADC>>5)”这一部分可以不要。

出0入0汤圆

发表于 2012-3-31 22:42:51 | 显示全部楼层
研究了下楼主给出来的0.2982这个数,发现其实是2.0/(2.0+4.7)。
所以其实公式应该是:
z= ADC/1024*5*(6.7/2)
  = (ADC*33.5)/2048
而33.5就等于32+2-0.5,所以就用如下公式就好:
z = [(ADC<<5)+(ADC<<1)-(ADC>>1) + 1024] / 2048

出0入0汤圆

 楼主| 发表于 2012-4-2 21:41:02 | 显示全部楼层
eduhf_123 发表于 2012-3-31 22:42
研究了下楼主给出来的0.2982这个数,发现其实是2.0/(2.0+4.7)。
所以其实公式应该是:
z= ADC/1024*5*(6.7/ ...

不愧是高手,测试通过感谢!

出0入4汤圆

发表于 2012-8-18 11:08:57 | 显示全部楼层
这计算思维太妙,学习了

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 04:12

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

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