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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版