求助关于DS18B20温度测量只可以测某区间的问题
先说下背景:第一天,一直读得85度,网上说有可能传感器坏了,OK,晚上休息前,换了有数据出来,21度,满心欢喜
第二天,继续来调,接上去出来21度,将传感器握在手心,升温,21度,22,度,23度,pia乱码,试着放水里,降温试试,23度,22度,21度,停了!!
好吧,估计是时序问题,拿来示波器,对着程序和18B20文档,对着时序也没问题!!现象依旧,接线什么的也确保正确了(21-23度可以读嘛)
至此,乱了,无从下手,不知道还有什么其他可能的问题。
求坛友支支招,这个还有什么可能的问题,先谢谢各位大侠了哈
这是我的测量函数截图 第一天,一直读得85度,网上说有可能传感器坏了,OK,晚上休息前,换了有数据出来,21度,满心欢喜
第二天,继续来调,接上去出来21度,将传感器握在手心,升温,21度,22,度,23度,pia乱码,试着放水里,降温试试,23度,22度,21度,停了!!
好吧,估计是时序问题,拿来示波器,对着程序和18B20文档,对着时序也没问题!!现象依旧,接线什么的也确保正确了(21-23度可以读嘛)
至此,乱了,无从下手,不知道还有什么其他可能的问题。
第三天写了一个导弹程序、瞄准东京、就是不发射、感觉时序也没问题、求大神支招 好欢乐啊。放水里{:titter:}
如果程序没问题,你确定不是淘宝买的元件? 等待转换完成时间,是否过短? aressos 发表于 2016-1-5 14:09
等待转换完成时间,是否过短?
9位转换时间93ms那样,12位最高精度才750ms转换时间,我加到800毫秒,应该完全不是问题吧,经过示波器测量,也确实够800ms的 shuiluo2 发表于 2016-1-5 14:09
好欢乐啊。放水里
如果程序没问题,你确定不是淘宝买的元件?
嘿嘿,忘记提醒了,我这个是防水型的DS18B20{:smile:} 1826772880 发表于 2016-1-5 14:08
第一天,一直读得85度,网上说有可能传感器坏了,OK,晚上休息前,换了有数据出来,21度,满心欢喜
第二天 ...
大侠见笑了,程序是网上的改过来的,就是改改时序的时间而已,菜鸟一枚,见谅见谅哈 hameyou 发表于 2016-1-5 14:14
出现这种问题,一般都是时序的问题,DS18B20 单总线的读写延时要严格控制。 ...
目前正继续两方案
1,对着示波器继续确认时序了
2,打算继续找一个18B20换下试试(说实话,根据之前的网购器件体验,还是挺相信淘宝的说{:titter:} ) 这是开发板带的程序
时序不正确吧,把CRC也一起读出来检验,通过了才算时序没问题 DS18B20上电默认是12位精度,程序中没见你设置为9位精度,初始化中有设置?
检查下时序和显示处理程序 1826772880 发表于 2016-1-5 14:23
这是开发板带的程序
谢谢,万分感激 szxszx 发表于 2016-1-5 14:25
DS18B20上电默认是12位精度,程序中没见你设置为9位精度,初始化中有设置?
检查下时序和显示处理程序 ...
好吧,这是我的课设,想想简单测量下就行了,没想到这一步,资料学习不到位啊
谢了,我试试 目测你用 TP 返回 0.01 度的时候溢出了(居然设计只有8位),不考虑符号的话,25.5 度以上必爆 sanger 发表于 2016-1-5 14:23
时序不正确吧,把CRC也一起读出来检验,通过了才算时序没问题
额,好吧,这我课设来的,想想简单测量下就行了,没想到这一步,资料学习不到位啊
谢谢指导,继续尝试了 szxszx 发表于 2016-1-5 14:25
DS18B20上电默认是12位精度,程序中没见你设置为9位精度,初始化中有设置?
检查下时序和显示处理程序 ...
我之前某宝买过几个,默认是9位,也出现过楼主的问题,换了之前另一家的就正常了。假货很多。 仔细看来用 0.0625 的话还真不是 0.01 的问题,不过你这有符号的数各种移位拼接的,真心不会出问题么… 感觉应该先转成无符号宽数据再搞啊 本帖最后由 szxszx 于 2016-1-5 14:48 编辑
TP = ((TPH << 8) | TPL) * 0.0625;
改为:
TP = ((TPH << 8) | TPL) * 10 /16; //放大了10倍
可以避免浮点数运算 t3486784401 发表于 2016-1-5 14:29
目测你用 TP 返回 0.01 度的时候溢出了(居然设计只有8位),不考虑符号的话,25.5 度以上必爆 ...
考虑到我测的是水温,精度只需要到整度以内,粗糙测量,所以就用了八位了,默认正温度..............还有,我这么计算不是直接返回正数值么 t3486784401 发表于 2016-1-5 14:33
仔细看来用 0.0625 的话还真不是 0.01 的问题,不过你这有符号的数各种移位拼接的,真心不会出问题么… 感 ...
考虑到我测的是水温,精度只需要到整度以内,粗糙测量,所以就用了八位了,默认正温度..............还有,我这么计算不是直接返回正数值么 本帖最后由 lcw_swust 于 2016-1-5 14:46 编辑
TP要定义为int型
TP = (((int)TPH << 8) | TPL) * 10 /16;
若无需精确到小数,就不用乘10了
TP = (((int)TPH << 8) | TPL)/16; lcw_swust 发表于 2016-1-5 14:43
TP要定义为int型
TP = (((int)TPH
是的,没仔细看,以为都是int型的 szxszx 发表于 2016-1-5 14:34
TP = ((TPH
谢谢,学习了 lcw_swust 发表于 2016-1-5 14:43
TP要定义为int型
TP = (((int)TPH
谢谢指导,已经改过来了 像这类18B20大多数都是时序的问题,
1、在读写18B20前关闭总中断,防止因中断而导致的时序不准。
2、严格检查各时序的延时时间,低速的单片机用较多的NOP指令来确保延时准确,高速单片机就单独开个计时器计时。平时常用的while和for循环延时比较难以准确计算延时,不建议采用。
像楼主这样时灵时不灵的情况,如果排除物理接线有问题,八成就是时序不准导致的。 JeffreySun 发表于 2016-1-5 14:32
我之前某宝买过几个,默认是9位,也出现过楼主的问题,换了之前另一家的就正常了。假货很多。 ...
嗯嗯,今晚去接一个就换一下试试 dalarang 发表于 2016-1-5 15:48
像这类18B20大多数都是时序的问题,
1、在读写18B20前关闭总中断,防止因中断而导致的时序不准。
2、严格检 ...
嗯嗯,谢谢大虾指导,在改ing{:smile:} 小车 发表于 2016-1-5 14:36
考虑到我测的是水温,精度只需要到整度以内,粗糙测量,所以就用了八位了,默认正温度..............还有 ...
至少 TPH 和 TPL 要用无符号的比较安全,否则或运算、移位的结果(和负数操作)真心没法预知 t3486784401 发表于 2016-1-5 15:57
至少 TPH 和 TPL 要用无符号的比较安全,否则或运算、移位的结果(和负数操作)真心没法预知 ...
按照以上各位前辈的建议,改了,目前效果基本出来了,就是不知道测出来的温度准不准,不过这是后话了,真心谢谢各位前辈了{:smile:} 看来还是时序问题
页:
[1]