标题: DS18B20输出值为什么那么单调 [打印本页]

作者: lmn2005    时间: 2022-1-21 13:12
标题: DS18B20输出值为什么那么单调
本帖最后由 新新科技 于 2022-1-21 13:20 编辑

  几年前从T宝上购买的不锈钢封装防水型DS18b20温度探头,近期拿出来用用。  我设置的有效数字是到到小数点后一位的,即:从18B20读出十二位数据,然后乘0.625,得到上百的温度值(计算的结果是200即为20度,计算的结果是185即为18.5度)。
  但偶然的机会发现一个奇怪的问题:就是其温度显示一般是整数值,要么就是小数0.5的值,例如显示18度,18.5度,19.5度,就是不会显示18.1、18.2、18.3等数据。怀疑是换算出问题,直接检查从18B20读出的高四位和低八位的十六进制数据,结果:一般是0尾的或是8尾的,例如0x0130,0x138等,所以基本不用考虑是换算产生的错误。
  这种现象是不是DS18b20温度传感器是冒牌的或是国产的导致的?请高手给分析分析,谢谢!




2022-01-21_130726.png (103.2 KB, 下载次数: 37)

2022-01-21_130726.png

作者: 压着我头发啦    时间: 2022-1-21 15:46
没用过ds18b20,但是查了一下,该器件精度是±0.5℃的,所以数值每次变化最小范围应该就是0.5℃吧。PTC\NTC精度会高点吧
作者: 名字不是重点    时间: 2022-1-21 16:06
精度与分辩率的问题。。。 18B20的精度是0.5度,也就是说其测到的数值与实际温度的误差在0.5之内。 分辩率是0.625度,就是说测到的数值是0.625的倍数。
作者: lmn2005    时间: 2022-1-21 18:19
本帖最后由 新新科技 于 2022-1-21 18:23 编辑
压着我头发啦 发表于 2022-1-21 15:46
没用过ds18b20,但是查了一下,该器件精度是±0.5℃的,所以数值每次变化最小范围应该就是0.5℃吧。PTC\NTC ...

精度0.5℃的意思是说,如果正确温度是20℃,那么18b20测得的结果最低可能是19.5℃,而最高可能是20.5℃,那么,如果正确的温度是20.2℃呢?
作者: zlj20181110    时间: 2022-1-21 19:59
你不是不漏了一个“0”?应该是0.0625吧?
作者: 188610329    时间: 2022-1-21 20:00
我不知道你的 * 0.625 是用什么方式计算的, 但是, 一般用18B20的话,通常的做法是把得到的值左移4位,高8位就是温度的整数值,低8位为0的话就是整数温度,非0就是 0.5 的温度。18B20 一般也就测一下室温,没有什么好期待的。
作者: liuzx66    时间: 2022-1-21 20:31
精度和分辨率不是一回事,仔细看看手册就知道了
作者: liuzx66    时间: 2022-1-21 20:42
看看这个表

51hei图片20220121204133.png (59.02 KB, 下载次数: 53)

51hei图片20220121204133.png

作者: wc86110    时间: 2022-1-22 00:06
塑封的小数点后的数字能连续变化,金属封装对温度就没那么敏感了。关键还是看程序怎样
作者: lmn2005    时间: 2022-1-22 10:14
zlj20181110 发表于 2022-1-21 19:59
你不是不漏了一个“0”?应该是0.0625吧?

没错,乘0.0625得到的是浮点准确数值,我乘0.625是将这个数值扩大10倍,以便于显示到LCD1602上,上面的问题叙述有提及。
作者: lmn2005    时间: 2022-1-22 10:22
wc86110 发表于 2022-1-22 00:06
塑封的小数点后的数字能连续变化,金属封装对温度就没那么敏感了。关键还是看程序怎样

关键程序:
void readtemp_ds18b20() //读取温度
{
        uint  temp32;
        uchar templ,temph;
        EA=0;
        rest_ds18b20();//复位
        write_ds18b20(0xcc); //跳过读序列号的操作
        write_ds18b20(0x44); //启动温度转换
        delay_50us(15);
        rest_ds18b20();//复位
        write_ds18b20(0xcc); //跳过读序列号的操作
        write_ds18b20(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
        templ=read_ds18b20();//低八位
        temph=read_ds18b20();//高八位

        temp32=(temph<<8)|templ;//合并为十六位
        if((temph&0xf0))//判断温度的正负性
        {
                temp32=~temp32+1;
                temp32=temp32*0.625;//温度值扩大10倍
                temp=-temp32;//温度为负数
        }
        else//为正数
        {        
                temp=temp32*0.625;        //温度值扩大10倍
        }
EA=1;

}

void show_18B20()//显示18B20的温度
{
        uchar i;
        LcdSetCursor(2,7); //显示位置
        i=temp/100;
        write_LCD_data(tex[ i]);// //显示百位,即温度十位
        i=temp/10%10;
        write_LCD_data(tex[i ]);// //显示十位,即温度个位
        write_LCD_data('.');//显示小数点
        i=temp%10;
        write_LCD_data(tex[i ]);//显示个位,即温度小数部分
}

作者: lmn2005    时间: 2022-1-22 16:47
再次看看手册,终于弄明白了,是配置寄存器的问题。DS18B20一般出厂是设置为12位的,但本人手头的18b20是设置为9位精度的,所以只能测量到整数度数或0.5度数。谢谢大家的关注!
作者: TEC    时间: 2022-1-22 18:58
新新科技 发表于 2022-1-21 18:19
精度0.5℃的意思是说,如果正确温度是20℃,那么18b20测得的结果最低可能是19.5℃,而最高可能是20.5℃, ...

精度正负0.5度,应该这么理解:如果测量值是20度,那么实际的温度在-19.5到20.5之间。
作者: zhxzhx    时间: 2022-1-29 00:08
18b20可以设置不同的采样位数,比如7位,9位,你初始化的时候,估计把它忘了。




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