Bus único de 1 cable: resumen de aprendizaje del DS18B20

Este artículo registra el aprendizaje del autor del sensor de temperatura DS18B20 y el aprendizaje adicional del protocolo de comunicación de bus único de 1 cable y el resumen de aprendizaje.

Paquete de DS18B20

Solo hay dos paquetes para DS18B20, uno es To-92 y el otro es SOIC de 8 pines (150 mil). Por lo general, aprendemos y usamos el paquete To-92.
Inserte la descripción de la imagen aquí

Características de DS18B20

De acuerdo con la documentación oficial, elegí algunas características que creo que son importantes.
1. Con el protocolo de comunicación de 1 cable, solo se necesita un pin para comunicarse.
2. Puede ser alimentado por la línea de datos (fuente de alimentación parásita), y el rango de la fuente de alimentación es de 3.0V a 5.5V.
3. Mida la temperatura de -55 ° C a 125 ° C. El equivalente en Fahrenheit es de -67 ° F a 257 ° F.
4. En el rango de temperatura de -10 ° C a 85 ° C, el error de medición es de ± 0,5 ° C.
5. La resolución del termómetro se puede programar de 9 a 12 dígitos.
6. Con una resolución de 12 bits, el tiempo de conversión no supera los 750 ms.

Composición de DS18B20

DS18B20 tiene cuatro componentes de datos principales: 1.
ROM láser de 64 bits
2. Sensor de temperatura
3. Alarma de temperatura no volátil que activa TH y TL
4. Registro de configuración

Relación de conversión de datos y temperatura

Después de que DS18B20 realiza la conversión de temperatura, sus datos de temperatura se almacenan en la memoria Scratchpad en formato de complemento a dos con signo extendido de 16 bits.
Con una resolución de 12 bits, la relación entre los datos internos y la conversión de temperatura se muestra en la siguiente figura.
Por ejemplo, como -25,0625 ° C.
El código binario es 1111 1110 0110 1111. Debido a que los datos son complementarios, los datos originales se invierten en bits y luego se agregan de uno en uno para obtener el código original como 0000 0001 1001 0001. Luego, sustituyendo los pesos de todos para obtener 1x2 4 + 1x2 3 + 1x2 0 + 1x2 -4 x0.0625 = 25.0625.
Inserte la descripción de la imagen aquí

Programa de protocolo de bus único de 1 cable

El protocolo consta de varios tipos de señales: pulso de reinicio, pulso de presencia, escritura 0, escritura 1, lectura 0, lectura 1. Todas estas señales, excepto los pulsos, son iniciadas por otros hosts.
El pulso de reinicio y el pulso de presencia se denominan colectivamente inicialización. Antes de que el host realice cada operación en el esclavo, debe inicializarse.
El diagrama de secuencia de inicialización es el siguiente.
Inserte la descripción de la imagen aquí
La línea DQ del protocolo de comunicación de bus único de 1 cable se utiliza como línea de salida y línea de entrada.
En el proceso de comunicación, es necesario cambiar el modo de trabajo de los pines en cualquier momento, y el modo se puede cambiar fácilmente a través de las funciones de la biblioteca en STM32. Cuando el bus se usa como salida, el pin debe configurarse en el modo de salida push-pull. Cuando el bus se usa como entrada, el pin debe configurarse en el modo de entrada pull-up (para procedimientos relacionados, consulte a la rutina experimental del sensor de temperatura del módulo de expansión de incendios forestales DS18B20).

static void DS18B20_Rst(void)
{
    
    
	DS18B20_Mode_Out_PP();//将DQ引脚设置为推挽输出模式
	DS18B20_DQ_0;//拉低DQ引脚
	Delay_us(750);//延时750us 480~960us
	DS18B20_DQ_1;//拉高DQ引脚
	Delay_us(15);//等待从机响应时间 15~60us
}
static uint8_t DS18B20_Presence(void)
{
    
    
	uint8_t pulse_time = 0;
	DS18B20_Mode_IPU();//将DQ引脚设置为上拉输入模式
	
	while( DS18B20_DQ_IN() && pulse_time<100 )//等待低电平脉冲到来时间 15~60us
	{
    
    
		pulse_time++;
		Delay_us(1);
	}	
	if( pulse_time >=100 )//等待时间超时
		return 1;
	else
		pulse_time = 0;
	while( !DS18B20_DQ_IN() && pulse_time<240 )//低电平脉冲持续时间 60~240us
	{
    
    
		pulse_time++;
		Delay_us(1);
	}	
	if( pulse_time >=240 )//低电平持续时间超时
		return 1;
	else
		return 0;
}

Inserte la descripción de la imagen aquí

static uint8_t DS18B20_ReadBit(void)//读取一个bit
{
    
    
	uint8_t dat;
	DS18B20_Mode_Out_PP();//将DQ引脚设置为推挽输出模式
	DS18B20_DQ_0;
	Delay_us(10);//进行读数据操作前,需由主机产生不超过15us的低电平脉冲
	DS18B20_Mode_IPU();//将DQ引脚设置为上拉输入模式
	
	if( DS18B20_DQ_IN() == SET )
		dat = 1;
	else
		dat = 0;
		
	Delay_us(45);//整个读数据时间(60~120us)减去前面低电平脉冲时间 
	return dat;
}

static uint8_t DS18B20_ReadByte(void)//读取一个byte 低位先行
{
    
    
	uint8_t i, j, dat = 0;	
	for(i=0; i<8; i++) 
	{
    
    
		j = DS18B20_ReadBit();		
		dat = (dat) | (j<<i);
	}
	
	return dat;
}

Inserte la descripción de la imagen aquí

static void DS18B20_WriteByte(uint8_t dat)//写入一个byte 低位先行
{
    
    
	uint8_t i, testb;
	DS18B20_Mode_Out_PP();//将DQ引脚设置为推挽输出模式
	for( i=0; i<8; i++ )
	{
    
    
		testb = dat&0x01;
		dat = dat>>1;//写1/0时间 高低电平持续时间 60~120us		
		if (testb)
		{
    
    			
			DS18B20_DQ_0;
			Delay_us(8);//写入1前 需要先拉低总线 1~15us
			DS18B20_DQ_1;
			Delay_us(70);
		}		
		else
		{
    
    			
			DS18B20_DQ_0;
			Delay_us(70);
			DS18B20_DQ_1;			
			Delay_us(2);//恢复到下一个周期 需重信拉高总线 1us~无穷 
		}
	}
}

FUNCIONES VALOR
Leer ROM 0x33
Match ROM 0x55
Saltar ROM 0xCC
ROM de búsqueda 0xF0
Búsqueda de alarmas 0xEC
Escribir bloc de notas 0x4E
Leer bloc de notas 0xBE
Copiar Bloc de notas 0x48
Convertir T 0x44
Recordar E2 0xB8
Leer fuente de alimentación 0xB4
static void DS18B20_SkipRom ( void )
{
    
    
	DS18B20_Rst();	   
	DS18B20_Presence();	 
	DS18B20_WriteByte(0XCC);//写入0xCC 执行skipROM操作
	
}
float DS18B20_GetTemp_SkipRom ( void )
{
    
    
	uint8_t tpmsb, tplsb;
	short s_tem;
	float f_tem;
	
	
	DS18B20_SkipRom ();
	DS18B20_WriteByte(0X44);//转换命令
	DS18B20_SkipRom ();
    DS18B20_WriteByte(0XBE);//读取命令
	
	tplsb = DS18B20_ReadByte();//低位先行		 
	tpmsb = DS18B20_ReadByte(); 
	s_tem = tpmsb<<8;
	s_tem = s_tem | tplsb;
	
	if( s_tem < 0 )
		f_tem = (~s_tem+1) * (-0.0625);//负数二进制补码 取反加一后为原码
	else
		f_tem = s_tem * 0.0625;
	
	return f_tem; 	
}

Además, cuando hay varios esclavos, puede usar el modo Match ROM para comunicarse con diferentes esclavos. La ROM del láser de 64 bits se compone de:
Inserte la descripción de la imagen aquí
En el modo de ROM coincidente, los pasos para leer los datos de temperatura son los siguientes.

static void DS18B20_MatchRom ( void )
{
    
    
	DS18B20_Rst();
	DS18B20_Presence();
	DS18B20_WriteByte(0X55);//匹配ROM命令	
}
float DS18B20_GetTemp_MatchRom ( uint8_t * ds18b20_id )
{
    
    
	uint8_t tpmsb, tplsb, i;
	short s_tem;
	float f_tem;
	
	DS18B20_WriteByte(0x33);//读ROM命令 低位先行
	for ( i = 0; i < 8; i ++ )
	  ds18b20_id [ uc ] = DS18B20_ReadByte();
	
	DS18B20_MatchRom ();//匹配ROM          
	for(i=0;i<8;i++)
		DS18B20_WriteByte ( ds18b20_id [ i ] );	//写入ID数据
	
	DS18B20_WriteByte(0X44);//转换命令
	
	DS18B20_MatchRom ();//匹配ROM  
	for(i=0;i<8;i++)
		DS18B20_WriteByte ( ds18b20_id [ i ] );	//写入ID数据
	
	DS18B20_WriteByte(0XBE);
	tplsb = DS18B20_ReadByte();		 
	tpmsb = DS18B20_ReadByte(); 
	
	s_tem = tpmsb<<8;
	s_tem = s_tem | tplsb;
	
	if( s_tem < 0 )
		f_tem = (~s_tem+1) * (-0.0625);	
	else
		f_tem = s_tem * 0.0625;
	
	return f_tem; 		
}

DS18B20 puede cambiar el tamaño de la resolución cambiando el valor binario de dos bits correspondiente en un registro de configuración de 8 bits en la memoria memo.
La estructura de la memoria de notas es como se muestra en la siguiente figura.
Inserte la descripción de la imagen aquí
La estructura del registro de configuración se muestra en la siguiente figura.

La resolución correspondiente del valor R1R0 se muestra en la siguiente tabla.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44625313/article/details/104099276
Recomendado
Clasificación