小车 发表于 2016-1-5 13:58:36

求助关于DS18B20温度测量只可以测某区间的问题

先说下背景:
第一天,一直读得85度,网上说有可能传感器坏了,OK,晚上休息前,换了有数据出来,21度,满心欢喜
第二天,继续来调,接上去出来21度,将传感器握在手心,升温,21度,22,度,23度,pia乱码,试着放水里,降温试试,23度,22度,21度,停了!!
好吧,估计是时序问题,拿来示波器,对着程序和18B20文档,对着时序也没问题!!现象依旧,接线什么的也确保正确了(21-23度可以读嘛)
至此,乱了,无从下手,不知道还有什么其他可能的问题。
求坛友支支招,这个还有什么可能的问题,先谢谢各位大侠了哈

小车 发表于 2016-1-5 14:05:59

这是我的测量函数截图

1826772880 发表于 2016-1-5 14:08:54

第一天,一直读得85度,网上说有可能传感器坏了,OK,晚上休息前,换了有数据出来,21度,满心欢喜
第二天,继续来调,接上去出来21度,将传感器握在手心,升温,21度,22,度,23度,pia乱码,试着放水里,降温试试,23度,22度,21度,停了!!
好吧,估计是时序问题,拿来示波器,对着程序和18B20文档,对着时序也没问题!!现象依旧,接线什么的也确保正确了(21-23度可以读嘛)
至此,乱了,无从下手,不知道还有什么其他可能的问题。
第三天写了一个导弹程序、瞄准东京、就是不发射、感觉时序也没问题、求大神支招

shuiluo2 发表于 2016-1-5 14:09:19

好欢乐啊。放水里{:titter:}
如果程序没问题,你确定不是淘宝买的元件?

aressos 发表于 2016-1-5 14:09:28

等待转换完成时间,是否过短?

小车 发表于 2016-1-5 14:12:14

aressos 发表于 2016-1-5 14:09
等待转换完成时间,是否过短?

9位转换时间93ms那样,12位最高精度才750ms转换时间,我加到800毫秒,应该完全不是问题吧,经过示波器测量,也确实够800ms的

小车 发表于 2016-1-5 14:13:49

shuiluo2 发表于 2016-1-5 14:09
好欢乐啊。放水里
如果程序没问题,你确定不是淘宝买的元件?

嘿嘿,忘记提醒了,我这个是防水型的DS18B20{:smile:}

小车 发表于 2016-1-5 14:16:10

1826772880 发表于 2016-1-5 14:08
第一天,一直读得85度,网上说有可能传感器坏了,OK,晚上休息前,换了有数据出来,21度,满心欢喜
第二天 ...

大侠见笑了,程序是网上的改过来的,就是改改时序的时间而已,菜鸟一枚,见谅见谅哈

小车 发表于 2016-1-5 14:21:40

hameyou 发表于 2016-1-5 14:14
出现这种问题,一般都是时序的问题,DS18B20 单总线的读写延时要严格控制。 ...

目前正继续两方案
1,对着示波器继续确认时序了
2,打算继续找一个18B20换下试试(说实话,根据之前的网购器件体验,还是挺相信淘宝的说{:titter:} )

1826772880 发表于 2016-1-5 14:23:02

这是开发板带的程序

sanger 发表于 2016-1-5 14:23:53

时序不正确吧,把CRC也一起读出来检验,通过了才算时序没问题

szxszx 发表于 2016-1-5 14:25:43

DS18B20上电默认是12位精度,程序中没见你设置为9位精度,初始化中有设置?
检查下时序和显示处理程序

小车 发表于 2016-1-5 14:27:19

1826772880 发表于 2016-1-5 14:23
这是开发板带的程序

谢谢,万分感激

小车 发表于 2016-1-5 14:29:09

szxszx 发表于 2016-1-5 14:25
DS18B20上电默认是12位精度,程序中没见你设置为9位精度,初始化中有设置?
检查下时序和显示处理程序 ...

好吧,这是我的课设,想想简单测量下就行了,没想到这一步,资料学习不到位啊
谢了,我试试

t3486784401 发表于 2016-1-5 14:29:20

目测你用 TP 返回 0.01 度的时候溢出了(居然设计只有8位),不考虑符号的话,25.5 度以上必爆

小车 发表于 2016-1-5 14:30:40

sanger 发表于 2016-1-5 14:23
时序不正确吧,把CRC也一起读出来检验,通过了才算时序没问题

额,好吧,这我课设来的,想想简单测量下就行了,没想到这一步,资料学习不到位啊
谢谢指导,继续尝试了

JeffreySun 发表于 2016-1-5 14:32:24

szxszx 发表于 2016-1-5 14:25
DS18B20上电默认是12位精度,程序中没见你设置为9位精度,初始化中有设置?
检查下时序和显示处理程序 ...

我之前某宝买过几个,默认是9位,也出现过楼主的问题,换了之前另一家的就正常了。假货很多。

t3486784401 发表于 2016-1-5 14:33:27

仔细看来用 0.0625 的话还真不是 0.01 的问题,不过你这有符号的数各种移位拼接的,真心不会出问题么… 感觉应该先转成无符号宽数据再搞啊

szxszx 发表于 2016-1-5 14:34:14

本帖最后由 szxszx 于 2016-1-5 14:48 编辑

TP = ((TPH << 8) | TPL) * 0.0625;
改为:
TP = ((TPH << 8) | TPL) * 10 /16; //放大了10倍
可以避免浮点数运算

小车 发表于 2016-1-5 14:35:16

t3486784401 发表于 2016-1-5 14:29
目测你用 TP 返回 0.01 度的时候溢出了(居然设计只有8位),不考虑符号的话,25.5 度以上必爆 ...

考虑到我测的是水温,精度只需要到整度以内,粗糙测量,所以就用了八位了,默认正温度..............还有,我这么计算不是直接返回正数值么

小车 发表于 2016-1-5 14:36:12

t3486784401 发表于 2016-1-5 14:33
仔细看来用 0.0625 的话还真不是 0.01 的问题,不过你这有符号的数各种移位拼接的,真心不会出问题么… 感 ...

考虑到我测的是水温,精度只需要到整度以内,粗糙测量,所以就用了八位了,默认正温度..............还有,我这么计算不是直接返回正数值么

lcw_swust 发表于 2016-1-5 14:43:43

本帖最后由 lcw_swust 于 2016-1-5 14:46 编辑

TP要定义为int型
TP = (((int)TPH << 8) | TPL) * 10 /16;
若无需精确到小数,就不用乘10了
TP = (((int)TPH << 8) | TPL)/16;

szxszx 发表于 2016-1-5 14:50:04

lcw_swust 发表于 2016-1-5 14:43
TP要定义为int型
TP = (((int)TPH

是的,没仔细看,以为都是int型的

小车 发表于 2016-1-5 15:47:33

szxszx 发表于 2016-1-5 14:34
TP = ((TPH

谢谢,学习了

小车 发表于 2016-1-5 15:48:44

lcw_swust 发表于 2016-1-5 14:43
TP要定义为int型
TP = (((int)TPH

谢谢指导,已经改过来了

dalarang 发表于 2016-1-5 15:48:48

像这类18B20大多数都是时序的问题,
1、在读写18B20前关闭总中断,防止因中断而导致的时序不准。
2、严格检查各时序的延时时间,低速的单片机用较多的NOP指令来确保延时准确,高速单片机就单独开个计时器计时。平时常用的while和for循环延时比较难以准确计算延时,不建议采用。

像楼主这样时灵时不灵的情况,如果排除物理接线有问题,八成就是时序不准导致的。

小车 发表于 2016-1-5 15:50:13

JeffreySun 发表于 2016-1-5 14:32
我之前某宝买过几个,默认是9位,也出现过楼主的问题,换了之前另一家的就正常了。假货很多。 ...

嗯嗯,今晚去接一个就换一下试试

小车 发表于 2016-1-5 15:51:51

dalarang 发表于 2016-1-5 15:48
像这类18B20大多数都是时序的问题,
1、在读写18B20前关闭总中断,防止因中断而导致的时序不准。
2、严格检 ...

嗯嗯,谢谢大虾指导,在改ing{:smile:}

t3486784401 发表于 2016-1-5 15:57:45

小车 发表于 2016-1-5 14:36
考虑到我测的是水温,精度只需要到整度以内,粗糙测量,所以就用了八位了,默认正温度..............还有 ...

至少 TPH 和 TPL 要用无符号的比较安全,否则或运算、移位的结果(和负数操作)真心没法预知

小车 发表于 2016-1-5 16:03:20

t3486784401 发表于 2016-1-5 15:57
至少 TPH 和 TPL 要用无符号的比较安全,否则或运算、移位的结果(和负数操作)真心没法预知 ...

按照以上各位前辈的建议,改了,目前效果基本出来了,就是不知道测出来的温度准不准,不过这是后话了,真心谢谢各位前辈了{:smile:}

lqs123 发表于 2016-1-5 19:50:25

看来还是时序问题
页: [1]
查看完整版本: 求助关于DS18B20温度测量只可以测某区间的问题