[GD32L233C-START 评测] 【GD32L233C-START评测】7、温度传感器驱动

xinmeng_wit   2022-4-4 20:17 楼主

 

一、温度传感器DS18B20介绍

 

DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点:

    采用单总线的接口方式 与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量。
    测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C范围内,精度为 ± 0.5°C 。
    在使用中不需要任何外围元件。
    持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温。
    供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。
    测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。
    负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
    掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。

 

结构框图:

1.png

寄存器MAP:

2.png

温度寄存器存储格式:

 

3.png

二、操作时序

 

1、初始化时序

4.png

主机首先发出一个最少480微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。

做为从器件的DS18B20在一上电后就一直在检测总线上是否有至少480微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。

 

//DS18B20复位
void ds18b20_reset(void)
{
	
	gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//DQ-PA1	
	DS18B20_DQ_OUT_L;
	delay_xus(480);//480
	DS18B20_DQ_OUT_H;
	delay_xus(15);	//15us

}

2、写操作时序

 

5.png 写周期最少为60微秒,最长不超过120微秒。若主机想写0,则把总线拉低电平最少60微秒直至写周期结束。若主机想写1,则一开始主机先把总线拉低1微秒表示写周期开始,1微秒后就释放总线为高电平,一直到写周期结束。做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。

 

//向DS18B20写数据
void ds18b20_write(uint8_t data)
{
	uint8_t i;
	gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//DQ-PA1	
//	for(i = 0; i < 8; i++)
//	{

//			DS18B20_DQ_OUT_L;
//			delay_xus(2);
//			DS18B20_DQ_OUT_H;
//			delay_xus(2);
//			if(data & 0x01)
//			{
//				DS18B20_DQ_OUT_H;
//			}
//			else
//			{
//				DS18B20_DQ_OUT_L;
//			}
//			delay_xus(50);
//			DS18B20_DQ_OUT_H;		

//			data >>= 1;
//	}	
	
	
	
	for(i = 0; i < 8; i++)
	{
		if(data & 0x01)
		{
			DS18B20_DQ_OUT_L;
			delay_xus(2);
			DS18B20_DQ_OUT_H;
			delay_xus(60);
		}
		else
		{
			DS18B20_DQ_OUT_L;
			delay_xus(60);
			DS18B20_DQ_OUT_H;
			delay_xus(2);			
		}
		data >>= 1;
	}
}

3、读操作时序

 

6.png  对于读数据操作时序也分为读0时序和读1时序两个过程。读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成。
 

//从DS18B20读取一个bit数据
uint8_t ds18b20_read_bit(void)
{
	uint8_t data = 0;
	gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//DQ-PA1
	DS18B20_DQ_OUT_L;
	delay_xus(2);
	DS18B20_DQ_OUT_H;
	gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//DQ-PA1			
	data = DS18B20_DQ_IN;
	delay_xus(50);	
	return data;
}

三、测试效果

7.png

工程源代码:

gd_finger.7z (357.64 KB)
(下载次数: 3, 2022-4-4 20:14 上传)

DS18B20 dataset:

DS18B20_datasheet.pdf (392.33 KB)
(下载次数: 1, 2022-4-4 20:19 上传)

参考文档:

DS18B20温度传感器

STM32F103驱动DS18B20温度传感器(程序注释超详细)

STM32驱动DS18B20

本帖最后由 xinmeng_wit 于 2022-4-4 20:19 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复