530|3

726

帖子

0

资源

纯净的硅(初级)

【ST MEMS防水气压传感器LPS27HHW测评】+2个驱程间的对比及应用 (兼结题报告) [复制链接]

本帖最后由 jinglixixi 于 2021-2-11 01:14 编辑

因LPS27HHW的驱动受阻,故放慢了测评的进程,幸得管管的指点与帮助,终于在littleshrimp相关帖子中获得了解决之道。

1. LPS27HHW与LPS22HH的对比

LPS22HH与LPS27HHW均属气压传感器,但各自又有各自的特点,为此从下面几点加以对比。

1)外观对比

 

image-20210211010139-1.png   图1   LPS22HH传感器

 

image-20210211010139-2.png 图2  LPS27HHW传感器

                                                   

由外观可以看出,2个传感器均因体型小巧而被置于开发板上来提供使用,且均以双排12PIN的排针引出供用户使用。但LPS27HHW比LPS22HH更突出,在于它的后膜设计防水性能。

2)性能对比

名称

LPS22HH

LPS27HHW

测量范围

260 ~ 1260 hPa

260 ~ 1260 hPa

通讯接口

I²C, Serial, SPI

SPI, I²C or MIPI I3C

工作电压

1.7V ~ 3.6V

1.7V ~ 3.6V

测量精度

24 bit精度

24 bit精度

ODR

1 ~ 200 Hz

1 ~ 200 Hz

最小电流

4 μA

4 μA

绝对压力精度

0.5 hPa

0.5 hPa

低压传感器噪声

0.65 Pa

0.7 Pa

封装类型

薄而小封装

防水封装

 

2)驱动程序对比

尽管LPS22HH与LPS27HHW在硬件上存在稍许的差异,那它们在软件的驱程上又有何差异呢?

在主程序方面:

两者的程序结构是完全相同的,所不同的就是调用的函数名称不同,毕竟所驱动的器件不一样嘛!

在LPS27HHW中,存在一个名为ucf_line_t的结构定义,但并未使用。

typedef struct {

  uint8_t address;

  uint8_t data;

} ucf_line_t;

此外,将axis1bit16_t和axis1bit32_t的结构定义放于主程序中,而LPS22HH却放在lps22hh_reg. h。

typedef union{

  int16_t i16bit;

  uint8_t u8bit[2];

} axis1bit16_t;

typedef union{

  int32_t i32bit;

  uint8_t u8bit[4];

} axis1bit32_t;

 

在驱程.c方面:

两者的程序结构是完全相同的,所不同的是对应的函数名称不同。

在驱程.h方面:

两者的程序结构是完全相同的,所不同的是对应的函数名称不同。

LPS22HH与LPS27HHW的ID标识值是相同的,见如下定义:

#define LPS22HH_ID                  0xB3U

#define LPS27HHW_ID              0xB3U

 

在lps22hh_reg. h中,多出了axis3bit16_t和axis3bit32_t的结构定义,但并未使用。

typedef union{

  int16_t i16bit[3];

  uint8_t u8bit[6];

} axis3bit16_t;

 

typedef union{

  int32_t i32bit[3];

  uint8_t u8bit[12];

} axis3bit32_t;

 

3)对比结论

综上所述,我们可以断定两者的驱程具有通用性,即可以用LPS22HH的驱程来驱动LPS27HHW。

那么实际情况该是怎样? 经实际测试,该推测是完全正确的。

 

2. LPS27HHW应用

在实际应用中,LPS27HHW与STM32L452的连接关系为:

VDD    ---3.3V

Vdd_IO ---3.3V

GND   ---GND

SCL    ---PB8

SDA    ---PB9

 

实现气压检测功能的主程序如下:

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART2_UART_Init();
  lps22hh_ctx_t dev_ctx;   //stmdev_ctx_t dev_ctx;
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.handle = &hi2c1;
  sprintf((char*)tx_buffer, "LPS22HH test\r\n");
  tx_com( tx_buffer, strlen( (char const*)tx_buffer ) );
  OLED_Init();
  OLED_Clear();
  OLED_ShowString(8,0,"STM32L452",16);
  OLED_ShowString(8,2,"OLED & LPS27HHW",16);
  HAL_Delay(1000);
  HAL_Delay(1000);
  OLED_Clear();
  OLED_ShowString(8,0,"pres=",16);
  OLED_ShowString(8,2,"temp=",16);
  whoamI = 0;
  lps22hh_device_id_get(&dev_ctx, &whoamI);
  if ( whoamI != LPS22HH_ID )
  while(1);
  lps22hh_reset_set(&dev_ctx, PROPERTY_ENABLE);
  do {
    lps22hh_reset_get(&dev_ctx, &rst);
  } while (rst);
  lps22hh_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
  lps22hh_data_rate_set(&dev_ctx, LPS22HH_10_Hz_LOW_NOISE);
  while (1)
  {
    lps22hh_reg_t reg;
    lps22hh_read_reg(&dev_ctx, LPS22HH_STATUS, (uint8_t *)&reg, 1);
    if(reg.status.p_da)
    {
      memset(data_raw_pressure.u8bit, 0x00, sizeof(int32_t));
      lps22hh_pressure_raw_get(&dev_ctx, data_raw_pressure.u8bit);
      pressure_hPa = lps22hh_from_lsb_to_hpa( data_raw_pressure.i32bit);
      sprintf((char*)tx_buffer, "pressure [hPa]:%6.2f\r\n", pressure_hPa);
      tx_com( tx_buffer, strlen( (char const*)tx_buffer ) );
      sprintf((char*)tx_buffer, "pres=%6.2fhPa", pressure_hPa);
      OLED_ShowString(8,0,tx_buffer,16);
    }

    if(reg.status.t_da)
    {
      memset(data_raw_temperature.u8bit, 0x00, sizeof(int16_t));
      lps22hh_temperature_raw_get(&dev_ctx, data_raw_temperature.u8bit);
      temperature_degC = lps22hh_from_lsb_to_celsius( data_raw_temperature.i16bit );
      sprintf((char*)tx_buffer, "temperature [degC]:%6.2f\r\n", temperature_degC );
      tx_com( tx_buffer, strlen( (char const*)tx_buffer ) );
      sprintf((char*)tx_buffer, "temp=%6.2fdegC", temperature_degC );
      OLED_ShowString(8,2,tx_buffer,16);
    }
    HAL_Delay(500);
    HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_RESET);
    HAL_Delay(500);
    HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_SET);
  }
}

进行LPS27HHW检测的线路连接如图3所示,其检测结果如图4所示。

image-20210211010139-3.png

图 3 串口检测连接

image-20210211010139-4.png

图 4 串口检测效果

 

在连接OLED屏的情况下,其显示效果如图5及图6所示。

image-20210211010139-5.png

图5  OLED屏显示界面

 

image-20210211010139-6.png

图 6 OLED屏显示效果

 

有了上面的实际体验,感觉LPS27HHW的性能还是很出色的,在检测气压的同时还能获得环境的温度状态,适于在小型气象站上使用。后面有时间的话,再将它移植到其它的开发板来使用。

 

赞赏

1

查看全部赞赏


回复

786

帖子

2

资源

版主

测评写的不错,就喜欢你这样的测评帖子,感谢老铁的分享!期待后续


回复

726

帖子

0

资源

纯净的硅(初级)

w494143467 发表于 2021-2-17 15:06 测评写的不错,就喜欢你这样的测评帖子,感谢老铁的分享!期待后续


回复

3327

帖子

1

资源

五彩晶圆(初级)

hPa这单位给的。。。好吧

个人签名人已离开,无事别找,找也找不到。

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

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表