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.
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.
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.
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;
}
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;
}
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:
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.
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.