你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8做多路AD采样数值打印出错

[复制链接]
ST社区自助问题 提问时间:2017-5-21 10:28 /
用STM8作多路AD采样,单次逐个采样,直接用串口打印转换出来的ADC_DRH,ADC_DRL 是对的,但把这两个值赋给变量后,再打印这个变量,数值就变啦,不知是什么原因


QQ图片20170521102754.png
收藏 评论2 发布时间:2017-5-21 10:28

举报

2个回答
逍遥李 回答时间:2017-5-24 11:02:50
看描述是第八位和高八位转换成uint16时候出问题了,看不到你怎么转换的
zhuoyemp4 回答时间:2017-5-24 15:53:51
应该是数据类型转换造成的错误,以下内容希望能帮到你。
1、有符号数机器表示
以16位有符号数为例:
对于正数,非常简单,最高位为0,其余15位表示数值就可以了,比如0110 1110 0101 1110即0x6e5e,表示+28254;
对于负数,稍微有点麻烦,以-4为例,首先计算4的二进制补码,即0000 0000 0000 0100按位取反再加1,即1111 1111 1111 1100,也即0xFFFC。再举个例子,以-1589为例,首先计算1589的二进制补码,即0000 0110 0011 0101按位取反再加1,即1111 1001 1100 1011,也即0xF9CB。
那么,在有符号数和无符号数之间进行转换时就要注意这一点,如下所示:
int a=-1589;
unsigned int b;
b=a;
那么b是多少呢?肯定不是1589,而是63947。
2、浮点数表示
无论是单精度还是双精度,都有三个部分:
1》符号位;
2》指数位;
3》尾数位;
float遵从IEEE R32.24,double 遵从IEEE R64.53。在几乎所有的8位单片机里,float和double的长度一样,都是IEEE R32.24。
float存储方式如下(高位在前,低位在后):
符号(1位)| 指数(8位)| 尾数(23位)
double存储方式如下(高位在前,低位在后):
符号(1位)| 指数(11位)| 尾数(52位)

将一个float数转换成内存存储格式步骤:
以3.25为例,将3.25化成二进制,即11.01,用科学计数法表示,则为1.101*2^1,符号位是0,指数是1,尾数是101;但指数位还要进一步计算,需要用127加上刚才算得的指数1,即128(二进制表示1000 0000),
这样3.25的机器存储格式为:(符号位0)(指数1000 0000)(尾数101 0000 0000 0000 0000 0000),即0x40500000。

再比如10.5,将10.5化成二进制,即1010.1,用科学计数法表示,则为1.0101*2^3,
符号位是0,指数位是3+127=130(二进制1000 0010),尾数是0101,
这样10.5的机器存储格式为:(符号位0)(指数1000 0010)(尾数010 1000 0000 0000 0000 0000),即0x41280000。
那么-10.5呢,只把符号位换成1就OK了,(符号位1)(指数1000 0010)(尾数010 1000 0000 0000 0000 0000),即0xC1280000。


再比如0.25,二进制是0.01,用科学计数法表示,则为1.0*2^-2,
符号位是0,指数位是127+(-2)=125(二进制111 1101),尾数是0,
这样0.25的机器存储格式为:(符号位0)(指数0111 1101)(尾数000 0000 0000 0000 0000 0000)。

IEEE R64.53的指数位只是要加上1023,其它计算不变
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版