ADXL345原始加速度值转m/s²:Zephyr代码公式疑问解析
ADXL345 ±16G量程下加速度转换:手动计算与Zephyr代码差异解析
为什么Zephyr代码里要除以32?
ADXL345在±16G量程下,10位分辨率对应的满量程范围是32G(从-16G到+16G),总共有2^10=1024个LSB。因此每个LSB对应的加速度值是:
32G / 1024 = 0.03125G/LSB = 31.25mg/LSB
这里的0.03125是1/32的精确值,也就是说1G = 32 LSB。Zephyr代码的转换逻辑是先把采样值(LSB单位)转成G值,再乘以标准重力加速度的微m/s²数值(SENSOR_G=9806650LL,对应9.80665m/s²),公式拆解后就是:
加速度(微m/s²) = 采样值 × (9806650 微m/s²/G) × (1G/32 LSB) = 采样值 × 9806650 / 32
除以32本质是利用1G与LSB的精确对应关系,用整数运算实现高效转换——这在嵌入式系统中能避免浮点数计算带来的性能开销。
手动计算与Zephyr代码的精度差异
你的手动计算和Zephyr逻辑的误差来自两个近似值的使用:
- LSB换算值:你用了文档标注的31.2mg/LSB,而芯片实际精确值是31.25mg/LSB(由32G/1024LSB推导得出);
- 标准重力加速度:你用了近似值9.81m/s²,Zephyr则采用更精确的9.80665m/s²(对应
9806650LL微m/s²)。
以采样值36为例:
- 手动计算结果:
36×31.2mg=1123.2mg=1.1232G ×9.81=11.0186 m/s² - Zephyr代码计算结果:
36×9806650/32=11032481.25微m/s²=11.0325 m/s²
两者的绝对误差约为0.0139m/s²,相对误差约0.126%,误差完全来自上述两个近似值的偏差。
总结
Zephyr的转换公式是基于ADXL345±16G量程下的精确LSB对应关系设计的,用整数运算保证嵌入式系统的执行效率;你的手动计算因使用了文档近似的LSB值和简化的重力加速度,结果存在微小偏差。如果要和Zephyr结果完全对齐,手动计算时应采用31.25mg/LSB和9.80665m/s²的精确值。
内容的提问来源于stack exchange,提问作者bielu000
相关产品推荐
相关产品推荐

