一、温湿度采集传感器(HDC1080)
1.简要概述
HDC1080是一种集成温度传感器的数字湿度传感器,具有出色的测量精度和超低的功耗。其具有14位测量分辨率,相对湿度精度为±2%,温度精度为±0.2°C,工作时平均电流在0.7-1.3uA级。
传感器供电电压为2.7V至5.5V,具有较高的电压兼容性,通过单片机读取数据一般不再需要额外设置电平转换控制芯片,其可以应用在温度监测控制系统、医疗设备、大型家用电器和手测计量表等领域。
TI官网数据手册:HDC1080 具有温度传感器的低功耗、高精度数字湿度传感器 数据表 (Rev. A)
图为传感器功能框图和典型应用,采用3.3V电源供电,数据线(SDA)和时钟线(SCL)可接10kΩ上拉电阻。
HDC1080传感器管脚图:
HDC1080的管脚较为简单,为3*3mm小型器件封装,总共有6个管脚:
SDA,SCL为IIC通信管脚,与单片机IIC接口相连,一般要求接上拉电阻,兼容5V和3.3V;
VDD,GND为电源和地管脚,VCC可接5V或3.3V电源;
NC为闲置管脚,一般悬浮或接地。
2.编程应用
IIC时序图:
HDC1080作为从设备通过IIC总线与主机通信,由于HDC1080的地址固定为1000000(7位地址),IIC总线上不允许搭载多个HDC1080设备。芯片上电后至多15ms传感器便可进入工作状态,SCL时钟频率最小为10KHz,最大为400KHz。
读写传感器寄存器要将所需的寄存器地址值写入指针寄存器(指针值是从地址字节之后传输的第一个字节),即主机在发送从机寻址地址后,再发送需要具体操作的寄存器地址。对HDC1080的每次写入操作都需要指针寄存器的值,寄存器字节首先发送MSB,然后是LSB。HDC固定地址为七位二进制编码(1000000x),最后一位为读写标志位,10000000为写地址,10000001为读地址。
如图为写命令时序图:
1.主机发出起始信号,发送7位从设备地址和写寄存器命令,从机接收后发出应答信号
2.主机发送8位寄存器地址,从机接收并发出应答信号
3.主机发送高八位数据,从机接收并发出应答信号
4.主机发送低八位数据,从机接收并发出应答信号,主机发出停止信号。
根据上述写寄存器时序,可以编写HDC1080写函数:
void HDC1080_WriteReg(u8 Addr,u16 Data)
{
unsigned char data[2];
data[0] = (uint8_t)((Data& 0xFF00) >> 8); //高八位数据
data[1] = (uint8_t)(Data & 0x00FF); //低八位数据
IIC_Start();
IIC_Send_Byte(0x80); //地址为10000000,写寄存器
IIC_Wait_Ack(); //等待从机应答信号
IIC_Send_Byte(Addr); //写寄存器地址
IIC_Wait_Ack();
IIC_Send_Byte(data[0]); //发送高八位数据
IIC_Wait_Ack();
IIC_Send_Byte(data[1]); //发送低八位数据
IIC_Wait_Ack();
IIC_Stop(); //停止信号
}
如图为读命令时序图:
1.主机发出起始信号,发送7位从设备地址和写寄存器命令,从机接收后发出应答信号
2.主机发送需要读取的寄存器地址,从机接收后返回应答信号
3.主机发出起始信号,发送7位从设备地址和读寄存器命令,从机接收发出应答信号
4.从机发送,主机接收高八位数据并发出应答信号
5.从机发送,主机接收低八位数据并发出应答信号,主机发出停止传输信号
根据上述读寄存器时序,可以编写HDC1080读函数:
u16 HDC1080_ReadReg(u8 Addr)
{
unsigned char bytes[2];
u16 data; //需要接收的16位数(2字节)
IIC_Start();
IIC_Send_Byte(0x80); //地址为10000000,写地址
IIC_Wait_Ack();
IIC_Send_Byte(Addr); //需要读取的寄存器地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0x81); //地址为10000001,读地址
IIC_Wait_Ack();
bytes[1]=IIC_Read_Byte(1); //读取高八位数据
bytes[0]=IIC_Read_Byte(1); //读取低八位数据
IIC_NAck();
IIC_Stop();
data=(bytes[1]<<8)+bytes[0];
return data; //返回16位数据
}
HDC1080测量配置:
使用以下步骤测量温度和湿度,然后检索结果
使用以下步骤只测量温度或只测量湿度,然后检索结果
根据上述HDC测量配置,我们只需要定义;
# define HDC1080_TEMPERATURE 0x00
# define HDC1080_HUMIDITY 0x01
# define HDC1080_CONFIGURATION 0x02
使用到的配置寄存器描述(上述HDC1080测量配置中已有具体描述):
温度寄存器为二进制格式的16位结果寄存器(2个LSB D1和D0始终为0)。采集结果始终为高14位值。结果的准确性与选择的转换时间有关,温度计算公式如下:
湿度寄存器同样为二进制格式的16位结果寄存器(2个LSB D1和D0始终为0)。采集结果始终为高14位值。结果的准确性与选择的转换时间有关,相对湿度计算公式如下:
根据HDC1080测量配置,可写HDC1080读取温湿度函数:
void HDC1080_ReadTempHumidity(void)
{
uint16_t temp_data;
uint16_t humidity_data;
HDC1080_WriteReg(HDC1080_CONFIGURATION,0x3000); //写配置寄存器为0x3000,测量温度和湿度,精度均为14位
HDC1080_ReadReg(HDC1080_TEMPERATURE); //配置指针地址为00,触发温度湿度测量
delay_ms(20); //延时20ms,等待转换完成
temp_data=HDC1080_ReadReg(HDC1080_TEMPERATURE); //获取温度数据
humidity_data=HDC1080_ReadReg(HDC1080_HUMIDITY); //获取湿度数据
temperature=(float)165*temp_data/65536-40; //温度转换
humidity=(float)100*humidity_data/65536; //湿度转换,这里温湿度定义为全局变量
}
(使用STM F1系列单片机)
HDC1080.h文件可定义为:
#ifndef __HDC1080_H
#define __HDC1080_H
#include "iic.h"
#include "delay.h"
//寄存器地址
# define HDC1080_TEMPERATURE 0x00
# define HDC1080_HUMIDITY 0x01
# define HDC1080_CONFIGURATION 0x02
extern float temperature,humidity; //定义温湿度全局变量
void HDC1080_WriteReg(u8 Addr,u16 Data); //HDC1080写函数
u16 HDC1080_ReadReg(u8 Addr); //HDC1080读函数
void HDC1080_ReadTempHumidity(void); //HDC1080获取温湿度
#endif
HDC1080.c文件可定义为:
#include "HDC1080.h"
float temperature,humidity;
void HDC1080_WriteReg(u8 Addr,u16 Data)
{
unsigned char data[2];
data[0] = (uint8_t)((Data& 0xFF00) >> 8); //高八位数据
data[1] = (uint8_t)(Data & 0x00FF); //低八位数据
IIC_Start();
IIC_Send_Byte(0x80); //地址为10000000,写寄存器
IIC_Wait_Ack(); //等待从机应答信号
IIC_Send_Byte(Addr); //写寄存器地址
IIC_Wait_Ack();
IIC_Send_Byte(data[0]); //发送高八位数据
IIC_Wait_Ack();
IIC_Send_Byte(data[1]); //发送低八位数据
IIC_Wait_Ack();
IIC_Stop(); //停止信号
}
u16 HDC1080_ReadReg(u8 Addr)
{
unsigned char bytes[2];
u16 data; //需要接收的16位数(2字节)
IIC_Start();
IIC_Send_Byte(0x80); //地址为10000000,写地址
IIC_Wait_Ack();
IIC_Send_Byte(Addr); //需要读取的寄存器地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0x81); //地址为10000001,读地址
IIC_Wait_Ack();
bytes[1]=IIC_Read_Byte(1); //读取高八位数据
bytes[0]=IIC_Read_Byte(1); //读取低八位数据
IIC_NAck();
IIC_Stop();
data=(bytes[1]<<8)+bytes[0];
return data; //返回16位数据
}
void HDC1080_ReadTempHumidity(void)
{
uint16_t temp_data;
uint16_t humidity_data;
HDC1080_WriteReg(HDC1080_CONFIGURATION,0x3000); //写配置寄存器为0x3000,测量温度和湿度,精度均为14位
HDC1080_ReadReg(HDC1080_TEMPERATURE); //配置指针地址为00,触发温度湿度测量
delay_ms(20); //延时20ms,等待转换完成
temp_data=HDC1080_ReadReg(HDC1080_TEMPERATURE); //获取温度数据
humidity_data=HDC1080_ReadReg(HDC1080_HUMIDITY); //获取湿度数据
temperature=(float)165*temp_data/65536-40; //温度转换
humidity=(float)100*humidity_data/65536; //湿度转换,这里温湿度定义为全局变量
}
其他更详尽的资料请自行参考数据手册。
参考资料:
1.HDC1080数据手册(文中插图均来自数据手册),代码为本人编写。
2.参看AnthonyYMH的博客可能对理解有所帮助:HDC1080温湿度驱动 IIC I2C STM32