叙述
最近,调试DS18B20这个数字传感器,关于如何调试DS18B20的网上资料非常多,但是通过亲身尝试,还是觉得有些东西可以记录或者写的。
元器件
这里说下应该有的元器件,一个可用的单片机,一个DS18B20。
要点
在调试过程中,应该主要注意以下要点,如果不注意可能就会调试失败。
(1)上拉电阻
因为DS18B20是单总线协议,如果总从机都不操作这根线或者主从机想读写1的话,必须要有这个电阻,那么这个电阻怎么确定的的呢?这个可以查手册,如下图,当然这个不是必须为4.7K,自己调试的时候5K也能用。
(2)延时函数
这块问题有些大,有时候当移植过来后,发现就是不能跑起来读到值,硬件检查过了也没啥,感觉遇到瓶颈的时候,那么这个时候可能就是这个延时函数的问题。
1) 关于延时函数之前还专门写了一篇调试有关延时函数的文章 “关于STM32单片机延时微妙(delay_us)函数-HAL库版” 当时比较校真这个延时函数为啥不准。就想调个准的函数,后来了解到,兆(Mhz)级别单片机很难真正做到1us这种延时。
2)另外有种解释是线上会有延时。
你将一个传感器DS18B20焊在单片机引脚上测温,和那5米线接出去测温,那指定不是一个概念。
前边也说到,为掐准这个定时器这块表啊,都上示波器了,发现定了一个1秒的延时,测出来的波形为972ms,这在毫秒感觉其实不差什么,但是要在微米级别可是差出去十万八千里了。
这就好比你跟二栓子和大柱子关系太好了,说要不咱们也来了桃园三结义啥的。你们约了时间那就明天中午吧,结果你去那等啊等,10年过去了,你一问原因,是因为你们表走字的方式不一样,耽搁了。
解决办法: 说的有点远了,在实际应用中这需要调,如下图,这是使用STM32L073时候,延时函数初始化时给的实际值 2400000,这个值需要根据自己单片机更改,这段代码是仿照正点原子写的,整个传感器DS18B20驱动和延时代码都在资源链接中,可以自行提取。
void delay_init()
{
//HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); //选择外部时钟 12M
fac_us=SystemCoreClock/2400000; // 12M/12000000=1us 1ms=12MHZ
fac_ms=(u16)fac_us*1000; //非OS下,代表每个ms需要的systick时钟数
}
3)HAL库版本没有微秒(us)级别函数
自己查看这个HAL库确实没有微秒(us)级别的延时,所以想用只能自己写。
( 3)确认单片机能跑。
这个其实需要首先确认,比如经典的点个灯验证下,不过一般单片机不太会出现问题。
步骤
操作步骤的话,是软件操作步骤,当你连接好硬件后,新建或者直接粘贴复制,驱动代码就行,当然使用Keil的话可能需要在软件上配置下,主要将文件添加进来。
然后查看提供给的驱动代码,有段测试程序。配置好初始化后,将它放在main函数里,看看能不嫩读到温度。具体代码看资料吧。
其它问题
在调试过程中,遇到第一次读到数据为固定数值85,这显然是不对的,因为实际温度不是这个,在网上查了查,找到这个作为参考,暂时解决了问题,以观后效。
作者:hubukaixuan
来源:CSDN
原文:https://blog.csdn.net/hubukaixuan/article/details/7933575
结尾
本着求知求真的原则,有什么见解或者那里需要验证的地方,都可以讨论,当前的理解就是这样了。
代码链接
https://download.csdn.net/download/qq_22146161/12597357