标题: MCU将8位AD采集到的值转换成实际值遇到的坑求解 [打印本页]

作者: sdarling    时间: 2021-3-31 04:19
标题: MCU将8位AD采集到的值转换成实际值遇到的坑求解
MCU AD采集到的值dat从二进制转换成10进制实际电压值输出中遇到了一些问题
采集到电压值dat区间在0-255之间,实际参考位5V,讲采集到的值做运算,输出实际电压值
1.unsigned char型的变量转换成int型,为什么需要乘一个1.0.
2.为什么我将*1.0的位置放在变量dat后边相乘和放在前边相乘得到的值是不一样的,放在前边相乘呢值才是正确的,放后边就一堆乱码.

IMG_20210331_040834.jpg (1.22 MB, 下载次数: 43)

IMG_20210331_040834.jpg

作者: sdarling    时间: 2021-3-31 04:26
我看别人的程序,这个1.0放在变量后边都没问题,编译器问题?看视屏里用的keil4,我用的keil5
作者: 张天师    时间: 2021-3-31 09:11
dat为0-255,那么500*dat最大值为127500。这里存在C语言运算类型转换原则,,500*1.0就转换为float运算,其类型是32位,500*1.0*dat其值不会溢出;而500*dat*1.0,就先以int类型运算再以浮点运算,而int运算时,有可能已经溢出了,结果就出错。所以运算的类型及前后顺序很重要,这就是稍不注意就出错的原因
作者: liujunping11    时间: 2021-3-31 13:21
如果dat值为255,则temp11为500,远远大于255,8位无法表示,所以乱码
作者: sdarling    时间: 2021-4-1 00:49
liujunping11 发表于 2021-3-31 13:21
如果dat值为255,则temp11为500,远远大于255,8位无法表示,所以乱码

temp是int型,而且你这里理解是错了,不管怎么算 temp都是要大于255的,我现在有问题的是这个运算顺序,1.0放在变量dat前边还是放在dat后边相乘,两个结果是不一样的
作者: sdarling    时间: 2021-4-1 00:51
张天师 发表于 2021-3-31 09:11
dat为0-255,那么500*dat最大值为127500。这里存在C语言运算类型转换原则,,500*1.0就转换为float运算,其 ...

为什么uchar型的dat和500先运算,是以int型输出而不是以char型吗,是因为前边变量temp的缘故?
作者: qinwf    时间: 2021-4-1 08:23
sdarling 发表于 2021-4-1 00:51
为什么uchar型的dat和500先运算,是以int型输出而不是以char型吗,是因为前边变量temp的缘故?

uchar型dat和500运算是int型,因为500是int型常量




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1