Microfelt.net | 微感论坛-传感器技术交流社区
返回列表 发布新帖
查看: 43|回复: 0

[技术交流] ST LPS25HBTR电路设计和核心代码片段分享(STM32 平台)

7

主题

3

回帖

29

积分

新手上路

发表于 7 天前 | 查看全部 |阅读模式
一、电路设计示例(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 通信:
  1. <font face="宋体">#include "stm32f1xx_hal.h"

  2. // LPS25HBTR I2C地址(SA0接GND时为0x5C,左移1位适配HAL库)
  3. #define LPS25HB_ADDR    0x5C << 1
  4. // 寄存器地址
  5. #define LPS25HB_WHO_AM_I    0x0F    // 设备ID寄存器,默认值0xBD
  6. #define LPS25HB_CTRL_REG1   0x20    // 控制寄存器1
  7. #define LPS25HB_PRESS_OUT_XL 0x28   // 压力数据低字节
  8. #define LPS25HB_PRESS_OUT_L 0x29    // 压力数据中字节
  9. #define LPS25HB_PRESS_OUT_H 0x2A    // 压力数据高字节
  10. #define LPS25HB_TEMP_OUT_L  0x2B    // 温度数据低字节
  11. #define LPS25HB_TEMP_OUT_H  0x2C    // 温度数据高字节

  12. // 全局I2C句柄
  13. extern I2C_HandleTypeDef hi2c1;

  14. // 函数声明
  15. uint8_t LPS25HB_CheckID(void);
  16. void LPS25HB_Init(void);
  17. float LPS25HB_ReadPressure(void);
  18. float LPS25HB_ReadTemperature(void);</font>
复制代码
2. 设备 ID 检测(验证通信)
  1. <font face="宋体">/**
  2. * @brief  检测LPS25HBTR设备ID
  3. * @retval 0:检测失败;1:检测成功
  4. */
  5. uint8_t LPS25HB_CheckID(void)
  6. {
  7.     uint8_t dev_id = 0;
  8.     // 读取WHO_AM_I寄存器
  9.     HAL_I2C_Mem_Read(&hi2c1, LPS25HB_ADDR, LPS25HB_WHO_AM_I, 1, &dev_id, 1, 100);
  10.     if(dev_id == 0xBD)
  11.     {
  12.         return 1;
  13.     }
  14.     return 0;
  15. }</font>
复制代码

3. 传感器初始化
  1. <font face="宋体">/**
  2. * @brief  初始化LPS25HBTR:启用传感器,设置输出速率25Hz
  3. */
  4. void LPS25HB_Init(void)
  5. {
  6.     uint8_t reg_data = 0;
  7.    
  8.     // 检测通信
  9.     if(!LPS25HB_CheckID())
  10.     {
  11.         return; // 通信失败则退出
  12.     }
  13.    
  14.     // CTRL_REG1配置:0x90 = 1001 0000
  15.     // bit7: PD=1(启动传感器);bit4-2: ODR=100(输出速率25Hz);其余bit=0
  16.     reg_data = 0x90;
  17.     HAL_I2C_Mem_Write(&hi2c1, LPS25HB_ADDR, LPS25HB_CTRL_REG1, 1, &reg_data, 1, 100);
  18. }</font>
复制代码
4. 压力数据读取(单位:hPa)
  1. <font face="宋体">/**
  2. * @brief  读取压力值
  3. * @retval 压力值(hPa)
  4. */
  5. float LPS25HB_ReadPressure(void)
  6. {
  7.     uint8_t press_data[3] = {0};
  8.     int32_t press_raw = 0;
  9.     float press_hpa = 0.0f;
  10.    
  11.     // 连续读取3个字节:XL(0x28)、L(0x29)、H(0x2A)
  12.     HAL_I2C_Mem_Read(&hi2c1, LPS25HB_ADDR, LPS25HB_PRESS_OUT_XL, 1, press_data, 3, 100);
  13.    
  14.     // 拼接24位数据(补符号位)
  15.     press_raw = (int32_t)((press_data[2] << 16) | (press_data[1] << 8) | press_data[0]);
  16.     // 数据转换:压力值 = 原始值 / 4096 hPa
  17.     press_hpa = (float)press_raw / 4096.0f;
  18.    
  19.     return press_hpa;
  20. }</font>
复制代码
5. 温度数据读取(单位:℃)
  1. <font face="宋体">/**
  2. * @brief  读取温度值
  3. * @retval 温度值(℃)
  4. */
  5. float LPS25HB_ReadTemperature(void)
  6. {
  7.     uint8_t temp_data[2] = {0};
  8.     int16_t temp_raw = 0;
  9.     float temp_c = 0.0f;
  10.    
  11.     // 连续读取2个字节:L(0x2B)、H(0x2C)
  12.     HAL_I2C_Mem_Read(&hi2c1, LPS25HB_ADDR, LPS25HB_TEMP_OUT_L, 1, temp_data, 2, 100);
  13.    
  14.     // 拼接16位数据
  15.     temp_raw = (int16_t)((temp_data[1] << 8) | temp_data[0]);
  16.     // 数据转换:温度值 = 42.5 + 原始值 / 480 ℃
  17.     temp_c = 42.5f + (float)temp_raw / 480.0f;
  18.    
  19.     return temp_c;
  20. }</font>
复制代码
6. 主函数调用示例
  1. <font face="宋体">int main(void)
  2. {
  3.     HAL_Init();
  4.     SystemClock_Config();
  5.     MX_I2C1_Init(); // 初始化I2C1(速率400kHz)
  6.    
  7.     float pressure, temperature;
  8.    
  9.     // 初始化LPS25HBTR
  10.     LPS25HB_Init();
  11.    
  12.     while(1)
  13.     {
  14.         // 读取压力和温度
  15.         pressure = LPS25HB_ReadPressure();
  16.         temperature = LPS25HB_ReadTemperature();
  17.         
  18.         // 数据处理/打印(可通过串口输出)
  19.         HAL_Delay(100); // 按25Hz速率读取,可调整延时
  20.     }
  21. }</font>
复制代码
三、关键注意事项
  • I2C 初始化时,速率建议设置为 400kHz(快速模式),匹配传感器通信能力;
  • 数据读取前需确保传感器完成启动(PD 位置 1 后,建议延时 10ms 再读取);
  • 若使用 SPI 通信,需将 CS 引脚接 STM32 GPIO,通过片选控制通信,寄存器地址需最高位置 1(读)/ 置 0(写);
  • 户外 / 工业场景使用时,可在传感器外部增加防尘透气膜,避免灰尘堵塞封装开孔。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Microfelt|微感论坛-传感器技术交流社区 © 2001-2025 Discuz! Team. Powered by Discuz! W1.5 粤ICP备18044996号-3|81f01e9418981fd496123c701618b320
在本版发帖
论坛管理
论坛管理 返回顶部
快速回复 返回顶部 返回列表