使用24位ADC差分测量多次,如何计算平均值

2019-12-16 22:37发布

24位ADC输出是2进制补码。当负端电平高于正端时,ADC输出的最高位是1,此时如何计算多次测量结果的平均值?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
66条回答
zouzhichao
1楼-- · 2019-12-17 08:34
gamalot 发表于 2016-1-31 23:23
或者先向左移8位,再除以256

这样不需要判断,看上去很有技巧的样子,逼格略高

int32_t code;
code = Adc_read_data();
code = (int32_t)(((uint32_t)code) << 8);
code >>= 8;
这里的移位需要用到强制转换或者使用union吧?
zouzhichao
2楼-- · 2019-12-17 13:51
gamalot 发表于 2016-1-31 23:37
你这个实际上就是最常用的方法,最简洁高效,缺点和就是更加不够直观

  ...

哈哈,习惯就好
gamalot
3楼-- · 2019-12-17 17:06
 精彩回答 2  元偷偷看……
gamalot
4楼-- · 2019-12-17 17:15
本帖最后由 gamalot 于 2016-2-1 00:08 编辑
zouzhichao 发表于 2016-1-31 23:40
int32_t code;
code = Adc_read_data();
code = (int32_t)(((uint32_t)code) >= 8;


不用阿,左移的时候,它其实就是个正数

而且,C语言左移一定是逻辑左移(如果俺没记错的话   )
zouzhichao
5楼-- · 2019-12-17 19:42
gamalot 发表于 2016-1-31 23:54
老糊涂了俺,看见你的语句最后有个1,就以为是最近本的负数补码转源码算法,取反加一

  ...

我就是把你的那个if化简了而已
(code & 0x800000)无非两个结果,0或者0x800000
0: code -= 0
0x800000: code -= 0x1000000

0 = 0 << 1;
0x1000000 = 0x800000 << 1;
化简就成了code -= (code & 0x800000) << 1;
gamalot
6楼-- · 2019-12-17 21:43
zouzhichao 发表于 2016-2-1 00:07
我就是把你的那个if化简了而已
(code & 0x800000)无非两个结果,0或者0x800000
0: code -= 0

是的,俺刚才没看的仔细,俺这里凌晨3点多了 ......

你这个很好,就是看起来不够直接而已

一周热门 更多>