因为一个项目用到了DS18B20温度传感器,刚开始使用之处,第一次对单线传感器进行控制,毫无经验,也是碰了一头灰,摔了一些坑。总结一下使用心得。
DS18B20是单线数字化温度传感器。温度采集的控制接口为1位,通过该位可进行温度数据的读取,以及9~12位分辨率的设置,对应的精度为0.5°C ~0.01625°C。
下面是初始化的时序图。
初始化DS18B20模块,首先通过拉低模块配置信号dq,拉低时间大于480us,完成DS18B20的初始化,检测到DS18B20反馈的存在脉冲之后,开始配置DS18B20。
由于我在使用过程中是单独对一个18B20片子进行操作,因此跳过rom序列的查找功能。整体操作流程如下:
1) 通过模块配置信号dq写入CC命令,跳过DS18B20的rom匹配,由于此应用中一根dq配置线只接了一个DS18B20温度转换器,不需查找匹配rom序列。
2)通过模块配置信号dq写入44命令,启动温度转换。
3)系统采用DS18B20默认的12位精度,温度转换所需时间最大750ms,因此通过状态机等待750ms,等待转换完毕。
4)通过模块配置信号dq写入BE命令,读取DS18B20中暂存寄存器内的温度数据。
5) 暂存寄存器值送入CRC校验模块,检测CRC校验模块反馈标志,若CRC校验正确,则更新温度数据,否则,不更新温度数据。
其中注意:
检测反馈回来的存在脉冲,可采取多次采集,3取2的方式滤波,滤掉毛刺或虚假信号。
写时间片注意:
1、dq输出低电平保持79us,然后dq输出高阻状态2us;(dq被拉低的79us状态,完成写0的操作);
2、dq输出低电平保持9us,然后dq输出高阻状态73us;(释放总线的同时,18b20通过上拉电阻拉高dq总线,完成写1的操作)。
读时间片:
拉低dq总线5us,然后释放dq总线5us,读取18b20反馈到dq总线上的温度数据;
严格按照DS18B20时序(可适当放宽时序,不过要注意在正确区间取数)进行读写操作以及流程控制。