stm32 - 为什么我得到这个加速度计的错误灵敏度输出?
问题描述
我正在使用带有 STM32 I2C Hal 库的 LSM303AGR 加速度计(数据表),但我无法确定灵敏度。
这是我设置配置寄存器的代码:
void LSM303AGR_Init() {
uint8_t Data[2] = {0};
Data[0]= 0x20;
Data[1]= 0x57; //ODR @100Hz //Accelerometer Control Register 1 and Data
HAL_I2C_Master_Transmit(&hi2c1,0x19<<1,Data,2,50);
Data[0]= 0x23;
Data[1]= 0x20; //+/-8G and in normal mode
HAL_I2C_Master_Transmit(&hi2c1,0x19<<1,Data,2,50);}
第一次 I2C 写传输是寄存器 0x20,应该将传感器设置为正常模式并输出 100Hz 的数据速率,第二次 I2C 写传输应该将比例设置为 +/-8G。
此外,这是我读取 XYZ 16 位值并转换为 mg 的代码(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++) {
pData[i]=(float)((int16_t)((uint16_t)buffer[2*i+1] << 8) | buffer[2*i]) / 15.63;} //Readings in mg
}
我知道我正在写入这些寄存器并通过调试从正确的寄存器中读取。但是,通过上面的设置,我在桌面上使用 15.63 的灵敏度得到大约 250mg 的输出值(对于 z 轴,当然其他的大约为零)但是当我将 15.63 更改为 3.9 灵敏度时(数据表第 13 页)我在 z 轴上得到大约 1000mg 这是正确的!问题是,我的寄存器设置为 +/-8G(数据表第 49 页)和正常电源模式(数据表第 47 页),根据数据表,灵敏度应该是 15.63 而不是 3.9!
任何帮助将非常感激!
解决方案
您使用的是普通模式,因此您的数据应该是 10 位,并且您应该将读取数右移 6(值左对齐)。
推荐阅读
- python - 带有大对象的 Memcached(NetworkX 图)
- python - 为什么 pylint 对我的工作代码不满意?
- kubernetes - 是否可以使用 Kubernetes 部署和 PVC 引导 Artifactory-OSS Docker 映像?
- c# - Azure WebJobs (3.x) 连续作业未在仪表板中显示函数
- f# - 如何计算文件系统中的文件
- python - Python 读取以“\”反斜杠分隔的 .txt 文件
- xpath - XPath:在某个其他节点出现后的任意位置查找节点
- ios - 使用最少的行数设置最大标签宽度
- android-ndk - 无法将预构建的静态库与 Android NDK 中的共享库链接
- java - 从数据库读取时间戳比 GMT 时间晚 4 小时。但存储为 GMT