
我是用SPI通讯的,陀螺仪初始化之后每秒读取一次xyz的值并计算输出倾斜角,但发现读取的数据中xyz三轴的高8位一直都是0,请帮忙看看这是什么个情况,谢谢! 以下是初始化程序 void Reset_LIS3DH(void) { LIS3DH_WriteReg(LIS3DH_TEMP_CFG_REG, 0x00); // 将温度配置寄存器的值设置为0x00,配置温度传感器使能、ADC使能 LIS3DH_WriteReg(LIS3DH_CTRL_REG1, 0x07); // 将控制寄存器1的值设置为0x07,配置数据转换速率、工作模式、使能XYZ轴的加速度计数据转 LIS3DH_WriteReg(LIS3DH_CTRL_REG2, 0x00); // 将控制寄存器2的值设置为0x00,高通滤波器设置 LIS3DH_WriteReg(LIS3DH_CTRL_REG3, 0x00); // 将控制寄存器3的值设置为0x00,配置外部中断 LIS3DH_WriteReg(LIS3DH_CTRL_REG4, 0x00); // 将控制寄存器4的值设置为0x00,配置数据转换方式、数据量程、数据发送方式、SPI接口模式 LIS3DH_WriteReg(LIS3DH_CTRL_REG5, 0x00); // 将控制寄存器5的值设置为0x00,配置重启模式、低功耗模式、中断使能、FIFO使能 LIS3DH_WriteReg(LIS3DH_CTRL_REG6, 0x00); // 将控制寄存器6的值设置为0x00 LIS3DH_WriteReg(LIS3DH_REFERENCE_REG, 0x00); // 将参考寄存器的值设置为0x00 LIS3DH_WriteReg(LIS3DH_FIFO_CTRL_REG, 0x00); // 将FIFO控制寄存器的值设置为0x00 LIS3DH_WriteReg(LIS3DH_INT1_CFG, 0x00); // 将中断1配置寄存器的值设置为0x00 LIS3DH_WriteReg(LIS3DH_INT1_THS, 0x00); // 将中断1阈值寄存器的值设置为0x00 LIS3DH_WriteReg(LIS3DH_INT1_DURATION, 0x00); // 将中断1持续时间寄存器的值设置为0x00 LIS3DH_WriteReg(LIS3DH_CLICK_CFG, 0x00); // 将单击配置寄存器的值设置为0x00 LIS3DH_WriteReg(LIS3DH_CLICK_THS, 0x00); // 将单击阈值寄存器的值设置为0x00 LIS3DH_WriteReg(LIS3DH_TIME_LIMIT, 0x00); // 将时间限制寄存器的值设置为0x00 LIS3DH_WriteReg(LIS3DH_TIME_LATENCY, 0x00); // 将时间延迟寄存器的值设置为0x00 LIS3DH_WriteReg(LIS3DH_TIME_WINDOW, 0x00); // 将时间窗口寄存器的值设置为0x00 } status_t LIS3DH_Init(void) { uint8_t status; uint8_t dev_id; LIS3DH_GetWHO_AM_I(&dev_id); if (dev_id != LIS3DH_ID) return MEMS_ERROR; Reset_LIS3DH(); delay_ms(100); status = LIS3DH_SetAxis(LIS3DH_X_ENABLE | LIS3DH_Y_ENABLE | LIS3DH_Z_ENABLE); // 使能X,Y,Z轴的数据转换 if (status != MEMS_SUCCESS) return MEMS_ERROR; status = LIS3DH_SetODR(LIS3DH_ODR_25Hz); // 设置LIS3DH转换速率为100Hz if (status != MEMS_SUCCESS) return MEMS_ERROR; status = LIS3DH_SetMode(LIS3DH_NORMAL); // 设置LIS3DH为标准模式 if (status != MEMS_SUCCESS) return MEMS_ERROR; status = LIS3DH_SetFullScale(LIS3DH_FULLSCALE_2); // 设置LIS3DH的量程为2G if (status != MEMS_SUCCESS) return MEMS_ERROR; status = LIS3DH_SetBDU(MEMS_DISABLE); // 设置LIS3DH为连续更新模式 if (status != MEMS_SUCCESS) return MEMS_ERROR; return MEMS_SUCCESS; } 以下是读取xyz三轴加速度值并计算倾斜角 u8_t LIS3DH_Data_Read(void) { AxesRaw_t data; AxesProcessed_t data_processed; uint8_t pitch_decide = 0; uint8_t roll_decide = 0; uint8_t whoami; float scale_factor; LIS3DH_Fullscale_t fs; LIS3DH_GetWHO_AM_I(&whoami); if(whoami != LIS3DH_ID) return MEMS_ERROR; else printf("LIS3DH ID: %x \r\n", whoami); if (LIS3DH_GetAccAxesRaw(&data) == MEMS_SUCCESS) { LIS3DH_GetFullScale(&fs); data_processed.X = (int16_t)((float)data.AXIS_X 4.0f / 65536.0f 1000.0f); data_processed.Y = (int16_t)((float)data.AXIS_Y 4.0f / 65536.0f 1000.0f); data_processed.Z = (int16_t)((float)data.AXIS_Z 4.0f / 65536.0f 1000.0f); data_processed.pitch = (int16_t)(atan2f((float)(-data_processed.Y), data_processed.Z) 180.0f / 3.14159f); // 计算俯仰角(X轴),将结果转换为度数,并存储在data_processed的pitch成员中 data_processed.roll = (int16_t)(atan2f((float)(data_processed.X), data_processed.Z) 180.0f / 3.14159f); // 计算横滚角(Z轴),将结果转换为度数,并存储在data_processed的roll成员中 printf("Original value:x=%d, y=%d, z=%d\r\n", data.AXIS_X, data.AXIS_Y, data.AXIS_Z); printf("x%03dmg, y%03dmg, z%03dmg, pitch:%3d, roll:%3d \r\n", data_processed.X, data_processed.Y, data_processed.Z, data_processed.pitch, data_processed.roll); } else printf("LIS3DH read error\r\n"); } 以下为串口输出结果。 |
v2.0.0版本STEdgeAI-Core是否支持stm32mp2 compoment?
ST官方的Model Zoo有提供测试集供测试吗?有的话能给个链接吗?
STM32CubeIDE MyST登录出现Proxy Error
CubeMX导入AI模型报错
读取asm330lhhx传感器数据,偶尔陀螺z轴出现正负4.2度的误差,发生频率大约半小时出现一次
ISM330DLC是否可以配置倾斜检测的触发阈值?
关于GPIO
带浮点运算功能的小尺寸MCU
LSM6DSV16X
X-CUBE-A在Validation on target时报错E200(validationerror)
你配置LIS3DH为normal mode,它的数据精度为10bit,是否弄反了高低字节?建议在读取数据过程中dump所有寄存器(00-7FH),看看配置是否正常写入。另外,建议用逻辑分析仪抓取SPI总线读写寄存器的log