【ST MEMS防水气压传感器LPS27HHW测评】+2个驱程间的对比及应用 (兼结题报告)
[复制链接]
本帖最后由 jinglixixi 于 2021-2-11 01:14 编辑
因LPS27HHW的驱动受阻,故放慢了测评的进程,幸得管管的指点与帮助,终于在littleshrimp相关帖子中获得了解决之道。
1. LPS27HHW与LPS22HH的对比
LPS22HH与LPS27HHW均属气压传感器,但各自又有各自的特点,为此从下面几点加以对比。
1)外观对比
图1 LPS22HH传感器
图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 *)®, 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所示。
图 3 串口检测连接
图 4 串口检测效果
在连接OLED屏的情况下,其显示效果如图5及图6所示。
图5 OLED屏显示界面
图 6 OLED屏显示效果
有了上面的实际体验,感觉LPS27HHW的性能还是很出色的,在检测气压的同时还能获得环境的温度状态,适于在小型气象站上使用。后面有时间的话,再将它移植到其它的开发板来使用。
|