社区导航

 

搜索
12
返回列表 发新帖
楼主: littleshrimp

[环境传感器] lps33hw的stm32f103工程

  [复制链接]

6484

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-9-9 15:10 | 显示全部楼层
CCss131 发表于 2019-9-9 14:32 版主你好,请问一下INT_DRDY这个引脚有什么用,要怎么配置它?用ADC采样吗?还有现在用硬件的SPI驱动LPS33H ...

INT_DRDY 是数字输出引脚,接单片机的数据输入,一搬产生中断或者数据准备就绪时这个引脚的电平会有变化

 

SPI卡在那里是因为读到的who am i和器件的不对应,一搬情况下是因为通信错误没有读到数据。

虾扯蛋


回复

使用道具 举报

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-9-17 14:15 | 显示全部楼层
本帖最后由 CCss131 于 2019-9-17 14:16 编辑

QQ图片20190917140502.png 版主你好,

1.我的这个气压传感器读PRESS_OUT_XL (28h)是0x70 0x10 0x3F换算出来是1793mbar,我测了好多次都是在2000左右,应该是什么问题?

2.温度TEMP_OUT_L (2Bh)的值换算是除以100,得出来的值也是比较大,是什么原因?

3.应该怎么配置初始化,能让STATUS (27h)判断到P.DA为1,不断输出检测的压力数据啊?因为只输出一次数据,后面读状态寄存器里面的值都是0x00。

点评

“PRESS_OUT_XL (28h)是0x70 0x10 0x3F”你要确定一下MSB和LSB的顺序,如果弄反了气压还可能是1009 你说的测了好多次都是2000左右是用什么测的? 温度差多少,和什么比较的? 连续输出需要正确配  详情 回复 发表于 2019-9-17 14:40


回复

使用道具 举报

6484

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-9-17 14:40 | 显示全部楼层
CCss131 发表于 2019-9-17 14:15 版主你好, 1.我的这个气压传感器读PRESS_OUT_XL (28h)是0x70 0x10 0x3F换算出来是1793mbar,我测了好多 ...

“PRESS_OUT_XL (28h)是0x70 0x10 0x3F”你要确定一下MSB和LSB的顺序,如果弄反了气压还可能是1009

你说的测了好多次都是2000左右是用什么测的?

温度差多少,和什么比较的?

连续输出需要正确配置CTRL_REG1 (10h)寄存器的ODR2 

虾扯蛋


回复

使用道具 举报

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-9-17 15:15 | 显示全部楼层

微信图片_20190917144839.png 对的对的我弄反了,换算应该是这个顺序 0x3F 0x10 0x70,得出是1009,

手册里面说:为了保证BDU特性的正确行为,PRESS_OUT_H (2Ah)必须是最后一个地址

阅读。所以那个0X3F是(2Ah)里面的内容。

BDU(1)块数据更新。默认值:0

(0:连续更新;

1:读取MSB和LSB后才更新输出寄存器)   这个怎么理解是SPI的MSB和LSB 还是头文件的声明的LSB?

#define LPS33HW_FROM_LSB_TO_hPa(lsb)     (float)( lsb / 4096.0f )
#define LPS33HW_FROM_LSB_TO_degC(lsb)    (float)( lsb / 100.0f )

点评

这个MSB和LSB是对应传感器数据寄存器的MSB和LSB 防止你读取数据的速度比传感器更新数据慢,数据只读了一半那边有把数据更新造成上一个数据和下一个数据重叠在一起  详情 回复 发表于 2019-9-17 16:38


回复

使用道具 举报

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-9-17 15:21 | 显示全部楼层

QQ图片20190917151814.png 初始化化第一条函数之后CTRL_REG1 (10h)里面读到时0x02,配置CTRL_REG1 (10h)寄存器的ODR2 之后直接就没再读直接读取状态寄存器了,后面就只输出一次数据

1.  lps33hw_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);

2.lps33hw_data_rate_set(&dev_ctx, LPS33HW_ODR_10_Hz);

点评

你用的是工程里的这段代码吗? while(1) { /* * Read output only if new value is available */ lps33hw_reg_t reg; lps33hw_read_reg(&dev_ctx, LPS33HW_STATUS, (uint8_t  详情 回复 发表于 2019-9-17 16:42


回复

使用道具 举报

6484

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-9-17 16:38 来自手机 | 显示全部楼层
CCss131 发表于 2019-9-17 15:15 对的对的我弄反了,换算应该是这个顺序 0x3F 0x10 0x70,得出是1009, 手册里面说:为了保证BDU特性的正 ...
这个MSB和LSB是对应传感器数据寄存器的MSB和LSB 防止你读取数据的速度比传感器更新数据慢,数据只读了一半那边有把数据更新造成上一个数据和下一个数据重叠在一起


回复

使用道具 举报

6484

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-9-17 16:42 | 显示全部楼层
CCss131 发表于 2019-9-17 15:21 初始化化第一条函数之后CTRL_REG1 (10h)里面读到时0x02,配置CTRL_REG1 (10h)寄存器的ODR2 之后直接就没再 ...

你用的是工程里的这段代码吗?

  while(1)
  {
    /*
     * Read output only if new value is available
     */
    lps33hw_reg_t reg;
    lps33hw_read_reg(&dev_ctx, LPS33HW_STATUS, (uint8_t *)®, 1);

    if (reg.status.p_da)
    {
      memset(data_raw_pressure.u8bit, 0x00, sizeof(int32_t));
      lps33hw_pressure_raw_get(&dev_ctx, data_raw_pressure.u8bit);
      pressure_hPa = lps33hw_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 ) );
    }

    if (reg.status.t_da)
    {
      memset(data_raw_temperature.u8bit, 0x00, sizeof(int16_t));
      lps33hw_temperature_raw_get(&dev_ctx, data_raw_temperature.u8bit);
      temperature_degC = lps33hw_from_lsb_to_degc( 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 ) );
    }
  }

 

虾扯蛋


回复

使用道具 举报

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-9-17 16:50 | 显示全部楼层

对的我用这段代码初始化之后直接while(1)是可以一直读STATUS寄存器,   然后我定义这段为另一个函数在mian中的while(1)中调用,时序去到初始化CTRL_REG1之后,就没时序了,仿真发现是调用lps33hw_read_reg时进入硬件错误死循环,应该怎么解决,我想的是不断输出然后打印到PC的串口助手

点评

如果你在while中执行初始化是不是相当于一直在初始化传感器? 为什么要这么做呢?  详情 回复 发表于 2019-9-17 18:55


回复

使用道具 举报

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-9-17 18:53 | 显示全部楼层

http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=605216&highlight=LPS22HB

版主,就像你所介绍的一样,需要多次循环数据,不止31次才准备完毕,这是硬件的关系吗?打印数据的话可以直接获取的得到的值吧,还有如果我人为对它进行加压,怎么才能快速捕捉它的数据

点评

读多少次状态数据才能准备好和你的ODR和接口通信速率有关,其实你不需要考虑这个 如果你想快速读出数据最好的办法是使用DRDY中断 通过单片机检测这个引脚的电平变化即可 这样你就不用反复读取状态寄存器了  详情 回复 发表于 2019-9-17 19:00


回复

使用道具 举报

6484

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-9-17 18:55 来自手机 | 显示全部楼层
CCss131 发表于 2019-9-17 16:50 对的我用这段代码初始化之后直接while(1)是可以一直读STATUS寄存器,   然后我定义这段为另一 ...
如果你在while中执行初始化是不是相当于一直在初始化传感器? 为什么要这么做呢?


回复

使用道具 举报

6484

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-9-17 19:00 来自手机 | 显示全部楼层
CCss131 发表于 2019-9-17 18:53 http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=605216&highlight=LPS22HB 版主,就像你 ...
读多少次状态数据才能准备好和你的ODR和接口通信速率有关,其实你不需要考虑这个 如果你想快速读出数据最好的办法是使用DRDY中断 通过单片机检测这个引脚的电平变化即可 这样你就不用反复读取状态寄存器了


回复

使用道具 举报

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-9-18 09:36 | 显示全部楼层
  • void lps33hw_get_data(void)
  • {
  • /*
  • * Read output only if new value is available
  • */
  • lps33hw_reg_t reg;
  • lps33hw_read_reg(&dev_ctx, LPS33HW_STATUS, (uint8_t *)®, 1);
  •  
  • if (reg.status.p_da)
  • {
  • memset(data_raw_pressure.u8bit, 0x00, sizeof(int32_t));
  • lps33hw_pressure_raw_get(&dev_ctx, data_raw_pressure.u8bit);
  • pressure_hPa = lps33hw_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 ) );
  • }
  •  
  • if (reg.status.t_da)
  • {
  • memset(data_raw_temperature.u8bit, 0x00, sizeof(int16_t));
  • lps33hw_temperature_raw_get(&dev_ctx, data_raw_temperature.u8bit);
  • temperature_degC = lps33hw_from_lsb_to_degc( 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 ) );
  • }
  • }
  • 我是说将这一部分封装成一条函数,在mian中先初始化它配置寄存器的那一部分,然后再在while(1)调用lps33hw_get_data,但是代码初始化它之后,就不判断状态寄存器和输出数据了

点评

你是说同样的代码,如果直接写在while里正常,封装成一个函数再调用就会报错?  详情 回复 发表于 2019-9-18 10:18


回复

使用道具 举报

6484

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-9-18 10:18 | 显示全部楼层
CCss131 发表于 2019-9-18 09:36 void lps33hw_get_data(void) { /* * Read output only if new value is available */ lps33h ...

你是说同样的代码,如果直接写在while里正常,封装成一个函数再调用就会报错?

虾扯蛋


回复

使用道具 举报

25

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-9-18 17:42 | 显示全部楼层

对,把while封装成一个函数,再重新在mian中的while调用就进不去这条函数,只是读到who am i 之后就没有时序了,就是没有进入到这条函数中。

 

点评

这种情况比较奇怪,你单步调试看看他们两个的区别,或者把编译优化去掉试试  详情 回复 发表于 2019-9-18 19:00


回复

使用道具 举报

6484

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-9-18 19:00 | 显示全部楼层
CCss131 发表于 2019-9-18 17:42 对,把while封装成一个函数,再重新在mian中的while调用就进不去这条函数,只是读到who am i 之后就没有时 ...

这种情况比较奇怪,你单步调试看看他们两个的区别,或者把编译优化去掉试试

虾扯蛋


回复

使用道具 举报

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

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-10-14 09:19 , Processed in 0.414240 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表