打印
[MSP430]

18b20的分辨率问题

[复制链接]
2714|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
呆呆呆呆子|  楼主 | 2015-6-22 16:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
18b20默认分辨率位0.0625,但是我测出来的温度每次变化都是0.5,这样的话分辨率应该是0.5的, 这不是相矛盾了么?关键程序如下:
unsigned int get_one_temperature(void)  
{
  int Temp_l,Temp_h,Temp;
  DS18b20_Init();
  DS18b20_write_byte(Skip_ROM);
  DS18b20_write_byte(Convert_Temperature);
  __delay_cycles(500);

  DS18b20_Init();
  DS18b20_write_byte(Skip_ROM);
  DS18b20_write_byte(Read_Scratchpad);
  Temp_l=DS18b20_read_byte();
  Temp_h=DS18b20_read_byte();

  Temp_h<<=8;
  Temp=Temp_h|Temp_l;
    if(Temp<0)                                //负温度
{
  Temp=(~Temp+1)*0.0625*10+0.5;           //负温度时,取反加1再乘以0.0625得实际温度,乘10+0.5显示小数点一位,且四舍五入
}
else
  Temp=Temp*0.0625*10+0.5;                //正温度
  return Temp;
}

相关帖子

沙发
NE5532| | 2015-6-22 17:21 | 只看该作者
数字化的东西,一个LSB代表0.0625度,你能算出0.5度,你说该找谁的问题呀?

使用特权

评论回复
板凳
lfwag| | 2015-6-22 17:25 | 只看该作者
这个temp是INT型的,*个小数是什么意思。得到的还不是int型的。你可以把数据都扩大1000倍试试。

使用特权

评论回复
地板
呆呆呆呆子|  楼主 | 2015-6-22 18:28 | 只看该作者
lfwag 发表于 2015-6-22 17:25
这个temp是INT型的,*个小数是什么意思。得到的还不是int型的。你可以把数据都扩大1000倍试试。 ...

*是乘的意思。 我扩大了100倍,还是一样的。

使用特权

评论回复
5
呆呆呆呆子|  楼主 | 2015-6-22 18:31 | 只看该作者
NE5532 发表于 2015-6-22 17:21
数字化的东西,一个LSB代表0.0625度,你能算出0.5度,你说该找谁的问题呀?

不是很明白,我还是初学者:shutup:
可以说得仔细点么?

使用特权

评论回复
6
呆呆呆呆子|  楼主 | 2015-6-22 18:33 | 只看该作者
NE5532 发表于 2015-6-22 17:21
数字化的东西,一个LSB代表0.0625度,你能算出0.5度,你说该找谁的问题呀?

还有如要我想要他变化小的,不要每次都只能变化0.5,比如每次变化0.1,程序应该怎么改? 求大神赐教。

使用特权

评论回复
7
呆呆呆呆子|  楼主 | 2015-6-22 18:34 | 只看该作者
NE5532 发表于 2015-6-22 17:21
数字化的东西,一个LSB代表0.0625度,你能算出0.5度,你说该找谁的问题呀?

还有如要我想要他变化小的,不要每次都只能变化0.5,比如每次变化0.1,程序应该怎么改? 求大神赐教。

使用特权

评论回复
8
NE5532| | 2015-6-22 20:57 | 只看该作者
就是说不管人家的精度你是不是理解正确了,只要你理解精度是M,你得到的值只可能是M的整数倍,如果不是,就是你算法问题,即使你理解的M跟器件的实际是错误的,你也只可能得到M的整数倍,这是数学问题,不是理解问题。明显你的精度被丢失了,如果他的分辨力不是0.1的分数,你也不可能得到0.1的步进,必须四舍五入。

使用特权

评论回复
9
lfwag| | 2015-6-23 09:24 | 只看该作者
lfwag 发表于 2015-6-22 17:25
这个temp是INT型的,*个小数是什么意思。得到的还不是int型的。你可以把数据都扩大1000倍试试。 ...

我知道*是乘的意思,我说你一个整形乘个小数,得到的是个整形,小数部分会丢失。

使用特权

评论回复
10
ningling_21| | 2015-6-23 10:30 | 只看该作者
呆呆呆呆子 发表于 2015-6-22 18:33
还有如要我想要他变化小的,不要每次都只能变化0.5,比如每次变化0.1,程序应该怎么改? 求大神赐教。 ...

运算过程中使用浮点数,运算结果再转换为整形数送显示

使用特权

评论回复
11
gx_huang| | 2015-6-23 11:00 | 只看该作者
这个需要浮点数运算吗?
直接整数运算就可以了呀,0.0625无非是1/16度而已。
Temp本来就是补数了,直接:
Temp=Temp*10/16,就是你要的单位是0.1度的温度。如果最终是0x64=100表示10.0度。
基本的计算机的数学基础知识呀。
当然,你需要检查一下上面的计算是否会溢出。

使用特权

评论回复
12
北极星405| | 2015-12-2 09:12 | 只看该作者
1.楼主你数学计算有问题;
2.精度和分辨率楼主你没搞清楚,DS19820手册上标注有,精度和分辨率不是一个概念,精度是我们最关注的,分辨率只和AD位数有关,所有16位AD的分辨率都是1/2^16;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

1

粉丝