之前做气压计算高度时用的是通过单片机实现自动归零
https://bbs.eeworld.com.cn/thread-1091978-1-1.html
其实LPS22HH本身就有自动归零功能,用起来比单片机存储更方便
今天在测试LPS22HH自动归零时发现如果将INTERRUPT_CFG (0Bh)的AUTOZERO位置1以后
再读取气压就会经常是零,除了0还会有4095的情况
实验中我使用下边代码,在单片机的按键按下时进入autozero
autozero的代码里首先读取当前气压PRESS_OUT
然后设置AUTOZERO位为1
读取REF_P的数据
然后再读取PRESS_OUT
if(autozero)
{
autozero = 0;
memset(pressure, 0x00, sizeof(int32_t));
lps22hh_pressure_raw_get(&dev_ctx, pressure);
HAL_Delay(1000);
lps22hh_autozero_set(&dev_ctx,1);
HAL_Delay(1000);
memset(pressure_ref, 0x00, sizeof(int32_t));
// lps22hh_pressure_ref_set(&dev_ctx,buf);
lps22hh_pressure_ref_get(&dev_ctx,pressure_ref);
HAL_Delay(1000);
memset(pressure_autozero, 0x00, sizeof(int32_t));
lps22hh_pressure_raw_get(&dev_ctx, pressure_autozero);
sprintf((char*)tx_buffer, "pressure_ref:%X,%X\t press:%X,%X,%X,%X\t pressure_autozero:%X,%X,%X,%X\r\n",
pressure_ref[0],pressure_ref[1],
pressure[0],pressure[1],pressure[2],pressure[3],
pressure_autozero[0],pressure_autozero[1],pressure_autozero[2],pressure_autozero[3]);
tx_com( tx_buffer, strlen( (char const*)tx_buffer ) );
__NOP();
}
代码跑起来可以看到,在没设置AUTOZERO前气压正常
设置AUTOZERO前的最后一次气压16进制数据是E2,DB,3E,0
设置AUTOZERO后的REF_P是DB,3E,因为是16位数据24位气压的低8位被丢弃
然后再读取PRESS_OUT的气压数据就会几乎一直为0
autozero的代码里每次操作都设置了1秒的延时
这个问题高度了很长时间没找到解决办法
测试的时候无意发现代码里还有一段写REF_P的函数
/**
* [url=home.php?mod=space&uid=159083]@brief[/url] The Reference pressure value is a 16-bit data
* expressed as 2鈥檚 complement. The value is used
* when AUTOZERO or AUTORIFP function is enabled.[set]
*
* @param ctx read / write interface definitions
* @param buff buffer that contains data to write
* @retval interface status (MANDATORY: return 0 -> no Error)
*
*/
int32_t lps22hh_pressure_ref_set(lps22hh_ctx_t *ctx, uint8_t *buff)
{
int32_t ret;
ret = lps22hh_write_reg(ctx, LPS22HH_REF_P_L, buff, 2);
return ret;
}
看手册这应该是一个只读存储器,代码里试着执行了一下,没什么影响,估计是自动生成的配置函数没有考虑到寄存器的属性