你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

LIS3DHTR在读取xyz三轴加速度值时发现高8位一直都是00,请问这是什么情况导致?

[复制链接]
chenken 提问时间:2025-3-12 15:54 / 未解决

我是用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"); }

以下为串口输出结果。

image.png

收藏 评论2 发布时间:2025-3-12 15:54

举报

2个回答
st_yujie2510 回答时间:2025-3-13 14:18:50

你配置LIS3DH为normal mode,它的数据精度为10bit,是否弄反了高低字节?建议在读取数据过程中dump所有寄存器(00-7FH),看看配置是否正常写入。另外,建议用逻辑分析仪抓取SPI总线读写寄存器的log

Hcdddd 回答时间:2025-12-28 18:33:14
st_yujie2510 发表于 2025-3-13 14:18
[md]你配置LIS3DH为normal mode,它的数据精度为10bit,是否弄反了高低字节?建议在读取数据过程中dump所有 ...

能请教 LIS2DH为什么XYZ角度误差过大,用风枪加热一下就行了
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版