ZHCAFX9 August   2025 HDC1010 , HDC1080 , HDC2010 , HDC2021 , HDC2022 , HDC2080 , HDC3020 , HDC3020-Q1 , HDC3021 , HDC3021-Q1 , HDC3022 , HDC3022-Q1 , HDC3120

 

  1.   1
  2.   摘要
  3.   商标
  4. 1简介
  5. 2数字 I2C 接口概述
    1. 2.1 寄存器映射协议
      1. 2.1.1 I2C 寄存器映射协议的快速概览
        1. 2.1.1.1 HDC1x
        2. 2.1.1.2 HDC2x
          1. 2.1.1.2.1 按需触发模式下的连接
          2. 2.1.1.2.2 使用自动测量模式 (AMM) 连接
    2. 2.2 命令协议
      1. 2.2.1 HDC302x
        1. 2.2.1.1 按需触发模式下的连接(单次触发)
        2. 2.2.1.2 自动测量模式 (AMM) 下连接
        3.       如何使用 CRC 校验测量数据
  6. 3模拟接口概述
    1. 3.1 HDC3120
  7. 4总结
  8. 5开发支持和文档
    1. 5.1 软件支持
    2. 5.2 参考资料
按需触发模式下的连接

在本例中,已将 HDC2010 传感器配置为按需触发(单次触发)模式,并禁用了自动测量模式 (AMM)。该过程首先写入配置寄存器 (0x0E),以将器件设置为按需触发模式。图 2-3 中提供了配置寄存器设置的图示。

表 2-4 配置寄存器 (0x0E)
字段类型复位说明
7SOFT_RESR/W00 = 正常工作模式,此位会自行清除
1 = 软复位
EEPROM 值重新加载且寄存器复位
[6:4]AMM[2:0]R/W000自动测量模式(AMM)
000 = 禁用。通过 I2C 启动测量
001 = 1/120Hz(每 2 分钟进行 1 次采样)
010 = 1/60Hz(每分钟进行 1 次采样)
011 = 0.1Hz(每 10 秒钟进行 1 次采样)
100 = 0.2Hz(每 5 秒钟进行 1 次采样)
101 = 1Hz(每秒钟进行 1 次采样)
110 = 2Hz(每秒钟进行 2 次采样)
111 = 5Hz(每秒钟进行 5 次采样)
3HEAT_ENR/W00 = 加热器关闭
1 = 加热器开启
2DRDY/INT_ENR/W0DRDY/INT_EN 引脚配置
0 = 高阻抗
1 = 启用
1INT_POLR/W0中断极性
0 = 低电平有效
1 = 高电平有效
0INT_MODER/W0中断模式
0 = 电平敏感型
1 = 比较器模式
 用于按需触发(单次触发)的配置寄存器图 2-3 用于按需触发(单次触发)的配置寄存器
Wire.beginTransmission(0x40); // initiate communication with HDC2x sensor
Wire.write(0x0E); // write to Config Register
Wire.write(0x00); // configure device to Trigger-On Demand
Wire.endTransmission();

接下来,按 图 2-4 中所示配置测量配置寄存器 (0x0F)。

测量配置寄存器定义以下内容:

  • 温度和湿度分辨率 (TRES 和 HRES)
  • 测量类型(仅温度,仅湿度,或两者)
  • 测量触发器 (MEAS_TRIG)
表 2-5 测量配置寄存器 (0x0F)
字段类型复位说明
7:6TRES[1:0]R/W00温度分辨率
00:14 位
01:11 位
10:9 位
11:不适用
5:4HRES[1:0]R/W00湿度分辨率
00:14 位
01:11 位
10:9 位
11:不适用
3RESR/W0保留
2:1MEAS_CONF[1:0]R/W00测量配置
00:湿度 + 温度
01:仅温度
10:NA
11:不适用
0MEAS_TRIGR/W0测量触发
0:无操作
1:开始测量
测量完成时自行清除位

图 2-4 提供了测量配置寄存器的图示。

 测量配置寄存器设置图 2-4 测量配置寄存器设置
Wire.beginTransmission(0x40); // initiate communication with HDC2x sensor

Wire.write(0x0F); // write to Measurement Config Register

Wire.write(0x01); // set output to 14-bit temperature/humidity data
                  // and trigger measurements

Wire.endTransmission();

在按需触发模式下,可以根据系统的需求将此序列放置在循环内以进行定期轮询。

要读取 HDC2x 的温度和湿度测量值,用户可以在两种可能的方法中进行选择。第一种方法是使用 TEMP_LOW/HUM_LOW 和 TEMP_HIGH/HUM_HIGH 分别读取/存储温度和湿度字节,并将 MSB 和 LSB 位组合为一个 16 位值,或在一个通信帧中突发读取多个字节,如以下湿度数据采集代码中所示:

读取测量数据

HDC2x 通过两个 8 位寄存器存储测量结果:

  • 湿度:HUM_LOW (0x02)、HUM_HIGH (0x03)
  • 温度:TEMP_LOW (0x00)、TEMP_HIGH (0x01)

一种方法是分别读取每个字节并将它们组合在一起:

uint16_t getHum() {

    // RH LSB Acquisition

    Wire.beginTransmission(0x40); // start communication with HDC2x
    Wire.write(0x02); // set a pointer for Humidity Low register (0x02)
    Wire.requestFrom(0x02, 2); // request 2 bytes from HDC2x
    uint8_t humLow = Wire.read(); // store Humidity LSB data
    Wire.endTransmission();

    // RH MSB Acquisition

    Wire.beginTransmission(0x40); // start communication with HDC2x
    Wire.write(0x03); // set a pointer for Humidity High register (0x03)
    Wire.requestFrom(0x40, 2); // request 2 bytes from HDC2x
    uint8_t humHigh = Wire.read(); // store Humidity MSB data
    Wire.endTransmission();

    // combine MSB and LSB into 16-bit integer and return value

    return ((uint16_t) humHigh << 8) | humLow;
                                          
}

不过,更有效的方法是从 LSB 寄存器一次突发读取两个字节:

uint16_t getHum2() {

    Wire.beginTransmission(0x40); // start communication with HDC2x
    Wire.write(0x02); // set a pointer for Humidity Low register (0x02)
    Wire.endTransmission(false);
    Wire.requestFrom(0x40, 2); // request 2 bytes from HDC2x

    uint8_t lsb = Wire.read(); // read and store LSB
    uint8_t msb = Wire.read(); // read and store MSB

    // adds MSB of data to an empty 16-bit variable
    // shifts 8 bits left, then "or" with LSB for final value

    return ((uint16_t) msb << 8) | lsb; 

}

此方法利用 HDC2x 的内部指针行为:从 HUMIDITY_LOW 寄存器读取 LSB 后,指针自动递增到 MSB 的 HUMIDITY_HIGH 寄存器。同样的机制也适用于读取温度。

请访问以下链接,查看 HDC2x 在按需触发模式下的完整示例代码。