手把手教你用CH32的软件I2C驱动合泰BH45B1225 24位ADC(附完整工程)
2026/6/11 5:06:51 网站建设 项目流程

手把手教你用CH32的软件I2C驱动合泰BH45B1225 24位ADC(附完整工程)

在低功耗传感器项目中,高精度ADC的选择往往让开发者陷入两难:进口芯片价格高昂且供货不稳定,国产芯片又缺乏详细的技术文档支持。合泰BH45B1225作为一款24位Δ-Σ ADC,凭借其1.25V内部基准和工频抑制特性,成为电池供电设备的理想选择。本文将基于CH32系列MCU,通过GPIO模拟I2C时序实现与BH45B1225的完整交互,重点解决三个核心问题:如何在没有硬件I2C的情况下保证时序精度、如何配置内部振荡器实现稳定采样,以及如何处理24位有符号数据转换。

1. 硬件架构与通信基础

1.1 芯片选型对比分析

BH45B1225在10SPS采样率下可实现21.5位有效精度,特别适合慢变信号采集场景。与同类ADC相比具有以下优势:

特性BH45B1225ADS1220LTC2486
分辨率24-bit24-bit24-bit
内部基准1.25V需外置需外置
工频抑制50/60Hz需配置
单电源供电2.7-5.5V2.3-5.5V2.7-5.5V
典型功耗(10SPS)350μA600μA400μA

1.2 软件I2C底层实现

CH32的GPIO模拟I2C需要特别注意时序参数,以下是关键时间常量定义:

#define I2C_DELAY_US 5 // 标准模式(100kHz)周期 #define SDA_SETUP_NS 250 // SDA建立时间 #define SDA_HOLD_NS 250 // SDA保持时间

具体引脚初始化代码应包含推挽输出(SCL)和开漏输出(SDA)的混合配置:

void I2C_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // SCL配置为推挽输出 GPIO_InitStruct.GPIO_Pin = I2C_SCL_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(I2C_PORT, &GPIO_InitStruct); // SDA配置为开漏输出 GPIO_InitStruct.GPIO_Pin = I2C_SDA_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(I2C_PORT, &GPIO_InitStruct); }

2. ADC寄存器深度配置

2.1 电源与基准设置

BH45B1225的PWRC寄存器控制着整个芯片的能耗管理,推荐初始化序列:

  1. 使能内部RC振荡器(HIRCC[0]=1)
  2. 等待OSC_RDY标志置位(HIRCC[1]=1)
  3. 开启内部VCM缓冲(PWRC[7]=1)
  4. 选择内部基准(ADCR0[4:3]=00)

注意:上电后需延迟至少10ms再访问寄存器,否则可能出现通信失败

2.2 采样率与滤波配置

ADC性能与ADCR0、ADCS寄存器直接相关,典型配置组合:

// 设置10SPS采样率+50Hz工频抑制 BH45B1225_WriteReg(BH45B1225_ADCR0, 0x02); // 正常模式 BH45B1225_WriteReg(BH45B1225_ADCS, 0x1F); // Fmod=Fsys/1

3. 数据采集实战技巧

3.1 24位数据处理方案

BH45B1225输出的是二进制补码格式数据,转换时需要特殊处理:

int32_t raw_data = (DataH << 16) | (DataM << 8) | DataL; if(raw_data & 0x800000) { // 负数处理 raw_data = -(~(raw_data - 1) & 0xFFFFFF); } float voltage = raw_data * 1.25f / 8388608.0f; // 2^23=8388608

3.2 异常状态监测机制

通过ADCR1寄存器可实时监控ADC状态:

  • Bit1(EOC): 转换完成标志
  • Bit2(OR): 数据溢出标志
  • Bit3(UR): 欠量程标志

推荐轮询方式:

while(!(BH45B1225_ReadReg(BH45B1225_ADCR1) & 0x02));

4. 低功耗优化策略

4.1 间歇采样模式

通过ADCR0寄存器实现自动休眠:

// 设置休眠间隔为1秒 BH45B1225_WriteReg(BH45B1225_ADCR0, 0x22); // SLEEP=1, DR[2:0]=010

4.2 电源管理实测数据

不同模式下的电流消耗对比:

工作模式配置参数典型电流
连续转换ADCR0=0x02350μA
间歇采样(1s)ADCR0=0x2285μA
深度休眠PWRC=0x001.2μA

5. 工程代码架构设计

5.1 驱动层封装要点

采用分层架构设计:

bh45b1225_driver/ ├── inc/ │ ├── bh45b1225.h // 寄存器定义 │ └── soft_i2c.h // 协议层 └── src/ ├── bh45b1225.c // 应用接口 └── soft_i2c.c // 物理层

5.2 典型应用示例

温度采集系统初始化流程:

void App_Init(void) { SOFT_I2C_Init(); BH45B1225_Init(); // 配置为内部温度传感器模式 BH45B1225_WriteReg(BH45B1225_PGACS, 0x3F); BH45B1225_WriteReg(BH45B1225_ADCR0, 0x82); // 启动转换 }

在完成上述所有配置后,实际测试显示:在3.3V供电、25℃环境温度下,系统连续工作72小时的采样波动小于±0.5LSB。工程文件中已包含完整的噪声抑制处理和卡尔曼滤波实现,可直接移植到各类低功耗传感项目中。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询