STM32 —— 温湿度( AHT20 )传感器入门
STM32 —— 温湿度( AHT20 )传感器入门
![](https://img2022.cnblogs.com/blog/2829072/202211/2829072-20221117165031931-1111896889.png)
温湿度的具体使用方法可以看官方给出的基于 STM32 的历程,这里只进行简单介绍
官方历程如下:
简介
DHT20 是 DHT11 的全新升级产品,配置了专用的 ASIC 传感器芯片、高性能的半导体硅基电容式湿度传感器和一个标准的片上温度传感器,并使用了标准 I²C 数据输出信号格式。其性能已经大大提升,并且超过了前一代传感器( DHT11 )的可靠性水平。新一代升级产品,经过改进使其在高温高湿环境下的性能更稳定;同时,产品的精度、响应时间、测量范围都得到了大幅的提升。每一个传感器的出厂都经过严格的校准和测试,保障并满足客户的大规模应用
完全标定
数字输出,IIC 接口
优异的长期稳定性
响应迅速、抗干扰能力强
宽电压支持 2.2-5.5 VDC
传感器性能
相对湿度
湿度特性表:
参数 | 条件 | 最小 | 典型 | 最大 | 单位 |
---|---|---|---|---|---|
分辨率 | 典型 | - | 0.024 | - | %RH |
精度误差 | 典型 | - | +3/-3 | - | %RH |
精度误差 | 最大 | 如下图 | 如下图 | - | %RH |
重复性 | - | - | +0.1/-0.1 | - | %RH |
迟滞 | - | - | +1/-1 | - | %RH |
非线性 | - | - | <0.1 | - | %RH |
响应时间 | τ63% | - | <8 | - | S |
工作范围 | - | 0 | - | - | %RH |
长时间漂移 | 正常 | - | <0.5 | 100 | %RH |
25℃ 时相对湿度的典型误差和最大误差:
![](https://img2022.cnblogs.com/blog/2829072/202211/2829072-20221117164154167-226521088.png)
温度
温度特性表:
分辨率 | 条件 | 最小 | 典型 | 最大 | 单位 |
---|---|---|---|---|---|
分辨率 | 典型 | - | 0.01 | - | ℃ |
精度误差 | 典型 | - | +0.5/-0.5 | - | ℃ |
精度误差 | 最大 | 如下图 | 如下图 | - | ℃ |
重复性 | - | - | +0.1/-0.1 | - | ℃ |
迟滞 | - | - | +0.1/-0.1 | - | ℃ |
响应时间 | τ63% | 5 | - | 30 | S |
工作范围 | - | -40 | - | 80 | ℃ |
长时间漂移 | - | - | <0.04 | - | ℃/yr |
温度典型误差和最大误差:
![](https://img2022.cnblogs.com/blog/2829072/202211/2829072-20221117164927356-532236020.png)
电器特性
电气特性表:
参数 | 条件 | 最小 | 典型 | 最大 | 单位 |
---|---|---|---|---|---|
供电电压 | 典型 | 2.2 | 3.3 | 5.5 | V |
供电电流 IDD | 休眠 | - | 250 | - | nA |
供电电流 IDD | 测量 | - | 980 | - | µA |
功耗 | 休眠 | - | - | 0.8 | µW |
功耗 | 测量 | - | 3.2 | - | mW |
通讯协议:IIC
接口定义
![](https://img2022.cnblogs.com/blog/2829072/202211/2829072-20221117165656783-528960596.png)
- 电源引脚 VDD GND :
DHT20的供电范围为 2.2-5.5 V ,VDD 接电压输入,GND 接地
- 串行时钟 SCL:
SCL 用于微处理器与 DHT20 之间的通讯同步。由于接口包含了完全静态逻辑,因而不存在最小 SCL 频率
- 串行数据 SDA:
SDA 引脚用于传感器的数据输入和输出。当向传感器发送命令时,SDA 在串行时钟( SCL )的上升沿有效,且当 SCL 为高电平时,SDA 必须保持稳定。在 SCL 下降沿之后,SDA 值可被改变。为确保通信安全,SDA 的有效时间在 SCL 上升沿之前和下降沿之后应该分别延长至 TSU and THO 。当从传感器读取数据时,SDA 在 SCL 变低以后有效( TV ),且维持到下一个 SCL 的下降沿
应用电路接线图:
![](https://img2022.cnblogs.com/blog/2829072/202211/2829072-20221117195735280-1321229891.png)
为避免信号冲突,微处理器( MCU )必须只能驱动 SDA 和 SCL 在低电平。需要一个外部的上拉电阻(例如:4.7kΩ)将信号提拉至高电平。上拉电阻已包含在 DHT20 的微处理器的 I/O 电路中
注意:
-
产品在电路使用中主机 MCU 的供电电压必须与传感器一致
-
如需进一步提高系统的可靠性,可以对传感器电源加以控制
-
系统刚上电时,优先给传感器 VDD 供电,5ms 后才可以设置 SCL 和 SDA 高电平
电气特性
绝对最大额定值
前面已经给出了 DHT20 的电气特性,下表将给出绝对最大额定值仅为应力额定值和提供更多的信息
参数 | 最小 | 最大 | 单位 |
---|---|---|---|
VDD to GND | -0.3 | 5.5 | V |
数字 I/O 引脚( SDA ,SCL ) to GND | -0.3 | VDD+0.3 | V |
每个引脚的输入电流 | -10 | 10 | mA |
在这样的条件下,该装置进行功能操作是不可取的。长时间暴露于绝对最大额定值条件下,可能影响传感器的可靠性
ESD 静电释放符合 JEDECJESD22-A114 标准(人体模式 ±4kV ),JEDECJESD22-A115(机器模式 ±200V )。如果测试条件超出标称限制指标,传感器需要加额外的保护电路
输入/输出特性
电气特性,如功耗、输入和输出的高、低电平电压等,依赖于电源供电电压。为了使传感器通讯顺畅,很重要的一点是,确保信号设计严格限制在本篇博客表中和图中给出的数据范围内)
数字输入输出焊盘的直流特性表:
参数 | 条件 | 最小 | 典型 | 最大 | 单位 |
---|---|---|---|---|---|
输出低电压 VOL | VDD = 3.3V,-4mA<IOL<0mA | 0 | - | 0.4 | V |
输出高电压 VOH | 70%VDD | - | VDD | V | |
输出汇点电流 IOL | - | - | -4 | mA | |
输入低电压 VIL | 0 | - | 30%VDD | V | |
输入高电压 VIH | 70%VDD | - | VDD | V | |
输入电流 | VDD = 5.5V,VIN = 0V to 5.5V | - | - | +1/-1 | uA |
如无特殊声明,VDD = 2.2V to 5.5V ,T = -40°C to 80°C
数字输入/输出端的时序图:
![](https://img2022.cnblogs.com/blog/2829072/202211/2829072-20221117201644609-519185048.png)
IIC 快速模式数字输入/输出端的时序特性表:
![](https://img2022.cnblogs.com/blog/2829072/202211/2829072-20221117202144436-1441301829.png)
传感器通讯
启动传感器
第一步,将传感器上电,电压为所选择的 VDD 电源电压(范围介于 2.2V 与 5.5V 之间)。上电后传感器需要不少于 100ms 稳定时间(此时 SCL 为高电平)以达到空闲状态即做好准备接收由主机( MCU )发送的命令
启动/停止时序
每个传输序列都以 Start 状态作为开始并以 Stop 状态作为结束
下图为启动传输状态(S)-当 SCL 为高电平时,SDA 由高电平转换为低电平。开始状态是由主机控制的一种特殊的总线状态,指示从机传输开始( Start 之后,BUS 总线一般被认为处于占线状态)
![](https://img2022.cnblogs.com/blog/2829072/202211/2829072-20221117202532091-1668159481.png)
下图为停止传输状态(P)-当 SCL 高电平时,SDA 线上从低电平转换为高电平。停止状态是由主机控制的一种特殊的总线状态,指示从机传输结束( Stop 之后,BUS 总线一般被认为处于闲置状态)
![](https://img2022.cnblogs.com/blog/2829072/202211/2829072-20221117202631924-1873766779.png)
发送命令
在启动传输后,随后传输的 IIC 首字节包括 7 位的 I²C 设备地址 0x38 和一个 SDA 方向位 x (读 R:‘1',写 W:‘0’)。在第 8 个 SCL 时钟下降沿之后,通过拉低 SDA 引脚( ACK 位),指示传感器数据接收正常。在发送测量命令 0xAC 之后,MCU 必须等到测量完成
![](https://img2022.cnblogs.com/blog/2829072/202211/2829072-20221117203059326-975098411.png)
状态位说明表:
比特位 | 意义 | 描述 |
---|---|---|
Bit[7] | 忙闲指示 | 1--设备忙,处于测量状态 0--设备闲,处于休眠状态 |
Bit[6:5] | 保留 | 保留 |
Bit[4] | 保留 | 保留 |
Bit[3] | 校准使能位 | 1--已校准 0--未校准 |
Bit[2:0] | 保留 | 保留 |
注意:在第一步的校准状态检验只需要上电时检查,在正常采集过程无需操作
传感器读取流程
-
上电后要等待不少于 100ms ,读取温湿度值之前,通过发送 0x71 获取一个字节的状态字,如果状态字和 0x18 相与后不等于0x18,初始化 0x1B、0x1C、0x1E 寄存器,详细初始化流程可以参考官网历程,已经给出相关代码;如果相等,执行下一步
-
等待 10ms 发送 0xAC 命令(触发测量),此命令参数有两个字节,第一个字节为 0x33 ,第二个字节为 0x00
-
等待 80ms 待测量完成,如果读取状态字 Bit[7] 为 0 ,表示测量完成,然后可以连续读取六个字节;否则继续等待
-
当接收完六个字节后,紧接着下一个字节是 CRC 校验数据,用户可以根据需要读出,如果接收端需要 CRC 校验,则在接收完第六个字节后发 ACK 应答,否则发 NACK 结束,CRC 初始值为 0XFF ,CRC8 校验多项式为:CRC[7:0] = \(1+x^4+x^5+x^8\)
-
计算温湿度值。
注意:在第一步的校准状态检验只需要上电时检查,在正常采集过程无需操作
![](https://img2022.cnblogs.com/blog/2829072/202211/2829072-20221117204027616-1466625990.png)
注意:传感器在采集时需要时间,主机发出测量指令( 0xAC )后,延时 80 毫秒以上再读取转换后的数据并判断返回的状态位是否正常。若状态比特位 [Bit7] 为 0 代表数据可正常读取,为 1 时传感器为忙状态,主机需要等待数据处理完成
信号转换
相对湿度转换
相对湿度 RH 都可以根据 SDA 输出的相对湿度信号 SRH 通过如下公式计算获得(结果以 %RH 表示)
温度转换
温度 T 都可以通过将温度输出信号 ST 代入到下面的公式计算得到(结果以温度 ℃ 表示)
环境稳定性
如果传感器用于装备或机械中,要确保用于测量的传感器与用于参考的传感器感知的是同一条件的温度和湿度。如果传感器被放置于装备中,反应时间会延长,因此在程序设计中要保证预留足够的测量时间。DHT20 传感器依据奥松温湿度传感器企业标准进行测试。传感器在其它测试条件下的表现,我们不予保证,且不能作为传感器性能的一部分
代码设计
官方给出的函数如下,这里只需要在我们使用的时候直接调用即可:
#ifndef _AHT20_DEMO_
#define _AHT20_DEMO_
#include "stm32f10x.h"
void Delay_N10us(uint32_t t);//延时函数
void SensorDelay_us(uint32_t t);//延时函数
void Delay_4us(void); //延时函数
void Delay_5us(void); //延时函数
void Delay_1ms(uint32_t t);
void AHT20_Clock_Init(void); //延时函数
void SDA_Pin_Output_High(void) ; //将PB15配置为输出 , 并设置为高电平, PB15作为I2C的SDA
void SDA_Pin_Output_Low(void); //将P15配置为输出 并设置为低电平
void SDA_Pin_IN_FLOATING(void); //SDA配置为浮空输入
void SCL_Pin_Output_High(void); //SCL输出高电平,P14作为I2C的SCL
void SCL_Pin_Output_Low(void); //SCL输出低电平
void Init_I2C_Sensor_Port(void); //初始化I2C接口,输出为高电平
void I2C_Start(void); //I2C主机发送START信号
void AHT20_WR_Byte(uint8_t Byte); //往AHT20写一个字节
uint8_t AHT20_RD_Byte(void);//从AHT20读取一个字节
uint8_t Receive_ACK(void); //看AHT20是否有回复ACK
void Send_ACK(void) ; //主机回复ACK信号
void Send_NOT_ACK(void); //主机不回复ACK
void Stop_I2C(void); //一条协议结束
uint8_t AHT20_Read_Status(void);//读取AHT20的状态寄存器
uint8_t AHT20_Read_Cal_Enable(void); //查询cal enable位有没有使能
void AHT20_SendAC(void); //向AHT20发送AC命令
uint8_t Calc_CRC8(uint8_t *message,uint8_t Num);
void AHT20_Read_CTdata(uint32_t *ct); //没有CRC校验,直接读取AHT20的温度和湿度数据
void AHT20_Read_CTdata_crc(uint32_t *ct); //CRC校验后,读取AHT20的温度和湿度数据
void AHT20_Init(void); //初始化AHT20
void JH_Reset_REG(uint8_t addr);///重置寄存器
void AHT20_Start_Init(void);///上电初始化进入正常测量状态、
注意:这里我们两次获取温度的间隔最好不小于 1.5s ,否则会导致温度不准或传输错误数据等结果