【ST MEMS防水气压传感器LPS27HHW测评】+2个驱程间的对比及应用 (兼结题报告)
本帖最后由 jinglixixi 于 2021-2-11 01:14 编辑<p>因LPS27HHW的驱动受阻,故放慢了测评的进程,幸得管管的指点与帮助,终于在littleshrimp相关帖子中获得了解决之道。</p>
<p>1. LPS27HHW与LPS22HH的对比</p>
<p>LPS22HH与LPS27HHW均属气压传感器,但各自又有各自的特点,为此从下面几点加以对比。</p>
<p>1)外观对比</p>
<p> </p>
<p> 图1 LPS22HH传感器</p>
<p> </p>
<p> 图2 LPS27HHW传感器</p>
<p> </p>
<p>由外观可以看出,2个传感器均因体型小巧而被置于开发板上来提供使用,且均以双排12PIN的排针引出供用户使用。但LPS27HHW比LPS22HH更突出,在于它的后膜设计防水性能。</p>
<p>2)性能对比</p>
<table>
<tbody>
<tr>
<td>
<p>名称</p>
</td>
<td>
<p>LPS22HH</p>
</td>
<td>
<p>LPS27HHW</p>
</td>
</tr>
<tr>
<td>
<p>测量范围</p>
</td>
<td>
<p>260 ~ 1260 hPa</p>
</td>
<td>
<p>260 ~ 1260 hPa</p>
</td>
</tr>
<tr>
<td>
<p>通讯接口</p>
</td>
<td>
<p>I²C, Serial, SPI</p>
</td>
<td>
<p>SPI, I²C or MIPI I3C</p>
</td>
</tr>
<tr>
<td>
<p>工作电压</p>
</td>
<td>
<p>1.7V ~ 3.6V</p>
</td>
<td>
<p>1.7V ~ 3.6V</p>
</td>
</tr>
<tr>
<td>
<p>测量精度</p>
</td>
<td>
<p>24 bit精度</p>
</td>
<td>
<p>24 bit精度</p>
</td>
</tr>
<tr>
<td>
<p>ODR</p>
</td>
<td>
<p>1 ~ 200 Hz</p>
</td>
<td>
<p>1 ~ 200 Hz</p>
</td>
</tr>
<tr>
<td>
<p>最小电流</p>
</td>
<td>
<p>4 μA</p>
</td>
<td>
<p>4 μA</p>
</td>
</tr>
<tr>
<td>
<p>绝对压力精度</p>
</td>
<td>
<p>0.5 hPa</p>
</td>
<td>
<p>0.5 hPa</p>
</td>
</tr>
<tr>
<td>
<p>低压传感器噪声</p>
</td>
<td>
<p>0.65 Pa</p>
</td>
<td>
<p>0.7 Pa</p>
</td>
</tr>
<tr>
<td>
<p>封装类型</p>
</td>
<td>薄而小封装</td>
<td>
<p>防水封装</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>2)驱动程序对比</p>
<p>尽管LPS22HH与LPS27HHW在硬件上存在稍许的差异,那它们在软件的驱程上又有何差异呢?</p>
<p>在主程序方面:</p>
<p>两者的程序结构是完全相同的,所不同的就是调用的函数名称不同,毕竟所驱动的器件不一样嘛!</p>
<p>在LPS27HHW中,存在一个名为ucf_line_t的结构定义,但并未使用。</p>
<p>typedef struct {</p>
<p> uint8_t address;</p>
<p> uint8_t data;</p>
<p>} ucf_line_t;</p>
<p>此外,将axis1bit16_t和axis1bit32_t的结构定义放于主程序中,而LPS22HH却放在lps22hh_reg. h。</p>
<p>typedef union{</p>
<p> int16_t i16bit;</p>
<p> uint8_t u8bit;</p>
<p>} axis1bit16_t;</p>
<p>typedef union{</p>
<p> int32_t i32bit;</p>
<p> uint8_t u8bit;</p>
<p>} axis1bit32_t;</p>
<p> </p>
<p>在驱程.c方面:</p>
<p>两者的程序结构是完全相同的,所不同的是对应的函数名称不同。</p>
<p>在驱程.h方面:</p>
<p>两者的程序结构是完全相同的,所不同的是对应的函数名称不同。</p>
<p>LPS22HH与LPS27HHW的ID标识值是相同的,见如下定义:</p>
<p>#define LPS22HH_ID 0xB3U</p>
<p>#define LPS27HHW_ID 0xB3U</p>
<p> </p>
<p>在lps22hh_reg. h中,多出了axis3bit16_t和axis3bit32_t的结构定义,但并未使用。</p>
<p>typedef union{</p>
<p> int16_t i16bit;</p>
<p> uint8_t u8bit;</p>
<p>} axis3bit16_t;</p>
<p> </p>
<p>typedef union{</p>
<p> int32_t i32bit;</p>
<p> uint8_t u8bit;</p>
<p>} axis3bit32_t;</p>
<p> </p>
<p>3)对比结论</p>
<p>综上所述,我们可以断定两者的驱程具有通用性,即可以用LPS22HH的驱程来驱动LPS27HHW。</p>
<p>那么实际情况该是怎样? 经实际测试,该推测是完全正确的。</p>
<p> </p>
<p>2. LPS27HHW应用</p>
<p>在实际应用中,LPS27HHW与STM32L452的连接关系为:</p>
<p>VDD ---3.3V</p>
<p>Vdd_IO ---3.3V</p>
<p>GND ---GND</p>
<p>SCL ---PB8</p>
<p>SDA ---PB9</p>
<p> </p>
<p>实现气压检测功能的主程序如下:</p>
<pre>
<code class="language-cpp">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 :%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 :%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);
}
}</code></pre>
<p>进行LPS27HHW检测的线路连接如图3所示,其检测结果如图4所示。</p>
<p></p>
<p>图 3 串口检测连接</p>
<p></p>
<p>图 4 串口检测效果</p>
<p> </p>
<p>在连接OLED屏的情况下,其显示效果如图5及图6所示。</p>
<p></p>
<p>图5 OLED屏显示界面</p>
<p> </p>
<p></p>
<p>图 6 OLED屏显示效果</p>
<p> </p>
<p>有了上面的实际体验,感觉LPS27HHW的性能还是很出色的,在检测气压的同时还能获得环境的温度状态,适于在小型气象站上使用。后面有时间的话,再将它移植到其它的开发板来使用。</p>
<p style="text-align:justify"> </p>
<p>测评写的不错,就喜欢你这样的测评帖子,感谢老铁的分享!期待后续</p>
w494143467 发表于 2021-2-17 15:06
测评写的不错,就喜欢你这样的测评帖子,感谢老铁的分享!期待后续
<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" /></p>
<p>hPa这单位给的。。。好吧</p>
页:
[1]