AD采样数据运算处理
本帖最后由 wsm80828 于 2012-3-30 11:39 编辑z=ADC*5/1023/0.2982
这个算式如果用移位处理要怎么做呢?搞了半天没搞好,请教大家一下. 小数变成整数才好处理吧?你参考一下 程序匠人的移位法多字节乘法,除法,看合不合你用。你GOogle一下就行了,新论坛比较难上附件,再加上公司网的龟速 。。。。 可以考虑放大N倍,在把结果缩小N倍的方法试试。 本帖最后由 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: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 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:03 编辑
重新计算中…… 使用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);
==================================
以上是论坛牛人方法,不知用在这里合不合适? 顶一下,高手还没出现么? 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)”这一部分可以不要。 研究了下楼主给出来的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 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/ ...
不愧是高手,测试通过感谢! 这计算思维太妙,学习了 MARK 一下
页:
[1]