wsm80828 发表于 2012-3-30 08:57:19

AD采样数据运算处理

本帖最后由 wsm80828 于 2012-3-30 11:39 编辑

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

anvy178 发表于 2012-3-30 10:02:59

小数变成整数才好处理吧?你参考一下 程序匠人的移位法多字节乘法,除法,看合不合你用。你GOogle一下就行了,新论坛比较难上附件,再加上公司网的龟速 。。。。

stoneee 发表于 2012-3-30 10:15:13

可以考虑放大N倍,在把结果缩小N倍的方法试试。

jimmy_xt 发表于 2012-3-30 10:29:42

本帖最后由 jimmy_xt 于 2012-3-30 11:02 编辑

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

z被我扩大了100倍,预计是10bitADC,也就是ADC是int类型
计算如下,误差没计算,但是肯定小于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)

wsm80828 发表于 2012-3-30 10:47:12

本帖最后由 wsm80828 于 2012-3-30 10:49 编辑

jimmy_xt 发表于 2012-3-30 10:29 static/image/common/back.gif
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

jimmy_xt 发表于 2012-3-30 10:57:01

wsm80828 发表于 2012-3-30 10:47 static/image/common/back.gif
这个算出来值不对    BAT_V=513
BAT_V=(BAT_V>>3)+((BAT_V*21)>>10)=74
应该是BAT_V=BAT_V*5/0.2982/10 ...

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

jimmy_xt 发表于 2012-3-30 11:00:55

本帖最后由 jimmy_xt 于 2012-3-30 11:03 编辑

重新计算中……

wsm80828 发表于 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);
==================================
以上是论坛牛人方法,不知用在这里合不合适?

wsm80828 发表于 2012-3-31 21:33:16

顶一下,高手还没出现么?

eduhf_123 发表于 2012-3-31 22:16:34

z= ADC*5/1023/0.2982        //注意此处应为1024
= ADC*[(5/0.2982)/1024]
= ADC*
= 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)”这一部分可以不要。

eduhf_123 发表于 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

wsm80828 发表于 2012-4-2 21:41:02

eduhf_123 发表于 2012-3-31 22:42 static/image/common/back.gif
研究了下楼主给出来的0.2982这个数,发现其实是2.0/(2.0+4.7)。
所以其实公式应该是:
z= ADC/1024*5*(6.7/ ...

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

tarzar 发表于 2012-8-18 11:08:57

这计算思维太妙,学习了

hmg6681 发表于 2012-10-17 11:40:00

MARK 一下
页: [1]
查看完整版本: AD采样数据运算处理