LSM303AGR加速度计配合STM32使用时输出灵敏度参数异常求解
LSM303AGR灵敏度不匹配问题解决
核心原因
灵敏度参数不匹配是因为LSM303AGR正常模式下的加速度计输出为左对齐存储,你直接使用拼接得到的16位原始值计算时,没有剔除无效低位导致计算结果偏差。
你当前的配置下,CTRL_REG4_A寄存器的HR位(bit3)为默认值0,对应10位分辨率的正常模式,10位有效数据会左移6位存放在16位输出寄存器中,低6位为无意义的填充位,直接参与计算会导致结果失真。
修复方案
方案1:保留现有正常模式配置,仅修改转换逻辑
无需调整初始化代码,只需要在转换时先将16位原始值右移6位剔除无效低位,再除以15.63的灵敏度系数即可:
void LSM303AGR_AccReadXYZ(float* pData) { HAL_I2C_Master_Transmit(&hi2c1,(0x19<<1)|0x01,&accXYZregAutoRead ,1,50); HAL_I2C_Master_Receive(&hi2c1,(0x19<<1)|0x01, buffer,6,50); for(int i=0; i<3; i++) { int16_t raw = (int16_t)((uint16_t)buffer[2*i+1] << 8 | buffer[2*i]); pData[i] = (float)(raw >> 6) / 15.63f; } }
方案2:开启高分辨率模式,匹配3.9的灵敏度系数
如果你不想做移位操作,可以修改初始化配置开启12位高分辨率模式,此时±8G量程对应的灵敏度就是3.9mg/LSB,和你测试正常的参数一致:
- 修改初始化代码中CTRL_REG4_A的写入值,开启HR位:
void LSM303AGR_Init() { uint8_t Data[2] = {0}; Data[0]= 0x20; Data[1]= 0x57; HAL_I2C_Master_Transmit(&hi2c1,0x19<<1,Data,2,50); Data[0]= 0x23; Data[1]= 0x28; // 原0x20修改为0x28,开启HR位(bit3),保留±8G量程配置 HAL_I2C_Master_Transmit(&hi2c1,0x19<<1,Data,2,50); }
- 对应修改转换逻辑,右移4位剔除高分辨率模式下的无效低4位:
void LSM303AGR_AccReadXYZ(float* pData) { HAL_I2C_Master_Transmit(&hi2c1,(0x19<<1)|0x01,&accXYZregAutoRead ,1,50); HAL_I2C_Master_Receive(&hi2c1,(0x19<<1)|0x01, buffer,6,50); for(int i=0; i<3; i++) { int16_t raw = (int16_t)((uint16_t)buffer[2*i+1] << 8 | buffer[2*i]); pData[i] = (float)(raw >> 4) / 3.9f; } }
额外注意事项
- 确认读取多字节数据时的寄存器首地址已开启自动增量位:
accXYZregAutoRead的值应为0xA8(即0x28 | 0x80),ST系列传感器读取多字节数据时需要将寄存器地址最高位置1,否则不会自动递增地址,导致读取到重复数据。 - 可按需开启CTRL_REG4_A的BDU位(bit7,写入值增加
0x80即可),保证读取的高低字节属于同一组采样,避免数据错位。
内容的提问来源于stack exchange,提问作者user13909066
相关产品推荐
相关产品推荐

