几种数字传感器介绍(一)————温湿度传感器(HDC1080)

一、温湿度采集传感器(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)_第1张图片

HDC1080传感器管脚图:
几种数字传感器介绍(一)————温湿度传感器(HDC1080)_第2张图片
HDC1080的管脚较为简单,为3*3mm小型器件封装,总共有6个管脚:
SDA,SCL为IIC通信管脚,与单片机IIC接口相连,一般要求接上拉电阻,兼容5V和3.3V;
VDD,GND为电源和地管脚,VCC可接5V或3.3V电源;
NC为闲置管脚,一般悬浮或接地。

2.编程应用
IIC时序图:
几种数字传感器介绍(一)————温湿度传感器(HDC1080)_第3张图片
HDC1080作为从设备通过IIC总线与主机通信,由于HDC1080的地址固定为1000000(7位地址),IIC总线上不允许搭载多个HDC1080设备。芯片上电后至多15ms传感器便可进入工作状态,SCL时钟频率最小为10KHz,最大为400KHz。

读写传感器寄存器要将所需的寄存器地址值写入指针寄存器(指针值是从地址字节之后传输的第一个字节),即主机在发送从机寻址地址后,再发送需要具体操作的寄存器地址。对HDC1080的每次写入操作都需要指针寄存器的值,寄存器字节首先发送MSB,然后是LSB。HDC固定地址为七位二进制编码(1000000x),最后一位为读写标志位,10000000为写地址,10000001为读地址。
几种数字传感器介绍(一)————温湿度传感器(HDC1080)_第4张图片

如图为写命令时序图:
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();   									 //停止信号
}

几种数字传感器介绍(一)————温湿度传感器(HDC1080)_第5张图片
如图为读命令时序图:
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测量配置:
使用以下步骤测量温度和湿度,然后检索结果

  1. 在寄存器地址0x02中配置采集参数:
    (a)通过将位[12]设置为1,将采集模式设置为测量温度和湿度。
    (b) 设置所需的温度测量分辨率:–对于14位分辨率,将位[10]设置为0。–对于11位分辨率,将位[10]设置为1。
    (c) 设置所需的湿度测量分辨率:–对于14位分辨率,将位[9:8]设置为00。–对于11位分辨率,将位[9:8]设置为01。–将位[9:8]设置为10,以获得8位分辨率。
  2. 通过执行地址指针设置为0x00的指针写入转换来触发测量。
  3. 根据转换时间等待测量完成。
  4. 读取输出数据:在单个转换中,从寄存器地址0x00读取温度数据,然后从寄存器地址0x01读取湿度数据。

使用以下步骤只测量温度或只测量湿度,然后检索结果

  1. 在寄存器地址0x02中配置采集参数:
    (a)通过将位[12]设置为0,将采集模式设置为只测量温度或只测量湿度。
    (b) 设置所需的温度测量分辨率:–对于14位分辨率,将位[10]设置为0。–对于11位分辨率,将位[10]设置为1。
    (c) 设置所需的湿度测量分辨率:–对于14位分辨率,将位[9:8]设置为00。–对于11位分辨率,将位[9:8]设置为01。–将位[9:8]设置为10,以获得8位分辨率。
  2. 通过执行地址指针设置来触发测量。
    (a)地址指针设置为0x00转换来触发温度测量。
    (b)地址指针设置为0x01转换来触发湿度测量。
  3. 根据转换时间等待测量完成。
  4. 读取输出数据:在单个转换中,从寄存器地址0x00读取温度数据,从寄存器地址0x01读取湿度数据。

HDC寄存器地址:
几种数字传感器介绍(一)————温湿度传感器(HDC1080)_第6张图片

根据上述HDC测量配置,我们只需要定义;

# define HDC1080_TEMPERATURE	0x00
# define HDC1080_HUMIDITY		0x01
# define HDC1080_CONFIGURATION	0x02

使用到的配置寄存器描述(上述HDC1080测量配置中已有具体描述):
几种数字传感器介绍(一)————温湿度传感器(HDC1080)_第7张图片
温度寄存器为二进制格式的16位结果寄存器(2个LSB D1和D0始终为0)。采集结果始终为高14位值。结果的准确性与选择的转换时间有关,温度计算公式如下:
几种数字传感器介绍(一)————温湿度传感器(HDC1080)_第8张图片
湿度寄存器同样为二进制格式的16位结果寄存器(2个LSB D1和D0始终为0)。采集结果始终为高14位值。结果的准确性与选择的转换时间有关,相对湿度计算公式如下:
几种数字传感器介绍(一)————温湿度传感器(HDC1080)_第9张图片
根据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

你可能感兴趣的:(笔记,stm32,物联网,嵌入式硬件,arm)