|
|
一、电路设计示例(I2C 通信方式)
1. 核心电路原理图
LPS25HBTR 采用 I2C 接口与 STM32 单片机通信,电路设计需兼顾供电稳定性、信号抗干扰及压力传导性,核心连接如下:
- 供电部分:
- VDD 引脚(引脚 6)接 3.3V 电源,串联 0Ω 限流电阻后,并联 100nF 陶瓷电容 + 1μF 钽电容到 GND,滤除电源纹波;
- VDD_IO 引脚(引脚 5)与 VDD 短接,保证 IO 电平与供电一致(适配 1.7V~3.6V 宽电压)。
- I2C 通信部分:
- SDA 引脚(引脚 7)接 STM32 的 I2C_SDA(如 PB7),串联 2.2kΩ 上拉电阻到 3.3V;
- SCL 引脚(引脚 8)接 STM32 的 I2C_SCL(如 PB6),串联 2.2kΩ 上拉电阻到 3.3V;
- SA0 引脚(引脚 9)接 GND(默认 I2C 地址 0x5C),若需修改地址可接 3.3V(地址变为 0x5D)。
- 其他关键引脚:
- CS 引脚(引脚 10)接 3.3V(禁用 SPI 模式,仅启用 I2C);
- INT_DRDY 引脚(引脚 2)可选接 STM32 外部中断引脚(如 PA0),用于数据就绪中断;
- NC 引脚(引脚 1/3/4)悬空,传感器封装开孔需外露,避免遮挡压力传导。
2. PCB 布局注意事项
- 电源滤波电容靠近 VDD/VDD_IO 引脚摆放,缩短走线长度;
- I2C 信号线采用差分走线,长度控制在 10cm 内,远离高频信号线(如 PWM、时钟线);
- 传感器周围预留通风空间,封装开孔正上方无金属覆盖,保证气压正常传导;
- 接地采用单点接地,传感器 GND 与 STM32 GND 共地,减少地电位差干扰。
二、核心代码片段(STM32 HAL 库)
以下代码实现 LPS25HBTR 初始化、压力 / 温度数据读取,基于 STM32F103 系列,I2C1 通信:- <font face="宋体">#include "stm32f1xx_hal.h"
- // LPS25HBTR I2C地址(SA0接GND时为0x5C,左移1位适配HAL库)
- #define LPS25HB_ADDR 0x5C << 1
- // 寄存器地址
- #define LPS25HB_WHO_AM_I 0x0F // 设备ID寄存器,默认值0xBD
- #define LPS25HB_CTRL_REG1 0x20 // 控制寄存器1
- #define LPS25HB_PRESS_OUT_XL 0x28 // 压力数据低字节
- #define LPS25HB_PRESS_OUT_L 0x29 // 压力数据中字节
- #define LPS25HB_PRESS_OUT_H 0x2A // 压力数据高字节
- #define LPS25HB_TEMP_OUT_L 0x2B // 温度数据低字节
- #define LPS25HB_TEMP_OUT_H 0x2C // 温度数据高字节
- // 全局I2C句柄
- extern I2C_HandleTypeDef hi2c1;
- // 函数声明
- uint8_t LPS25HB_CheckID(void);
- void LPS25HB_Init(void);
- float LPS25HB_ReadPressure(void);
- float LPS25HB_ReadTemperature(void);</font>
复制代码 2. 设备 ID 检测(验证通信)
- <font face="宋体">/**
- * @brief 检测LPS25HBTR设备ID
- * @retval 0:检测失败;1:检测成功
- */
- uint8_t LPS25HB_CheckID(void)
- {
- uint8_t dev_id = 0;
- // 读取WHO_AM_I寄存器
- HAL_I2C_Mem_Read(&hi2c1, LPS25HB_ADDR, LPS25HB_WHO_AM_I, 1, &dev_id, 1, 100);
- if(dev_id == 0xBD)
- {
- return 1;
- }
- return 0;
- }</font>
复制代码
3. 传感器初始化- <font face="宋体">/**
- * @brief 初始化LPS25HBTR:启用传感器,设置输出速率25Hz
- */
- void LPS25HB_Init(void)
- {
- uint8_t reg_data = 0;
-
- // 检测通信
- if(!LPS25HB_CheckID())
- {
- return; // 通信失败则退出
- }
-
- // CTRL_REG1配置:0x90 = 1001 0000
- // bit7: PD=1(启动传感器);bit4-2: ODR=100(输出速率25Hz);其余bit=0
- reg_data = 0x90;
- HAL_I2C_Mem_Write(&hi2c1, LPS25HB_ADDR, LPS25HB_CTRL_REG1, 1, ®_data, 1, 100);
- }</font>
复制代码 4. 压力数据读取(单位:hPa)- <font face="宋体">/**
- * @brief 读取压力值
- * @retval 压力值(hPa)
- */
- float LPS25HB_ReadPressure(void)
- {
- uint8_t press_data[3] = {0};
- int32_t press_raw = 0;
- float press_hpa = 0.0f;
-
- // 连续读取3个字节:XL(0x28)、L(0x29)、H(0x2A)
- HAL_I2C_Mem_Read(&hi2c1, LPS25HB_ADDR, LPS25HB_PRESS_OUT_XL, 1, press_data, 3, 100);
-
- // 拼接24位数据(补符号位)
- press_raw = (int32_t)((press_data[2] << 16) | (press_data[1] << 8) | press_data[0]);
- // 数据转换:压力值 = 原始值 / 4096 hPa
- press_hpa = (float)press_raw / 4096.0f;
-
- return press_hpa;
- }</font>
复制代码 5. 温度数据读取(单位:℃)
- <font face="宋体">/**
- * @brief 读取温度值
- * @retval 温度值(℃)
- */
- float LPS25HB_ReadTemperature(void)
- {
- uint8_t temp_data[2] = {0};
- int16_t temp_raw = 0;
- float temp_c = 0.0f;
-
- // 连续读取2个字节:L(0x2B)、H(0x2C)
- HAL_I2C_Mem_Read(&hi2c1, LPS25HB_ADDR, LPS25HB_TEMP_OUT_L, 1, temp_data, 2, 100);
-
- // 拼接16位数据
- temp_raw = (int16_t)((temp_data[1] << 8) | temp_data[0]);
- // 数据转换:温度值 = 42.5 + 原始值 / 480 ℃
- temp_c = 42.5f + (float)temp_raw / 480.0f;
-
- return temp_c;
- }</font>
复制代码 6. 主函数调用示例
- <font face="宋体">int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- MX_I2C1_Init(); // 初始化I2C1(速率400kHz)
-
- float pressure, temperature;
-
- // 初始化LPS25HBTR
- LPS25HB_Init();
-
- while(1)
- {
- // 读取压力和温度
- pressure = LPS25HB_ReadPressure();
- temperature = LPS25HB_ReadTemperature();
-
- // 数据处理/打印(可通过串口输出)
- HAL_Delay(100); // 按25Hz速率读取,可调整延时
- }
- }</font>
复制代码 三、关键注意事项
- I2C 初始化时,速率建议设置为 400kHz(快速模式),匹配传感器通信能力;
- 数据读取前需确保传感器完成启动(PD 位置 1 后,建议延时 10ms 再读取);
- 若使用 SPI 通信,需将 CS 引脚接 STM32 GPIO,通过片选控制通信,寄存器地址需最高位置 1(读)/ 置 0(写);
- 户外 / 工业场景使用时,可在传感器外部增加防尘透气膜,避免灰尘堵塞封装开孔。
|
|