DS18B20:是数字温度传感器;
直接将模拟温度传感器,AD转换,这些电路,集成成一个芯片;会自动的将温度获取,转化,存储在RAM中,我们只需要通过单总线通信协议读取RAM里面的值即可。
测温范围:-55℃ ~ +125℃
通信接口:1-Wire(单总线)
其他特征:可形成总线结构,内部有温度报警功能,可寄生供电(即可以不使用电源,直接接数据线和GND)
注意:DS18B20的数据传输线(单总线)DQ也在之外上拉一个电阻,作为总线的控制。与AT24C02一样,通过两条数据线:一个时钟线,一个数据线,连接各种设备。然后通过开漏输出,即置1为悬浮状态,来使得未选中的设备不进行连接干扰。然后在传输线之外连接两个上拉电阻,作为总线控制,没有设备连接之前,设备是悬浮状态,被上拉电阻拉到高电平;有设备连接,此设备即将SDA拉至低电平,从而进行传输;此时的DS18B20也采用这种方式,避免干扰,并且进数据传输。
DS18B20从左到右介绍
1.一个上拉电阻,实现总线的控制
2.一个寄生供电,可以不使用VDD,通过数据传输口DQ进行传输供电。
(1)正常使用VDD 进行供电,由VDD通过二极管,给右向箭头供电;如果VDD不进行供电,通过DQ进来,通过上面的二极管给右向箭头供电,然后下面Cpp电容可以起到电池作用,没有任何电源情况下(DQ也没有)可以放电进行供电。
(2)在给DQ高电平的时候,DQ是工作的,给电容充电(也连接一个电源Vpu),拉下来才是芯片开始工作;所以给高电平的时候,电源在工作,会给电容进行充电(DQ供电);然后在DQ低电平情况下,是没办法供电的,通过电容放电进行供电。
(3)如果我们使用寄生供电,我们需要进行大电流供应,需要给一个强上拉,从而产生强上拉进行供电。
可能:不使用VDD(使用寄生供电),高电平,只使用DQ进行电容充电,供电(也连接了一个电源);然后把DQ拉下进行工作,没有VDD进行供电,从而需要配置强上拉。
使用寄生供电,直接将VDD连接到GND
64-BIT ROM:只读存储器,只能读不能写(光刻)作为器件地址,用于总线通信寻址
(先找见 我要和哪个设备进行通信)如果只有一个设备的话,也可以不用这个器件地址(房子的大门)
内存控制逻辑:房子管家,进行交互。(如果发送写的命令给管家,会写入;如果是读,会将存储的数据放到总线上通信)
SCRATCHPAD(暂存器):放的是参数。(屋子内的物资)用于总线的数据交互
暂存器有关的设备:
温度传感器(模拟):自动将温度进行转换;当发出指令开始温度转换,这个温度传感器进行工作,将数据转换好,放在ROM里面,然后和管家进行交互,就可以读取温度。
报警触发器(EEPROM):存储温度触发值和配置参数(我们可以通过IIC总线进行设置和读取)
(掉电不丢失)
配置寄存器:设置分辨率和精度(最高:0.0625℃)只能配置两位有用,可以将精度降低(温度转换速度提升)
8-BIT CRC GENERATOR:校验码(CRC)生成器
暂存器:9个字节,分别存放不同的数据。
前两个字节存放温度:上电默认为85℃
Byte 2 3 4 :我们写入字节数据的时候,不能直接写入EEPROM中,我们需要先写入暂存器SCRATCHPAD中,然后再发送指令(可能类似iic通信的方式,发送一个字节,将暂存器中的数据发送到EEPROM中)
Byte 5 6 7:是保留字节,如果器件升级可能使用
Byte 8 :CRC,根据前面的8个字节,通过特定计算,算出校验位;我们将这些东西读出之后,进行一个相同计算,看是否得到这个校验位,从而进行验证数据传输的准确性。
获取温度流程:
1.发送温度转换指令,通过温度传感器将温度自动转换然后放入暂存器。
2.发送一条读暂存器的指令
3.读取时序
(通过时序指令,进行读取暂存器的数据)
二.单总线通信(如何发送指令,接收数据)
异步,半双工
异步:没有单独的时钟线
半双工:一根通信线,来回扮演发送端和接收端,IIC,单总线
异步:发送完事,不等你响应:串口通信,单总线;同步:发送之后,应答才进行下一步:IIC
1.单总线的电路规范(软硬件标准)
(1)设备的DQ均要配置成开漏输出模式
(2)DQ添加一个上拉电阻,阻值一般为4.7KΩ左右
(3)若此总线的从机采用寄生供电(没有VDD,用DQ供电,电容供电),则主机还应配置一个强上拉输出电路,增大输出电流。
下面是寄生供电,接一个MOS管(电子开关:低电平通,高电平:断)强上拉
直接接到VCC了,相当于DQ接到VCC,也有VCC供电
注意!!!!!!!
寄生供电,VDD接到地,通过数据端DQ的上拉通道对内部电容的预充电提供基本访问的供电,然后芯片内部做温度转换的过程需要抽取更多的电流,因此需要在发布转换命令后10us内将DQ拉到强供电端以提供转换电流。
发送完指令,我DQ置1,然后供电;执行完之后,我再置0,进行别的操作;
注意!!!!!!!
(写入数据,主机控制总线;读取数据,发出指令后,将总线控制权给与主机)
三.单总线时序结构
1.初始化:主机将总线拉低480us,然后释放总线,等待15us~60us后,存在的从机会拉低总线60us~240us以响应主机,之后从机释放总线(类似IIC的Start:开始传输了各位从机)
由于没有时钟,不能通过上升沿下降沿分辨,只能是拉低的时长进行响应
释放总线:是通过弱上拉进行将总线拉高,而不是人为置1(等待15us~60us,就是等待上拉电阻给拉到高电平)再从机进行响应(拉低,都是直接拉下来,回去是释放,慢慢收回去)然后释放。
(在从机拉低这段时间,会读取I/O口电平,来判断从机是否存在)
分为两个部分:复位,响应
发送一个字节:连续调用8次发送一位的时序,依次发送一个字节的8为(低位在前)
(IIC从高位到低位)
发送一位:主机将总线拉低60~120us,然后释放总线,表示发送0;主机将总线拉低1~15us,然后释放总线,表示发送1;从机将在总线拉低30us之后读取电平(如果此时仍是低电平,表示0;高点平则表示1),整个时间片应大于60us。
释放总线之后,需要给总线回复时间(不能太快):大于1us即可(C52最快1us,可以满足)不用考虑这个时间。
接收一位:主机将总线拉低1~15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us的末尾)读取低电平为0,高电平为1。
(60us发送一位,接收一位)
主机拉低,代表我开始读取数据;然后从机操控总线,进行数据发送;读取如果还是0,就说明从机把总线拉低,发送0,否则就是从机想发1,没有拉低总线。
注意:留给主机读取时间很少,因为从机可能随时释放总线,造成传输错误,所以要求贴近15us末尾。(主机会给从机留很长时间读取起码30us)
写入和读取都是从低位到高位。
DS18B20操作流程:
《1》初始化:从机复位,主机判断从机是否响应
《2》ROM操作:ROM指令+本指令所需要的读写操作 (进入大门;器件地址)
《3》功能操作:功能指令+本指令需要的读写操作(和管家交互,说我要什么数据??)访问暂存器里面存放的数据
《4》ROM指令:对全部设备进行操作
SEARCH ROM[F0h] : 搜寻ROM(器件地址)
READ ROM[33h]:读出ROM(器件地址)器件只有一个(只有一个DS18B020连接)直接读取设备地址,就可以读出
1.ROM指令:发送我到底对所有设备进行什么操作,找设备?读取某个设备的地址?匹配设备?
MATCH ROM[55h]:进行总线和通信设备进行匹配,然后发送我的设备地址,说明我和这个地址的设备进行交互。
SKIP ROM[CCh]:跳过ROM ,不对设备进行任何操作,因为只有一个设备,可以不用匹配,读取等待操作
ALARM SEARCH[ECh]:报警搜索(多个设备)如果有设备报警了,我们可以通过这个搜索,哪个设备进行报警了。
《5》功能指令:对选中设备进行读取写入等等操作
CONVERT[44h]:温度变换(管家?),我们发送这个指令,然后就开始温度转换,然后放入暂存器,以便我们读取;
WRITE SCRATCHPAD[4Eh]:写暂存器;然后我们在单总线放数据,然后加时序,会将数据写入到 Byte 2 3 4中存储
READ SCRATCHPAD[BEh]:读暂存器;读取暂存器的数据,读取转换的温度,将数据放总线上,然后跟时序,进行读取。(会将暂存器的内容全部读出,依次的,包括校验码 的8个字节)
我们只想读取温度,只读两个字节即可。
COPY SCRATCHPAD[48h]:将我们暂时写入暂存器中的 Byte 2 3 4 写入到EEPROM中
《这样才能实现掉电不丢失》
RECALL EEPROM[B8h]:掉电之后,暂存器的数据没有了;我们可以通过EEPROM中的数据,再回调到暂存器中。
READ POWER SUPPLY[B4h]:发完这个指令,后面跟着读取一位的时序,从而读取我们的供电方式(独立供电,寄生供电)
注意:有个感应供电(POWER SUPPLY SENSE)通过这个我们可以判断是否为寄生供电,如果是,平时进行常规操作,有电容供电就足够;但是我们在进行温度转换需要大电流的时候,我们要强上拉。
当我们发出功能指令:要求温度转换,会接通MOS管,实现强上拉,进行供电,来提供转换电流。
使用两个字节存储温度,不仅存储了整数,也存储了小数,还有正负符号。
MS LS 16位数据
前五位存储符号:温度为负(11111)温度为正(00000)
最后四位存小数:0.5 0.25 0.125 0.0625 (最高精度:0.0625)
中间七位存整数:2^7
以补码存储:
正数的补码就是其本身;
负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(也即在反码的基础上+1)
(将中间的数字取反,符号不变,+1就是实际的温度)变为原码(负数的原码补码变换是一样的)
正数的反码是其本身;
负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
DS18B20正常就是弱上拉和拉低总线,进行数据交互;在拉低总线的时候,寄生供电没有供电源,使用电容进行供电;当需要温度转换或者拷贝数据的时候,再接通MOS管,实现强上拉,提供电流,完成操作。(发送完温度转换或者拷贝命令,10us内强上拉,此时命令操作已经开始,给供电)
在读取暂存器的时候,可以中途提供复位指令,也就是初始化的那个指令(主机480us拉低,等待15~60us),从而在读取完前两个字节(温度)之后,就结束读取指令,否则就会一直读取字节,直到8字节全部读完!!!!然后接收CRC校验位的第九个字节