[求助] LPS22HH设置Autozero时遇到问题

littleshrimp   2019-9-28 22:00 楼主

之前做气压计算高度时用的是通过单片机实现自动归零

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秒的延时

QQ图片20190928214105.png

这个问题高度了很长时间没找到解决办法

测试的时候无意发现代码里还有一段写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;
}

看手册这应该是一个只读存储器,代码里试着执行了一下,没什么影响,估计是自动生成的配置函数没有考虑到寄存器的属性

 

QQ图片20190928215710.png 最后这个问题还是没有解决,其它搜索引擎也用上了,能找到关于autozero的资料都很少

虾扯蛋,蛋扯虾,虾扯蛋扯虾

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复