文章目录
一、HDC1080 简介
HDC1080是一款集成温度、湿度的数字传感器,以极低的功耗提供出色的测量精度,最高14Bit测量分辨率,相对湿度精度±2%,温度精度±0.2°C,在高湿度下具有优异的稳定性。传感器供电电压为2.7V至5.5V,具有较高的电压兼容性,是一种低成本,低功耗的替代竞争解决方案,广泛应用于常见温湿度测量应用场景。
二、引脚功能
上图的模块已自带上拉电阻,SDA SCL 引脚可直接到 IO 口
三、IIC时序
要访问HDC1080上的特定寄存器,将所需的寄存器地址值写入指针寄存器。该指针值是在从地址字节之后传输的第一个R/W位低的字节。对HDC1080的每个写操作都需要指针寄存器的值(参见图10)。
当从HDC1080读取时,写操作存储在指针中的最后一个值用于确定读操作访问哪个寄存器。要为读操作更改指针寄存器,必须向指针寄存器写入一个新值。这个事务是通过发出R/W位低的从地址字节,然后是指针字节来完成的。不需要额外的数据(参见图11)。
四、寄存器说明
4.1 寄存器地址映射
主要注意 0x00(温度数据) 0x01(湿度数据) 0x02(传感器配置),其余地址保存的ID信息可以不看
0x03到0xFA的寄存器地址保留,不能写入。HDC1080有一个8位指针,用于指定要访问的数据寄存器。指针标识哪个数据寄存器应响应在两线总线上执行的读写命令。每次写入命令时都会设置此寄存器。在执行读取命令之前,必须发出写入命令以设置指针以正确值。
4.2 温度寄存器(0x00)
温度寄存器是二进制格式的16位结果寄存器(2个LSBs D1和D0始终为0),采集结果始终为14位值。结果的准确性与所选择的转换时间有关。从输出数据可以计算出温度:
4.3 湿度寄存器(0x01)
湿度寄存器为二进制格式的16位结果寄存器(2个LSBs D1和D0始终为0),采集结果始终为14位值,而精度与所选择的转换时间有关。从输出数据可以计算出湿度:
4.4 配置寄存器(0x02)
字段 | Bits | 说明 |
---|---|---|
RST | [15] | 软件重置位。0:正常操作,此位自动清除,1:软件复位 |
Reserved | [14] | 0:预留,必须为0 |
HEAT | [13] | 加热功能。0:禁用加热,1:启用加热 |
MODE | [12] | 采样模式。0:温度或者湿度,1:温湿度依次采样,温度优先 |
BTST | [11] | 电池状态。0:电压>2.8V,1:电压<2.8V |
TRES | [10] | 温度测量分辨率。0:14 bit,1:11 bit |
HRES | [9:8] | 湿度测量分辨率。00:14 bit,01:11 bit,10:8 bit, |
Reserved | [7:0] | 0:预留,必须为0 |
五、驱动程序
hdc1080.c
#include "hdc1080.h"
#include "IIC.h"
#include "delay.h"
//**************************************
//向IIC设备写入一个字节数据
//**************************************
u8 Single_WriteI2C_byte(u8 Slave_Address,u8 REG_Address ,u8 data,u8 data1)
{
if(I2C_Start()==0) //起始信号
{I2C_Stop(); return RESET;}
I2C_SendByte(Slave_Address); //发送设备地址+写信号
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
I2C_SendByte(REG_Address); //内部寄存器地址,
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
I2C_SendByte(data); //内部寄存器数据,
I2C_WaitAck();
I2C_SendByte(data1);
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
I2C_Stop(); //发送停止信号
return SET;
}
//**************************************
//从IIC设备读取一个字节数据
//**************************************
u8 Single_ReadI2C(u8 Slave_Address,u8 REG_Address,u8 *REG_data,u8 length)
{
if(I2C_Start()==0) //起始信号
{I2C_Stop(); return RESET;}
I2C_SendByte(Slave_Address); //发送设备地址+写信号
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
I2C_SendByte(REG_Address); //发送存储单元地址
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
delay_ms(50); //延时一段时间,等待转换完成
if(I2C_Start()==0) //起始信号
{I2C_Stop(); return RESET;}
I2C_SendByte(Slave_Address+1); //发送设备地址+读信号
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
while(length--)
{
*REG_data++=I2C_RecvByte(); //读出寄存器数据
I2C_SendACK(0); //应答
}
REG_data = 0; //防止越界
I2C_SendACK(1); //发送停止传输信号
I2C_Stop(); //停止信号
return SET;
}
void hdc_Init(void)
{
Single_WriteI2C_byte(0x80,0x02,0x10,0x00); //禁用加热器 温湿度测量 精度都为14位
}
void hdc_Read(u8 *data)
{
Single_ReadI2C(0x80,0x00,data,4);//读取温湿度数据
}
main.c
/********************************************************************
STM32------HDC1080
PB6---SCL
PB7---SDA
STM32------USB-TTL
PA9---RX
PA10---TX
波特率115200
********************************************************************/
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "IIC.h"
#include "math.h"
#include "hdc1080.h"
u8 BUF[8];
float Tempreture,Humidity;
int main()
{
SystemInit();//系统时钟等初始化
delay_init();//延时初始化
NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200);//串口初始化
I2C_GPIO_Config();
delay_ms(100);
hdc_Init();//初始化配置
while(1)
{
hdc_Read(BUF);//开启测量 读出数据
Tempreture=(BUF[0]*256+BUF[1])/65536.0*165.0-40.0;//温湿度计算公式上文已经给出
Humidity=(BUF[2]*256+BUF[3])/65536.0;
printf("Humidity=%.1f Tempreture=%.1f\r\n",Humidity,Tempreture);
delay_ms(400);
}
}
六、实验现象