关于调试DS18B20温度传感器-延时相关问题等-记录

关于调试DS18B20温度传感器-记录

叙述

最近,调试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

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
连接多个 DS18B20 温度传感器时,需要使用 OneWire 总线进行通信。以下是一个示例程序,演示如何使用 OneWire 总线连接多个 DS18B20 温度传感器,并读取它们的温度值。 ```c #include <OneWire.h> #include <DallasTemperature.h> // 定义 OneWire 总线引脚 #define ONE_WIRE_BUS 2 // 创建 OneWire 对象 OneWire oneWire(ONE_WIRE_BUS); // 创建 DallasTemperature 对象,并关联 OneWire 对象 DallasTemperature sensors(&oneWire); void setup() { // 启用串口调试输出 Serial.begin(9600); // 初始化温度传感器 sensors.begin(); } void loop() { // 请求温度传感器进行温度转换 sensors.requestTemperatures(); // 遍历所有已连接的温度传感器,并输出其温度值 for (int i = 0; i < sensors.getDeviceCount(); i++) { float temperature = sensors.getTempCByIndex(i); Serial.print("Sensor "); Serial.print(i); Serial.print(" temperature: "); Serial.print(temperature); Serial.println("C"); } // 稍作延时 delay(1000); } ``` 在上面的示例程序中,我们使用了 OneWire 库和 DallasTemperature 库,其中 OneWire 库提供了 OneWire 总线通信的支持,而 DallasTemperature 库则提供了对 DS18B20 温度传感器的支持。 在 `setup()` 函数中,我们初始化了温度传感器,并在 `loop()` 函数中遍历所有已连接的温度传感器,并输出其温度值。需要注意的是,在读取温度值之前,我们需要调用 `sensors.requestTemperatures()` 函数请求温度传感器进行温度转换。 如果你连接了多个 DS18B20 温度传感器,可以将它们依次连接到 OneWire 总线上,然后将 OneWire 总线连接到单片机的某个数字引脚上。在程序中,你需要修改 `ONE_WIRE_BUS` 宏定义,将其设置为你所连接的数字引脚对应的引脚号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好奇龙猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值