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

2023-05-16

一、温湿度采集传感器(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测量配置:
使用以下步骤测量温度和湿度,然后检索结果

  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寄存器地址:
在这里插入图片描述

根据上述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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

几种数字传感器介绍(一)————温湿度传感器(HDC1080) 的相关文章

  • 第七届蓝桥杯嵌入式(省赛)程序题

    第七届蓝桥杯 xff08 省赛 xff09 解读 43 程序 解读 xff1a 这里自己多读几遍设计任务以及要求再看下面 96 A 先搭总体框架 96 各初始化函数 96 LCD初始化 96 96 按键初始化 96 96 ADC初始化 96
  • STM32普通io口模拟pwm输出的三种方法

    STM32F103RB普通io口模拟pwm输出的第三种方法 xff08 周期占空比可调 xff09 第 xff08 一 xff09 种定时器中断产生pwm 96 第 xff08 一 xff09 种代码片 96 第 xff08 二 xff09
  • STM32 RS232通信实验

    stm32F103 RS232通信实验 什么是RS232 软件设计 完整工程下载 什么是RS232 先来看看UART传输所存在的问题 于是就有了RS232协议 这里注意使用的是负逻辑电平信号 在规定范围内的电平信号代表逻辑1或0 xff0c
  • MDK中变量无法添加到逻辑分析仪中原因

    MDK中变量无法添加到逻辑分析仪中原因 解决方法 去掉static 提示无法将变量添加到逻辑分析仪中 解决方法 去掉static 设置为bit 全速运行
  • 三,FreeRTOS之——动态创建多任务+优先级

    声明 xff1a 本专栏参考韦东山 xff0c 野火 xff0c 正点原子以及其他博主的FreeRTOS教程 xff0c 如若侵权请告知 xff0c 马上删帖致歉 xff0c 个人总结 xff0c 如有不对 xff0c 欢迎指正 动态创建多
  • ESP8266组网+STM32数据传输项目

    ESP8266 43 STM32数据传输项目 实验硬件 xff1a 项目关键词 xff1a 项目描述项目涉及知识 xff1a 1 ESP8266开发2 MQTT协议3 STM32 整体开发流程 xff1a 实验硬件 xff1a ESP826
  • 十一,FreeRTOS之——互斥信号量(优先级反转,优先级继承,递归锁)

    声明 xff1a 本专栏参考韦东山 xff0c 野火 xff0c 正点原子以及其他博主的FreeRTOS教程 xff0c 如若侵权请告知 xff0c 马上删帖致歉 xff0c 个人总结 xff0c 如有不对 xff0c 欢迎指正 互斥量理论
  • (一)裸机开发框架构建之---开发框架思想

    裸机开发框架构建 声明 xff1a 本专栏通过查阅资料以及自己对开发框架的理解所编写 xff0c 如有错误 xff0c 还请指正 为什么要使用框架 xff1f xff1f xff1f 我的框架分层思想体现 声明 xff1a 本专栏通过查阅资
  • PX4添加外置IMU传感器MPU-9250

    使用PX4 v1 13 2代码 xff0c 淘宝购买的MPU 9250传感器 MPU 9250 芯片架构图 实物图 手册 寄存器 https invensense tdk com wp content uploads 2015 02 RM
  • (二)裸机开发框架构建之---点灯大师

    裸机开发框架构建 3 设备管理层抽象出结构体初始化结构体第一种初始化方法 xff08 c89标准 xff09 第二种初始化方法 xff08 C99标准 xff09 2 硬件接口层1 硬件层硬件LED层初始化函数硬件层LED控制函数 4 应用
  • 1.freertos应用系列之cubemx创建freertos

    freertos应用全系列 xff08 写完关联更新 xff09 01 freertos应用系列之cubemx创建freertos 11 freertos应用系列之cubemx创建freertos 02 freertos应用系列之cubem
  • docker中镜像源推荐

    1 xff0c 个人建议使用 网易镜像源 镜像源有以下5种 1 网易 http hub mirror c 163 com 2 Docker中国区官方镜像 https registry docker cn com 3 ustc https d
  • VScode创建C++项目

    VScode创建C 43 43 项目 假设系统已经安装了MinGW64 插件 常用插件 创建Project 配置json文件 需要修改的地方都在下方注释说明 根据MinGW64安装位置进行修改 c cpp properties json s
  • C++的一个问题点,数组作为参数传递到函数之后,不能直接求出长度

    YU 原数组 xff0c 传递参数之后 结果是作为参数传进去之后是作为指针 xff0c 是不能求出长度的 xff0c 所以需要把长度提前求出作为参数传入该函数 反思 xff1a 最近C 43 43 Python xff0c java轮流用
  • 基于from flask import Flask,render_template 上传网页遇到的问题

    我们要上传多个页面形成一个网站 xff0c 首先我们需要在index xff08 一般这个都是首页面 xff09 查看其源码 找到类似 这段代码里面包括了前面的网站 xff0c 所以这时候我们只需要把它变成带使用的状态 xff0c 操作就是
  • 跨交换机的VLAN设置

    实现目标 xff1a 进行多台主机多个vlan接口进行互相通信 需要知识 xff1a 1 不同的vlan接口的是不能进行通信的 2 在要跨越多个交换机进行通信的时候要对进行交互的交换机进行共享vlan端口的设置 3 在设置网络号的时候应该注
  • Wireshark抓取cookie:用户名...,TCP报文等信息实战

    这里我们要先安装Wireshark xff0c 这里要注意的是一些低级版本刚刚下下来的时候是找不到网络接口的 xff0c 所以这时候要更新 xff0c 然后再下应该WinPro xff08 应该是这个 xff09 xff0c 之后就有网络接
  • 计算机网络知识点总结提纲(谢希仁)

    1 IOS OSI对王道书上的缩减总结 清晰pdf xff1a 链接 xff1a https pan baidu com s 1f6DqMsHky4kP8i9WQLvCew pwd 61 the3 提取码 xff1a the3 来自百度网盘
  • C++getline和 cin的探讨

    从结果可以看出 xff0c cin是会把空格部分舍弃的 如果是输入一个 然后空格在输入其他的 xff0c 因为cin默认把空格去调 xff0c 则后面的字符我的理解就是溢出 xff1f 所以报错了 getline功能就比较强大了 xff0c
  • Pixhawk RPi CM4 Baseboard 树莓派CM4安装Ubuntu20.04 server 配置ros mavros mavsdk

    文章目录 硬件安装Ubuntu Server20 04下载rpiboot工具下载imager刷写系统配置USB配置WIFI 开机安装桌面配置wifi配置串口安装ROS安装mavros安装MAVSDK PythonInternet设置最后 参

随机推荐

  • docker迁移镜像

    docker迁移本地镜像 本文为docker基本镜像操作之一 查看本镜像 docker images 迁移 xff08 拷贝 xff09 本地镜像到其他设备 1 打包 docker save o 路径 目标包名 tar 源镜像名 标签 2
  • C++Linux服务器学习之路——1

    前言 xff1a 为了让所学的计网知识融合于实际 xff0c 让操作系统里的理论去满足工程需求 xff0c 故通过借鉴30dayMakeServer的路线以及进行相应知识点的学习 part1 首先我们要理解socket 为应用层和传输层提供
  • 计网牛客刷图总结

    久不学忘记了 xff0c 1111 1111 61 255 xff0c ip地址是32位二进制组成 xff0c x 26就是说主机号有26位 xff0c 其他都是网络号 所以后面只有2位主机号 xff0c 234 61 11101010 x
  • C++力扣算法刷题算法分析

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • Invalid bound statement (not found)问题解决

    在网上基本的解决方案就是查看 namespace有没有对应 xff0c 但是我确定我的路径都是正确的 xff0c 如果发现这类问题可以先尝试确定路径的正确 之后如果还不行 xff0c 我们进行解决 xff1a 首先在target文件中查找是
  • C指针基础普及

    https www programiz com c programming c pointers 先放网站 xff0c 等我有时间再来补我的扩展
  • Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异)

    之前在培训新生的时候 xff0c windows环境下配置opencv环境一直教的都是网上主流的vs studio配置属性表 xff0c 但是这个似乎对新生来说难度略高 虽然个人觉得完全是他们自己的问题 xff0c 加之暑假之后对cmake
  • Spring Aop的使用(含示例)

    介绍 在软件业 xff0c AOP为Aspect Oriented Programming的缩写 xff0c 意为 xff1a 面向切面编程 xff0c 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术 AOP是OOP的延续
  • 超好用的开发工具-VScode插件EIDE

    EIDE介绍 一款适用于8051 STM8 Cortex M RSCv的单片机开发环境 在 vscode上提供8051 xff0c STM8 Cortex M xff0c RISC V 项目的开发编译烧录等功能 使用文档 xff1a 简介
  • 直流编码电机双闭环(速度+角度)控制

    目录 1 PID框图 2 pid控制器的表达式 3 传感器数据获取 4 硬件设计 5 工程配置 6 软件部分程序配置 7 调参过程记录 本文已更新 xff0c 加上曲线调试 xff0c 更好效果 xff0c 更多内容 xff0c 详情 xf
  • OPENMV配置记录(一)

    文章目录 1 刷写固件2 开始配置openmv3 图像获取与显示4 修改图像 xff0c 获取像素 xff0c 添加元素5 使用图像进行基本操作 颜色追踪6 xff0c 识别码7 模版匹配8 通过比例的方法来求解距离9 组合使用 正好回家带
  • 为什么你的软件编译时没问题,运行时却出错?—— Java 中的异常再复盘

    从开发工具谈起 xff1a 这是我平常用的几个编辑器 记得我刚开始学 C 语言 xff0c 学 Java 的时候 xff0c 还是用 Notepad 43 43 这种文本编辑器写代码 xff0c 老师说是为了打基础 xff0c 加深记忆 后
  • 使用stm32解析富斯i6接收机(IBUS)

    文章目录 1 通信协议解析说明2 驱动程序设计3 实测4 使用串口空闲中断 43 DMA接收5 源码 1 通信协议解析说明 常见的官方遥控器大概如下所示 xff1a 常用的搭配接收机 xff1a 这里需要注意的是 xff1a i6是可以刷十
  • 编码电机PID调试(速度环|位置环|跟随)

    文章目录 1 编码电机认识2 上位机波形显示1 功能介绍2 协议说明 3 速度环调试验证4 位置环调试验证5 实现跟随效果 前面的文章中有讲过编码电机串级PID相关的知识 xff0c 以及一些PID的调试经验 xff0c 这里我最近正好又把
  • 树莓派安装ubuntu mate记录

    文章目录 1 系统下载1 ubuntu下载2 ubuntu mate下载 2 系统安装3 系统使用1 ubuntu系统2 ubuntu mate系统 这个算个失败的记录贴吧 xff0c 这个系统安装过程不太流畅 xff0c 使用起来也有很多
  • 平衡小车的一些常见问题总结

    文章目录 1 基本理论2 直立环速度环串级pid3 代码差异的解释4 转向环 1 基本理论 PID控制 pid控制值对偏差进行比例 xff0c 积分和微分的控制 xff0c 分别是三个部分 xff0c 对应为比例单元 xff0c 积分单元和
  • Ubuntu下tar命令使用详解 .tar解压、.tar压缩

    1 tar参数选项2 tar压缩命令3 tar解压缩命令4 解压安装5 tar bz2解压缩命令6 Linux压缩和解压 bz2文件 bzip2 Linux tar 命令 在Linux平台 xff0c tar是主要的打包工具 tar命令通常
  • 裸机开发之驱动开发

    一 驱动开发的基础理解 在计算中 xff0c 设备驱动程序是一种计算机程序 xff0c 用于操作或控制连接到计算机的特定类型的设备 驱动程序提供了与硬件设备的软件接口 xff0c 使操作系统和其他计算机程序可以访问硬件功能 xff0c 而无
  • STM32HAL库使用ESP8266模块

    ESP8266模块是一个可是实现蓝牙和WiFi一体的模块 xff0c ESP8266 是一个完整且自成体系的 WiFi 网络解决方案 xff0c 能够独立运行 xff0c 也可以作为 slave 搭载于其他 Host 运行 ESP8266模
  • 几种数字传感器介绍(一)————温湿度传感器(HDC1080)

    一 温湿度采集传感器 xff08 HDC1080 xff09 1 简要概述 HDC1080是一种集成温度传感器的数字湿度传感器 xff0c 具有出色的测量精度和超低的功耗 其具有14位测量分辨率 xff0c 相对湿度精度为 2 温度精度为