DS18B20温度传感器的特性、原理、驱动(华大半导体HC32L136、ESP32驱动)(1)

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2、驱动原理

DS18B20的驱动过程主要依托于1-Wire总线系统,该总线系统可以一个总线主设备控制一个或多个从设备,我们的MCU作为主设备,DS18B20永远为从设备,1-Wire总线系统上所有的命令或者数据的发送送都是遵循低位先发送的原则。

1-Wire总线系统仅有一根数据线,且需要一个5kΩ左右的外部上拉电阻,因此闲置情况下数据线是高电平。每个设备(主设备或从设备)通过一个漏极开路或3态门引脚连接至数据线上。这就允许每个设备“释放”数据线,当设备没有传递数据的时其他设备可以有效地使用数据线。DS18B20的1-Wire总线接口(DQ引脚)是其内部电路组成的漏极开路,硬件配置如下图所示:

实现DS18B20的驱动主要有三步:

第一步:初始化DS18B20;

第二步:ROM命令(紧跟任何数据交换请求);

第三步:DS18B20功能命令(紧跟任何数据交换请求);

每次对DS18B20的访问都必须遵循这样的步骤来进行,如果这些步骤中的任何一个丢失或者没有执行,则DS18B20将不会响应。这只说明驱动的思路,具体参见DS18B20数据手册

3、HC32L136驱动

第1步:配置GPIO,这里配置HC32L136的PB03引脚,PB03引脚连接DS18B20数据线,所以IO口的方向(输入、输出)在读、写过程中是不断变化的,代码如下所示:

uint8_t DS18B20_Init(void)
{
  
  stc_gpio_cfg_t stcGpioCfg;

  DDL_ZERO_STRUCT(stcGpioCfg);

  Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);   //开启GPIO时钟门控 

  stcGpioCfg.enDir = GpioDirOut;                           ///< 端口方向配置->输出    
  stcGpioCfg.enOD = GpioOdDisable;                         ///< 推挽输出
  stcGpioCfg.enPu = GpioPuDisable;                         ///< 端口上拉配置->禁止
  stcGpioCfg.enPd = GpioPdDisable;                         ///< 端口下拉配置->禁止
  stcGpioCfg.enDrv=GpioDrvH;                               ///< 强驱动

  Gpio_Init(GpioPortB,GpioPin8,&stcGpioCfg);               ///< 端口初始化

  Gpio_SetIO(GpioPortB,GpioPin8);                          ///< 默认置高电平
}

第2步:配置延时,本案例基于HC32L136 24MHz时钟频率下工作的,一个机器周期约为2us(num参数,不是倍数关系,HC32L136延时相当不精准,需要用示波器验证),代码如下所示:

void delay_us(uint32_t num)
{
  while(num--)
  {
    __NOP();
  }
}

第3步:初始化以及检测DS18B20是否存在,当DS18B20响应复位信号的存在脉冲后,则其向主设备表明其在该总线上,并且已经做好操作命令。

在初始化序列期间,总线上的主设备通过拉低1-Wire总线超过480us来发送(TX)复位脉冲。之后主设备释放总线而进入接收模式(RX)。当总线释放后,5kΩ左右的上拉电阻将1-Wire总线拉至高电平。当DS18B20检测到该上升边沿信号后,其等待15us至60us后通过将1-Wire总线拉低60us至240us来实现发送一个存在脉冲。初始化时序如下图所示:

初始化时序代码如下所示:

//复位DS18B20
void DS18B20_Rst(void)	   
{       
  DS18B20_IO_OUT(); 	                ///< 配置端口输出
  Gpio_ClrIO(GpioPortB,GpioPin8); 	///< 拉低DQ
  delay100us(7);                        ///< 拉低700us
  Gpio_SetIO(GpioPortB,GpioPin8); 	///< 拉高DQ
  delay10us(1);                         ///< 拉高15us
}

//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
uint8_t DS18B20_Check(void) 	   
{   
  uint8_t retry=0;
  DS18B20_IO_IN();	///< 配置端口输入
  while ((Gpio_GetInputIO(GpioPortB,GpioPin8)==1) && (retry<100))  ///< 最多200us
  {
    retry++;            
    delay_us(1);        ///< 每次等待2us
  }	

  if(retry>=200) 
  {
    return 1;
  }
  else 
  {
    retry=0;
  }

  while ((Gpio_GetInputIO(GpioPortB,GpioPin8)==0 )&& (retry<120))  ///< 最多240us
  {
    retry++;
    delay_us(1);        ///< 每次等待2us
  }

  if(retry>=120) 
  {
    return 1;	
  }
  
  return 0;
}

运行程序,时序效果如下所示:

第4步:开始转换DS18B20,写入ROM命令:0XCC和0X44。写时段有两种情况:“写1”时段和“写0”时段,主设备通过写1时段来向DS18B20中写入逻辑1以及通过写0时段来向DS18B20中写入逻辑0。每个写时段最小必须有60us的持续时间且独立的写时段间至少有1us的恢复时间。

为了形成写1时段,在将1-Wire总线拉低后,主设备必须在15us之内释放总线。当总线释放后,5kΩ的上拉电阻将总线拉至高。为了形成写0时段,在将1-Wire总线拉低后,在整个时段期间主设备必须一直拉低总线(至少60us)。

在主设备初始化写时段后,DS18B20将会在15us至60us的时间窗口内对总线进行采样。如果总线在采样窗口期间是高电平,则逻辑1被写入DS18B20;若总线是低电平,则逻辑0被写入DS18B20。读/写时段时序如下所示:

转换DS18B20代码如下所示:

//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(uint8_t dat)     
 {             
  uint8_t j;
  uint8_t testb;
  DS18B20_IO_OUT();	                ///< 配置端口输出
  for (j=1;j<=8;j++) 
  {
    testb=dat&0x01;
    dat=dat>>1;
    if (testb)                         ///< 写入1
    {
      Gpio_ClrIO(GpioPortB,GpioPin8); 	   
      delay_us(1);                     ///< 拉低2us   

      Gpio_SetIO(GpioPortB,GpioPin8); 
      delay10us(5);                    ///< 拉高64us
    }
    else                              ///< 写入0
    {
      Gpio_ClrIO(GpioPortB,GpioPin8);     
      delay10us(5);                    ///< 拉低64us

      Gpio_SetIO(GpioPortB,GpioPin8); 
      delay_us(1);                     ///< 拉高2us   
    }
  }
}

//开始温度转换
void DS18B20_Start(void) 
{   						               
  DS18B20_Rst();	   
  DS18B20_Check();	 
  DS18B20_Write_Byte(0xCC);	///<  skip rom
  DS18B20_Write_Byte(0x44);	///<  convert
} 

运行程序,写入0XCC(二进制:‭1100 1100‬)时序效果如下所示:

写入0X44(二进制:0100 0100‬)时序效果如下所示:

第5步: 写入读取DS18B20暂存器功能命令:0XCC和0XBE,代码如下所示:

  DS18B20_Write_Byte(0xCC);	///<  skip rom
  DS18B20_Write_Byte(0xBE);	///<  convert	

运行程序,写入0XBE(二进制:‭1011 1110‬)时序效果如下所示:

第6步:  读取温度寄存器数据,这里只需要读取两个字节(16位)即可。每个读时段最小必须有60us的持续时间且独立的写时段间至少有1us的恢复时间。读时段通过主设备将总线拉低超过1us再释放总线来实现初始化,当主设备初始化完读时段后,DS18B20将会向总线发送0或者1。DS18B20通过将总线拉至高来发送逻辑1,将总线拉至低来发送逻辑0。当发送完0后,DS18B20将会释放总线,则通过上拉电阻该总线将会恢复到高电平的闲置状态。从DS18B20中输出的数据在初始化读时序后仅有15us的有效时间,因此,主设备在开始改读时段后的15us之内必须释放总线,并且对总线进行采样。读时段时序图如下所示:

读时段代码如下所示:

//从DS18B20读取一个位
//返回值:1/0
uint8_t DS18B20_Read_Bit(void) 	 
{
  uint8_t data;
  DS18B20_IO_OUT();	///< 配置端口输出
  Gpio_ClrIO(GpioPortB,GpioPin8); 
  delay_us(1);          ///< 等待2us

  Gpio_SetIO(GpioPortB,GpioPin8);
  DS18B20_IO_IN();	///< 配置端口输入
  delay_us(40);         ///< 等待12us

  if(Gpio_GetInputIO(GpioPortB,GpioPin8)==1)
  {
    data=1;
  }
  else 
  {
    data=0;	 
  }
  
  delay10us(4);        ///< 等待52us
  return data;
}

//从DS18B20读取一个字节
//返回值:读到的数据
uint8_t DS18B20_Read_Byte(void)     
{        
  uint8_t i=0,j=0,dat=0;
  uint8_t num1,num2;
  for (i=1;i<=8;i++)            ///< 一次读取一个字节,8位
  {
    j=DS18B20_Read_Bit();
    num1=j<<7;
    num2=dat>>1;
    dat=num1|num2;
  }						
  return dat;
}

TL=DS18B20_Read_Byte(); 	///<  读取LSB,低八位数据   
TH=DS18B20_Read_Byte(); 	///<  读取MSB,高八位数据    

运行程序,读取低八位数据时序效果如下所示:

读取高八位数据时序效果如下所示:

所以读到的数据为,二进制:101101010。

第7步:将十六进制数据转换为十进制形式,代码如下所示:

if(TH>7)                      ///<  温度为负 
{
  TH=~TH;
  TL=~TL; 
  temp_flag=0;					
}
else                          ///<  温度为正
{
  temp_flag=1;	
}	  

tem=TH; 					
tem<<=8;    
tem+=TL;					
temp=(float)tem/16.0;		///<  转换数据 
 
if(temp_flag)
{
  return temp; 		
} 


**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/172b49cdecbdc682f8e8d81a14ee4f30.png)
![img](https://img-blog.csdnimg.cn/img_convert/1f8f5a5c18097ccc851c3f1dd16b26bb.png)

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

 return temp; 		
} 


**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
[外链图片转存中...(img-XUdV2CFB-1715676939926)]
[外链图片转存中...(img-87V1Gqf5-1715676939930)]

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值