embedded - 如何从 LSM6DSOXTR 读取陀螺仪值?
问题描述
嗨,我正在将 LSM6DS 与 nrf52 连接以读取加速器和陀螺仪。我得到的 accl 值正确但不是陀螺仪,因为当传感器稳定时陀螺仪值是 0 或 255,而当我移动它时它显示值。
这是陀螺仪的初始化代码
///初始化lsm
uint8_t LSM_init() {
uint8_t data = 0;
data = 0x01;
LSM_REGISTER_RW(0x12, &data, 0);
nrf_delay_ms(1);
m_tx_buf[0] = 0x8F; //who am i
m_tx_buf[1] = 0x40;
memset(m_rx_buf, 0, 3);
nrf_gpio_pin_clear(LSM_CS);
nrf_drv_spi_transfer(&spi, m_tx_buf, 2, m_rx_buf, 2);
nrf_delay_ms(5);
nrf_gpio_pin_set(LSM_CS);
nrf_delay_ms(5);
if (m_rx_buf[1] == 0x6C) {
m_tx_buf[0] = 0x12; //auto increment 1 and enable BDU
m_tx_buf[1] = 0x64;
memset(m_rx_buf, 0, 3);
nrf_gpio_pin_clear(LSM_CS);
nrf_drv_spi_transfer(&spi, m_tx_buf, 2, m_rx_buf, 2);
nrf_delay_ms(5);
nrf_gpio_pin_set(LSM_CS);
nrf_delay_ms(5);
m_tx_buf[0] = 0x0A; // fifo cntrlby pass
m_tx_buf[1] = 0x00;
memset(m_rx_buf, 0, 3);
nrf_gpio_pin_clear(LSM_CS);
nrf_drv_spi_transfer(&spi, m_tx_buf, 2, m_rx_buf, 2);
nrf_delay_ms(5);
nrf_gpio_pin_set(LSM_CS);
nrf_delay_ms(5);
m_tx_buf[0] = 0x10; // Xl odr 416 htz
m_tx_buf[1] = 0x62; //4A //62
memset(m_rx_buf, 0, 3);
nrf_gpio_pin_clear(LSM_CS);
nrf_drv_spi_transfer(&spi, m_tx_buf, 2, m_rx_buf, 2);
nrf_delay_ms(5);
nrf_gpio_pin_set(LSM_CS);
nrf_delay_ms(5);
data = 0x00;
LSM_REGISTER_RW(0x5C, &data, 0); //wakeup duration
data = 0x01;
LSM_REGISTER_RW(0x5D, &data, 0); //threshhold
// m_tx_buf[0] = 0x11; // gyroscope
// m_tx_buf[1] = 0x00;
// memset(m_rx_buf, 0, 3);
// nrf_gpio_pin_clear(LSM_CS);
// nrf_drv_spi_transfer(&spi, m_tx_buf, 2, m_rx_buf, 2);
// nrf_delay_ms(5);
// nrf_gpio_pin_set(LSM_CS);
// nrf_delay_ms(5);
m_tx_buf[0] = 0x11; // gyroscope
m_tx_buf[1] = 0x6E;
memset(m_rx_buf, 0, 3);
nrf_gpio_pin_clear(LSM_CS);
nrf_drv_spi_transfer(&spi, m_tx_buf, 2, m_rx_buf, 2);
nrf_delay_ms(5);
nrf_gpio_pin_set(LSM_CS);
nrf_delay_ms(5);
data = 0xF0;
LSM_REGISTER_RW(0x14, &data, 0); //enable lsm.
// data = 0x20;
// LSM_REGISTER_RW(0x66, &data, 0); //enable lsm.
//interrupt route
data = 0x80;
LSM_REGISTER_RW(0x01, &data, 0); //embedded func set -
data = 0x01;
LSM_REGISTER_RW(0x0D, &data, 0); //LSM6DSOX_MLC_INT1
data = 0x80;
LSM_REGISTER_RW(0x0A, &data, 0); //LSM6DSOX_EMB_FUNC_INT1
data = 0x01;
LSM_REGISTER_RW(0x0B, &data, 0); //LSM6DSOX_FSM_INT1_A
data = 0x00;
LSM_REGISTER_RW(0x0C, &data, 0); //LSM6DSOX_FSM_INT1_B
data = 0x01;
LSM_REGISTER_RW(0x01, &data, 0); //user func
//pull down disable int1
data = 0x01;
LSM_REGISTER_RW(0x62, &data, 0); //I3C_BUS_AVB
data = 0x41; //01 41
LSM_REGISTER_RW(0x56, &data, 0); //TAP_CFG0
data = 0x12;
LSM_REGISTER_RW(0x5E, &data, 0); //md1fg = int1_ff set :LSM6DSOX_MD1_CFG or md1_cfg.int1_emb_func = PROPERTY_ENABLE
data = 0x41;
LSM_REGISTER_RW(0x56, &data, 0); //tap config0
data = 0x20;
LSM_REGISTER_RW(0x0D, &data, 0); //LSM6DSOX_INT1_CTRL write
data = 0x80;
LSM_REGISTER_RW(0x58, &data, 0); //TAP_CFG2 write 0x80
///////////////////////////////////////////////////////
return 0;
} else {
return 1;
}
}
///reading code in main func
这读取了 accl 和 gyro 的值,这是我卡住的地方,因为 accl 显示正确的值和陀螺仪,但只有当我移动它时。是否有任何缓冲区或我想念的东西
while(true)
{
data=0x0;
LSM_REGISTER_RW(0x1E, &data, 1);
status = m_rx_buf[1];
for(int i=0; i<12;i++)
{
LSM_REGISTER_RW(0x22+i, &buffRead[i], 1);
}
}
解决方案
推荐阅读
- java - Java Spark Api GroupBy + 填充空字段
- c# - TeamCity build status remains pass even though there is a failure
- python - compile python application with setup.py
- wordpress - Not able to "Add to Cart' if i am not logged in
- reactjs - Fusion chart showing No Data to display in React Native
- git - 如何将本地存储库合并到裸机中的选定分支
- android - App update is available on Google Play store but there in only open option available instead on Update . How to resolve this issue?
- android - Android NDK 工具链中的 LLVM 有什么用?
- c# - C# RealProxy: for chained methods not working logging (Fluent interface pattern)
- javascript - How to have a multipage-multiple tour site using intro.js?