ST意法半导体
直播中

张华

7年用户 1412经验值
私信 关注
[问答]

lis3mdl连接到lsm6dsox I2C,如何以1kHz的速度读取磁数据?

支持团队。
在我的测试板上,lis3mdl 连接到 lsm6dsox I2C。
从上面的板上,我想读取 1667Hz 的加速度和陀螺仪,1kHz 的磁性。
我参考 lsm6dsox_sensor_hub_fifo_lis2mdl.c 来实现 SW。
但是貌似磁数据很少从FIFO中读取。
SHUB_ODR_ 的最大速度为 104hz。
如何以 1kHz 的速度读取磁数据?
你能检查一下我的配置吗?
  • /* Electrical pin configuration */
  •     val.sdo_sa0_pull_up = 0;
  •     val.aux_sdo_ocs_pull_up = 0;
  •     val.int1_int2_push_pull = 0;
  •     val.int1_pull_down = 0;
  •     lsm6dsox_pin_conf_set(&lsm_ctx, val);
  •     /* Check device ID */
  •     lsm6dsox_device_id_get(&lsm_ctx, &whoamI);
  •     while (whoamI != LSM6DSOX_ID)
  •         nrf_delay_ms(10);
  •     /* Restore default configuration */
  •     lsm6dsox_reset_set(&lsm_ctx, PROPERTY_ENABLE);
  •     do {
  •         lsm6dsox_reset_get(&lsm_ctx, &rst);
  •     } while (rst);
  •     /* Disable I3C interface */
  •     lsm6dsox_i3c_disable_set(&lsm_ctx, LSM6DSOX_I3C_DISABLE);
  •     lis3mdl_device_id_get(&lis_ctx, &whoamI);
  •     while (whoamI != LIS3MDL_ID)
  •         nrf_delay_ms(10);
  •     /* Enable Block Data Update */
  •     lis3mdl_block_data_update_set(&lis_ctx, PROPERTY_ENABLE);
  •     /* Set device in continuos mode */
  •     lis3mdl_operating_mode_set(&lis_ctx, LIS3MDL_CONTINUOUS_MODE);
  •     /* Set Output Data Rate */
  •     lis3mdl_data_rate_set(&lis_ctx, LIS3MDL_LP_1kHz);// 1/1kHz*(1000msec/1sec) = 1msec
  •     /* Set full scale */
  •     lis3mdl_full_scale_set(&lis_ctx, LIS3MDL_16_GAUSS);
  •     /*
  •     * Configure LSM6DSOX FIFO.
  •     *
  •     *
  •     * Set FIFO watermark (number of unread sensor data TAG + 6 bytes
  •     * stored in FIFO) to 15 samples. 5 * (Acc + Gyro + Mag)
  •     */
  •     lsm6dsox_fifo_watermark_set(&lsm_ctx, 15);
  •     /* Set FIFO mode to Stream mode (aka Continuous Mode). */
  •     lsm6dsox_fifo_mode_set(&lsm_ctx, LSM6DSOX_STREAM_MODE);
  •     /*
  •     * Enable FIFO batching of Slave0.
  •     */
  •     lsm6dsox_sh_batch_slave_0_set(&lsm_ctx, PROPERTY_ENABLE);
  •     lsm6dsox_sh_data_rate_set(&lsm_ctx, LSM6DSOX_SH_ODR_104Hz);
  •     /* Set FIFO batch XL/Gyro ODR to 12.5Hz. */
  •     lsm6dsox_fifo_xl_batch_set(&lsm_ctx, LSM6DSOX_GY_BATCHED_AT_1667Hz);
  •     lsm6dsox_fifo_gy_batch_set(&lsm_ctx, LSM6DSOX_GY_BATCHED_AT_1667Hz);
  •     /*
  •     * Prepare sensor hub to read data from external Slave0 continuously
  •     * in order to store data in FIFO.
  •     */
  •     lsm6dsox_sh_cfg_read_t sh_cfg_read;
  •     sh_cfg_read.slv_add = LIS3MDLTR_ADDR;
  •     sh_cfg_read.slv_subadd = LIS3MDL_OUT_X_L;
  •     sh_cfg_read.slv_len = 6;
  •     lsm6dsox_sh_slv0_cfg_read(&lsm_ctx, &sh_cfg_read);
  •     /* Configure Sensor Hub to read one slave. */
  •     lsm6dsox_sh_slave_connected_set(&lsm_ctx, LSM6DSOX_SLV_0);
  •     /* Enable I2C Master. */
  •     lsm6dsox_sh_master_set(&lsm_ctx, PROPERTY_ENABLE);
  •     /* Configure LSM6DSOX. */
  •     lsm6dsox_xl_full_scale_set(&lsm_ctx, LSM6DSOX_16g);
  •     lsm6dsox_gy_full_scale_set(&lsm_ctx, LSM6DSOX_2000dps);
  •     lsm6dsox_block_data_update_set(&lsm_ctx, PROPERTY_ENABLE);
  •     lsm6dsox_xl_data_rate_set(&lsm_ctx, LSM6DSOX_XL_ODR_1667Hz);
  •     lsm6dsox_gy_data_rate_set(&lsm_ctx, LSM6DSOX_XL_ODR_1667Hz);
  •     /* Configure gpiote for the sensors data ready interrupt. */
  •     if (!nrf_drv_gpiote_is_init())
  •     {
  •         err_code = nrf_drv_gpiote_init();
  •         APP_ERROR_CHECK(err_code);
  •     }








回帖(1)

钟晶

2023-1-16 09:26:36
请注意 LSM6DSOX数据表第 169 页,主 I2C 的最大 ODR 速率在寄存器的 SHUB_ODR_[1:0] 位中定义为 00: 104 Hz(或者在加速度计和陀螺仪之间的最大 ODR,如果它是小于 104 赫兹)。
所以基本上 LIS3MDL 可以配置为作为独立设备以 ODR 1kHz 运行,但不能在传感器集线器模式下运行。您可能会遇到此限制。
这一事实的原因之一是您最多可以连接 4 个从设备,共享同一个 I2C 主设备;传感器集线器中的 I2C 速度最高可达 400kHz,这是快速模式的最大值,但考虑到您可以连接 4 个 16 位 6 轴的 IMU 从站,这意味着最低 40 kbits/秒,而不考虑 I2C 规范限制和主控内部处理速度(因此至少您必须将能力加倍并留有余地,即 100kbit/s)。
另请注意,LSM6DSOX 上的所有数字嵌入式功能(例如 FSM 和 MLC))都以最大 104Hz 运行,这是结果精度与设备功耗之间的折衷。
为了完整起见,您可以尝试检查此功能是否:


  • /* Set Output Data Rate */
  •     lis3mdl_data_rate_set(&lis_ctx, LIS3MDL_LP_1kHz);// 1/1kHz*(1000msec/1sec) = 1msec

正确启用 CTRL_REG1 (20h) 中的 FAST_ODR 位,这是磁力计上 ODR > 80Hz 所需要的(数据表第 24 页)
顺便问一下,磁力计通常用于测量准静态磁场变化...请问您需要监测高达500Hz的磁场用于哪些应用?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分