DS18B20是一种数字温度传感器,使用广泛。很多人在使用时常常会遇到一个疑惑,就是为什么在读取DS18B20的温度数据时需要进行除以16的操作。其实,这并不是DS18B20独有的问题,在数字电路中,很多使用16位或以上数据位宽的芯片,都需要在读取数据时进行类似的处理。下面从几个方面对这个问题进行分析。
DS18B20数字温度传感器的输出精度为0.5℃/LSB(LSB即least significant bit),也就是说一次转换结果为12bit,最高位为符号位,剩下11位为温度数据,可以表示2^11=2048种不同的温度值。而温度数据在传输中必须以字节为单位进行处理,也就是说需要将11位的温度数据压缩为1个字节的数据进行传输。这个过程中需要选择一种压缩的方式,常用的方式有4种:
可以发现,除以16压缩方式可以最大限度地挖掘出8个位的存储空间,并且节省了硬件资源,因此在DS18B20中使用除以16的压缩方式对温度数据进行存储和传输。
DS18B20数字温度传感器采用1线总线方式进行通信,采用的是异步串行通信方式,数据帧格式如下图所示:
当DS18B20进行温度转换获取温度数据后,要通过总线传输到主机,其传输过程存在干扰噪声,从而导致误码率的增加。干扰会导致数据不准确,而为了提高数据传输的准确性和可靠性,一种常用的方法就是采用冗余校验码进行校验。DS18B20采用CRC校验的方式进行校验,当要进行数据校验时需要进行复杂的高精除法计算,而为了节省DSP和CPU的处理资源,一种常用的做法就是在DS18B20中将读到的温度数据除以16,然后把结果的整数部分和小数部分分别作为CRC校验的高8位和低8位,这样就可以使用简单的异或运算得到数据校验码,以起到简化计算和提高传输可靠性的效果。
DS18B20数字温度传感器可以测量的温度范围为-55℃到+125℃,而在实际使用中除了需要将温度数据转换为实际的温度值之外,还需要将其转换为合适的工程单位。例如对于工业应用来说,温度单位可能是摄氏度、华氏度、开尔文等。对于DS18B20中的除以16问题,也需要结合采用的温度单位来进行判断。
例如,在摄氏度的使用中,需要将读到的温度数据除以16,然后将其转换为摄氏度计算。因为温度数据的转换区间是-55℃到+125℃,那么除以16后得到的温度数据区间是-3.4375℃到+7.8125℃,符合摄氏度的分度值和使用范围。同样在华氏度或开尔文的使用中也需要进行类似的转换。