英创信息技术基于DS18B20测温系统解决思路

英创嵌入式主板以其优异的稳定性、独特的设计及方便使用等优点,在嵌入式领域占有一席之地。在工业现场,经常有监测环境温度的需求,本方案应用ds18b20为温度采集芯片,与英创嵌入式主板的gpio相连,就可以组成完整的测温系统。由于ds18b20每条总线上可以最多接8个测温点,那么英创嵌入式主板至少可以接64个测温点。
ds18b20数字温度计是dallas公司生产的1-wire即单总线器件,具有线路简单,体积小的特点。实际应用中不需要外部任何元器件即可实现测温,测量温度范围在-55°c到+125°c之间,数字温度计的分辨率用户可以从9位到12位选择;并且内部有温度上、下限告警设置,使用非常方便。
to-92封装的ds18b20的引脚排列见图1,其引脚功能描述见表1。
表1 ds18b20详细引脚功能描述:
序号
名称
引脚功能描述
1
gnd
地信号
2
dq
数据输入/输出引脚。开漏单总线接口引脚
当被用着在寄生电源下,也可以向器件提供电源
3
vdd
可选的vdd引脚。当工作于寄生电源时,此引脚必须接地
ds18b20的使用方法
由于ds18b20采用的是1-wire总线协议方式,即在一根数据线实现数据的双向传输,而对嵌入式主板来说,硬件上并不支持单总线协议,因此,我们必须采用gpio的方法来模拟单总线的协议时序来完成对ds18b20芯片的访问。在本示例中,只需把管脚2接英创嵌入式主板的gpio,管脚3接5v电源,管脚1接地,就可以搭建起测试环境,如图二所示。如果需要测试多点温度,可以把多个ds18b20并起。
由于ds18b20是在一根i/o线上读写数据,因此,对读写的数据位有着严格的时序要求。ds18b20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将嵌入式主板作为主设备,单总线器件作为从设备。每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件送回数据,在进行写命令后,主机需要启动读时序完成数据接收。数据和命令的传输都是低位在先。
下面是18b20的时序图,根据时序的要求,改变gpio的电平,可以完成18b20的操作。
ds18b20复位时序
根据以上ds18b20的时序,初始化的函数如下:
init18b20()
{
char flag;
outbit(1);
delayus(1);
outbit(0);
delayus(600); // 复位信号480—960us
outbit(1);
delayus(60); // 等待15-60us
if(readbit()) // 检查存在电平,如果为低,说明18b20正确复位
{
printf(‘init fail’);
return false; // detect 1820 fail!
}
else
{
sleep(1);
outbit(1);
return true; // detect 1820 success!
}
}
ds18b20的数据读写时通过时间间隙处理位和命令字来确认信息交换。
ds18b20的写时间隙
当主机把数据线从逻辑高电平拉到逻辑低电平的时候,写时间隙开始。有两种写时间隙:写1时间隙和写0时间隙。所有写时间隙必须最少持续60us,包括两个写周期间至少1us的恢复时间。
i/o线电平变低后,ds18b20在一个15us到60us的窗口内对i/o线采样。如果线上是高电平,就是写1,如果线上是低电平,就是写0。如图所示。
void ds18b20::writebyte(uchar wr)
{
uchar i;
outbit(1);
delayus(1);
for (i=0;i《8;i++) // 写8bit
{
outbit(0) ; // 总线拉低,写间隙开始
delayus(10); // 延时 2-12us
outbit(wr&0x01) ; // 写数据到总线
delayus(30); // 在15us-60us之间采用
outbit(1); // 释放总线
wr 》》= 1;
delayus(2);
}
sleep(1); // 字节之间最好间隔的稍微长一点
}
ds18b20的读时间隙
当从ds18b20读取数据时,主机生成读时间隙。当主机把数据线从高电平拉到低电平时,读时间隙开始,数据线必须保持至少1us;从ds8b20输出的数据在读时间隙的下降沿出现后15us内有效。对于ds18b20的读时隙是从主机把总线拉低之后,在15微秒之内就得释放单总线,以让ds18b20把数据传输到单总线上。ds18b20在完成一个读时序过程,至少要60us才能完成。
根据以上的读时序图,读字节函数如下:
uchar ds18b20::readbyte()
{
uchar i,u=0;
outbit(1);
delayus(1);
for(i=0;i《8;i++) // 读一字节
{
outbit(0) ; // 总线拉低,读间隙开始
delayus(2);
outbit(1) ; // 拉高总线
delayus(4); // 在1-14us之内读取总线数据
u 》》= 1;
if(readbit()==1) u |= 0x80;
delayus(60); // 读取数据周期至少60us
outbit(1) ;
}
return(u);
}
在读温度之前,要先启动温度转换,如果采用寄生电源供电,温度转换的时间应该大于500毫秒。对于一条总线的多个18b20来说,启动转换不需要匹配18b20的rom地址。
void ds18b20::startconvert()
{
init18b20 ();
writebyte(0xcc); // 跳过rom
writebyte(0x44); // 启动转换命令
}
在读指定的18b20时,就要先发匹配命令,再发rom序列号,具体请参考下面的程序:
void ds18b20::temperatuerresult(char id)
{
uchar i;
init18b20 ();
writebyte(0x55); // 匹配rom地址
for(i=0;i《8;i++) // 发18b20地址码
{
writebyte(b20rom[id][i]);
}
writebyte(0xbe); // 发读温度命令
read_bytes(2); // 前2个字节为温度值
temp=temp_buff[1]&0x0f; // 去掉符号位
temp=temp《《8;
temp=temp+temp_buff[0];
temperature=temp*0.0625; // 得到温度值
}

中国成全球4K卡位战最大市场 面板供应链升级迭代转型
iphone8什么时候上市最新消息:性能激增!iphone8不延期还有新配色,iphone7s不确定搭载A11处理器
苹果的5G版iPhone究竟何时才能推出
Perceptive Automata正在让自动驾驶汽车实现像人类一样的推理和判断
隔离式SPI通信变得简单
英创信息技术基于DS18B20测温系统解决思路
微软宣布新任首席可持续发展官
深圳国际先进制造与智能工厂展将于12月21日盛大召开
摩尔斯微电子在B轮融资中获得了来自澳洲养老基金和其他基金共计三千万澳元的追加融资
大疆无人机:如何从创客走到领跑者?
中国的空调市场正上演一场肉搏战 苏宁搅局格力与小米
怎么测量单相电机的电容好坏
配电网堪称电力传输“最后10公里” 配电网和能源互联网建设将全面提速
用晶体管设计电路使太阳能电板白天充电
解读分析亚洲各个国家的5G发展现状及对比
集电极和发射极的判别
星型结构拓扑的优缺点有哪些?
控制类寄存器的两种实现方式
华为禁令生效后中芯国际会给华为供货
深度解析数据存储技术发展趋势