ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

LSM303AH电子罗盘实战:硬件布局、倾角补偿与磁标定指南

LSM303AH电子罗盘实战:硬件布局、倾角补偿与磁标定指南 做嵌入式这些年我第一次拿到LSM303AH的时候其实挺不以为然的——一颗2mm见方的12引脚LGA小封装里塞了加速度计和磁力计不就是把两片传感器封装到一起嘛。后来真正把电子罗盘功能做进量产产品才发现大部分工作量不在芯片本身而在怎么把一个毫高斯级别的磁场从充满干扰的主板上读出来再转成准确的航向角。这篇文章就围绕这颗LSM303AH的超紧凑、高性能eCompass模块把我在实际项目里的硬件布局、软件解算、寄存器配置和磁标定做法整理出来踩过的坑也一并交代。1. LSM303AH这颗芯片解决的到底是个什么问题1.1 电子罗盘的本质在地磁场里找方向电子罗盘没那么多玄学它要做的只有一件事测出地磁场方向再换算成航向角。麻烦在于地磁场本身太弱了不同纬度下大概只有0.25到0.65高斯而耳机里一颗小小的扬声器磁铁就能到几百上千高斯。这就像在一个摇滚演唱会现场听旁边的人说悄悄话传感器灵敏度再高架不住周围噪声比你关心的信号大几个数量级。所以eCompass不是“能测磁场”就行而是要在干扰环境里稳定测出那个微弱的矢量。LSM303AH这种把3轴加速度计和3轴磁力计封装在一起的模块就是为了解决“测出磁场矢量”以及“把这个矢量转成航向角”这两个问题。磁力计单独只能告诉你传感坐标系的磁场方向但它不知道自己的坐标轴有没有歪。这时候加速度计派上用场了静止状态下加速度计的方向就是重力方向重力方向就是“下”有了“下”我们就能把磁力计的观测值投影回水平面再算出一个与姿态无关的航向角。这就是eCompass最基本的原理加速度计定水平面磁力计定北方向两个数据合起来才是完整罗盘。在实际项目中我见过不少团队直接用一颗磁力计加一颗加速度计自己做硬件拼搭效果也不是不行但做完后往往会发现两个问题。第一是两颗芯片的空间对齐精度很难保证中间哪怕歪个两三度最终航向角就会有对应的系统误差。第二是两套配置和驱动逻辑都会重复尤其在低功耗设备里两颗芯片没办法统一调度的话功耗和代码体积都会有浪费。LSM303AH这类集成模块把两个传感器对齐在同一个封装的同一颗die旁边生产一致性和软件复杂度都会好很多。1.2 “超紧凑、高性能”这几个字该怎么理解“超紧凑”很好理解。2×2×1mm的尺寸在智能手表、TWS耳机、AR眼镜这类内部空间一寸一寸算的穿戴设备里确实比两颗分立传感器加起来省地方。“高性能”则要看怎么定义不是看它寄存器写起来多花哨而是看几个硬指标。一是磁力计的动态范围和分辨率LSM303AH给出的磁场动态范围有±50高斯地球任意位置的磁场都远小于这个值所以不用担心量程饱和二是噪声水平低噪声意味着在静止状态下航向的抖动更小不需要靠很重的低通滤波来压噪三是功耗穿戴设备对功耗抠得严ODR降下去之后工作电流能压到很低的水平。我实际测下来这颗芯片比较适合的产品是手表手环里做指向和旋转识别、耳机充电盒里做姿态识别、机器人里做初始航向参考以及室内寻北装置这一类对体积敏感又要求一定精度的场景。2. 硬件设计Pin脚以外更需要操心的干扰问题2.1 布局先把磁干扰源画出来LSM303AH的引脚数不多按数据手册接上电源、地、I2C/SPI就能跑起来。但如果你直接把它放在扬声器旁边、电池负极铜皮下面或者大电流走线正上方那后患无穷。硬件设计阶段最重要的一件事是把PCB上所有“磁性相关”的干扰源画出来再决定传感器放哪里。常见的磁干扰源有这几类永磁体扬声器、马达、磁吸扣、霍尔传感器后面的磁钢。这些是固定磁干扰会让磁力计输出叠加一个固定偏移。大电流走线和电池回路电流在PCB走线上流过周围会产生环形磁场。电流越大、距离越近磁场梯度越明显。铁磁性结构件螺丝、屏蔽罩、钢化电池壳、某些连接器弹片。这些本身不主动产生磁场但会改变磁力线分布让本来规则的磁场变得“扭曲”。我的做法是硬件原理图阶段就把这几种位置的器件标出来尽量让LSM303AH离它们远一点。距离没有万能的“5mm安全线”因为扬声器线圈那类强磁体隔了1cm依然可能有明显干扰。更可靠的办法是出第一版PCB后不做任何外壳时先裸板通读一遍三个轴的磁场数据和噪声再用绝缘胶带把传感器挪到板上不同候选位置看哪个位置的磁场图像最干净、旋转时数据最接近球面。这样做一次选址比对着数据手册猜安全距离靠谱得多。磁力计附近的地平面也要注意。高频噪声不是磁场的主要问题但地平面不完整导致回流路径绕路在地磁信号上会叠加出不好看的低频分量。传感器底下尽可能保持一块完整的地不要被其它走线割裂。2.2 电源与接口这是稳定性的地基LSM303AH这类传感器耗电很小不意味着可以随便从一个噪声很大的电源轨上拉电。以我的经验摄像头的闪光灯驱动、射频PA、音频功放的电源轨都和传感器电源分开会好很多。供电上尽量用一个安静的LDO并在VDD引脚旁边放一颗0.1µF的陶瓷电容有条件再补一颗1µF。电容位置比容量更重要必须贴近传感器引脚否则高频噪声一样进得了芯片。I2C接口上上拉电阻用4.7kΩ还是2.2kΩ要看总线频率和线缆长度。如果是模块形式延伸出一段FPC线建议用2.2kΩ甚至1kΩ这样上升沿不容易变得太缓。低速时拖慢一点无所谓但总线上还有其它器件时上升沿太差会引入误触发。SPI模式下则要注意MISO线上不要有长走线否则高速读取数据时容易读到毛刺。如果产品是心率计、显示屏、传感器共用一条I2C总线我通常会在传感器数据线上加个小阻值的串联电阻比如22Ω或33Ω用来吸收振铃。2.3 机械装配和坐标对齐这里是个经常被忽略的点。LSM303AH的传感器坐标系是相对于封装外壳是固定的但产品上用户关心的方向是“手表表盘指向哪”、“耳机柄朝哪”。机械结构上传感器贴板角度偏了几度标定之后系统误差就偏几度。如果外壳安装虚位大每次装出来的角度都不一样那软件里补偿都补不干净。所以我在产品结构件上会坚持给传感器位置加定位孔或定位边PCB拼板出货时也要保证同一批板子的贴片角度一致。实在有装配变动就在出厂前加一个“机架水平校准”流程把整机放在一个标准的水平转台上让系统学习一个传感器坐标系到整机坐标系的旋转角。这一步做成自动校准能救回不少结构公差带来的航向误差。3. 软件解算加速度计、磁力计和航向角是怎么拼在一起的3.1 先统一坐标系比算法本身更容易出错写解算代码的第一个坑往往是坐标系。传感器的X、Y、Z轴和产品定义的前、右、下方向经常不一样。如果拿着网上抄的公式直接用最典型的结果是平板水平时航向是准的一倾斜就乱或者所有角度都偏了90度。我的建议是第一步先建立一个明确的坐标映射关系。比如产品定义“前”是设备前进方向“右”是设备右侧“下”是穿出底盘。然后在代码里用一个结构体保存原始三轴数据再通过一个3×3矩阵把传感器轴变换到产品轴。这个矩阵在初始化时写好后面所有算法都在产品坐标系下进行避免到处改符号。这一步不要嫌麻烦。我见过很多项目把符号修正写成if条件散落在各个函数里当时能跑换一批板子或换一个安装方向就彻底乱套。统一坐标系后整个逻辑会清晰很多。3.2 加速度计求横滚和俯仰我们假设已经统一到“右、前、下”坐标系姿态变化用横滚角roll和俯仰角pitch表示。静止或匀速状态下加速度计测量的就是重力矢量所以可以从加速度分量提取角度roll atan2f(ay, az); pitch atan2f(-ax, sqrtf(ay * ay az * az));这段代码里用到atan2而不是asin好处是不会因为单个轴超量程产生角度突变而且在横滚接近90度时也还有合理输出。注意符号取决于你的坐标系定义。如果传感器安装方向不一样这个公式的符号会整体反转用起来前先拿一个已知姿态验证一遍。还有一个重要前提加速度计只在静止或缓慢运动时才能当作重力计。如果产品在快速移动或转动线性加速度会混进来导致计算的横滚俯仰发生抖动。动态场景下如果想保持航向稳定要么限制传感器在被测对象轻微运动时工作要么配合陀螺仪做姿态融合。LSM303AH本身没有陀螺仪所以这不适合做无人机那种高速姿态解算更适合手表、耳机、遥控器这类以静止和慢速旋转为主的产品。3.3 磁力计倾角补偿与航向公式有了roll和pitch就可以把磁力计测得的三轴磁场矢量投影回水平面。常用公式是这样的xh mx * cosf(pitch) my * sinf(roll) * sinf(pitch) mz * cosf(roll) * sinf(pitch); yh my * cosf(roll) - mz * sinf(roll); heading atan2f(yh, xh);这里的mx、my、mz是磁力计原始经过标定校正后的三轴输出。公式的本质是把磁矢量绕传感器坐标轴旋转把倾斜带来的分量抵消掉让罗盘在倾斜状态下也能得到正确的水平投影方向。最后用atan2得到0到360度的航向角再根据需求加上当地的磁偏角就能把磁北方向转成地理北方向。很多人在这一步会疑惑为什么公式里只有roll和pitch没有yaw因为罗盘本身要算的就是yaw所以这一个自由度当然不该由传感器姿态来提供它只能从磁场矢量里恢复出来。写代码的时候我会把航向角处理成0到360度并把小于0的值加上2π这样后续判断“某个方向区间”会比较方便。还要注意浮点精度在设备要求不高时可以全用float如果空间允许也可以全用double但不要float和double混用否则靠内的隐式转换会把代码的可读性和精度一起搞乱。下面这个完整函数是我在项目里常用的一段你可以直接拿去参考#include math.h typedef struct { float ax, ay, az; float mx, my, mz; float hard[3]; // 硬磁偏移 float soft[3][3]; // 软磁校正矩阵 } compass_t; static float compass_heading(compass_t *d) { // 1. 加速度计计算横滚和俯仰 float g sqrtf(d-ax*d-ax d-ay*d-ay d-az*d-az); if (g 0.1f) return -1.0f; float roll atan2f(d-ay, d-az); float pitch atan2f(-d-ax, sqrtf(d-ay*d-ay d-az*d-az)); // 2. 磁力计硬磁/软磁校正 float x d-mx - d-hard[0]; float y d-my - d-hard[1]; float z d-mz - d-hard[2]; float cx d-soft[0][0]*x d-soft[0][1]*y d-soft[0][2]*z; float cy d-soft[1][0]*x d-soft[1][1]*y d-soft[1][2]*z; float cz d-soft[2][0]*x d-soft[2][1]*y d-soft[2][2]*z; // 3. 倾角补偿投影到水平面 float xh cx * cosf(pitch) cy * sinf(roll) * sinf(pitch) cz * cosf(roll) * sinf(pitch); float yh cy * cosf(roll) - cz * sinf(roll); // 4. 计算磁航向再转成0~360度 float heading atan2f(yh, xh); if (heading 0.0f) heading 2.0f * M_PI; return heading * 180.0f / M_PI; }这段代码不包含姿态融合也没有加滤波它反映的是最朴素的核心算法。实际产品中我会在步骤4之前把磁场数据做低通滤波减少震动带来的跳变。3.4 滤波别把信号滤没了磁力计原始数据里通常混有高频噪声尤其是周围有电机、PWM负载时磁场会随电流变化波动。处理办法大多是低通滤波。我常用一阶IIRfiltered alpha * raw (1 - alpha) * filtered;alpha的选择和采样率有关一般让时间常数在几十毫秒到几百毫秒之间。对静态手表指南针时间长一点没关系对需要跟随人体转动的穿戴设备过大的时间常数会让航向角“拖尾巴”转过去之后还半天回不过来。如果噪声主要来自某个固定频率比如电机换向噪声普通低通不够干净可以先在硬件上做隔离或者在采样端做一个小窗口的滑动平均。滑动窗口长度我通常取4到8个点太长了延迟就上去了。一个更麻烦的问题是有些产品转得快加速度计已经不能准确给出重力方向此时航向会随着倾斜错误而大幅偏转。这种场景下如果产品里有陀螺仪我会用加速度计和磁力计做初始对准再让陀螺仪积分姿态靠磁力计和加速度计缓慢修正漂移。LSM303AH只含加速度计和磁力计所以更适合没有大幅度瞬时运动的场景。4. 寄存器配置初始化流程里的那些小门道4.1 上电后先别急着读数据很多新手拿到LSM303AH第一件事就是查数据手册的寄存器表然后写一串初始化值。我的建议是先把芯片当成一个传感器子系统来对待上电后按这个顺序操作等待芯片内部上电稳定一般给个10ms以上的延时。读WHO_AM_I寄存器校验I2C/SPI通信是否正常。执行一次软复位把芯片恢复到默认配置。再等待一段时间然后读取状态寄存器或Data Ready标志确认数据已同步。WHO_AM_I这个检查很多人会嫌它多余但它能帮你把“通信不通”和“配置错误”快速分开。I2C总线上设备一多地址冲突、线没焊牢、电平不匹配都会导致读到0xFF或0x00。先确认芯片ID后面所有折腾都会省很多时间。4.2 量程和ODR怎么选加速度计量程的选择要平衡分辨率和动态范围。如果产品平时只有重力场和轻微晃动用±2g或±4g就能让倾斜角分辨率最高。但如果是手环这种戴在手上会跑的偶尔会有±8g甚至更高的冲击量程太小会削顶导致倾斜角计算错误。我一般默认用±4g起步压测有剧烈冲击再往上调。磁力计的量程不用太纠结地球磁场远远小于芯片能测的上限。重点要关注的是磁力计工作模式。低功耗模式虽然省电但噪声会变大对于需要稳定航向的产品完全不划算。我会尽量选高性能或高分辨率模式功耗多出来的零点几毫安在总系统功耗里通常可以接受。ODR的选择则是“够用就好”。手持罗盘和穿戴设备里加速度计和磁力计同时用50Hz左右就够了再高除了让MCU多干活对精度帮助不大。如果产品需要检测快速转动或摇晃我会把加速度计提到100Hz磁力计因为本身更新率有限最多取到芯片支持的较高档位而不是随意翻倍。ODR太高时滤波器的响应时间反而变成瓶颈数据看起来密密麻麻实际有效信息并没有增加。4.3 Data Ready和FIFO到底要不要用最省事的读法是在主循环里按固定周期直接读三轴数据但这有个隐患如果MCU正好读到加速度计新数据、磁力计还是旧数据这次解算会把两个不同时刻的矢量配对航向角会出现瞬间偏差。为了减少这种问题我习惯在读传感器之前先检查Data Ready状态位确认两个传感器都有新数据后再一起读。当系统要做手势识别或姿态事件时FIFO会很有用。LSM303AH内置FIFO可以把一段时间的数据缓存下来MCU不用频繁被打断攒够一批再批量搬走功耗能明显降下来。FIFO的用法是配置触发阈值和FIFO工作模式比如水印中断然后等中断来了再搬数据。它不像普通寄存器读取那样每帧都要进中断尤其在低功耗MCU上收益很大。但不建议一上来就把FIFO、中断、引脚映射全部配满。我踩过的坑是中断脚配置错了极性导致系统一直在中断里空转FIFO模式设置成“连续采集”但忘记清标志数据积压后航向滞后严重。先用最简单的轮询把传感器跑通再逐步加FIFO和中断是一种更稳妥的推进方式。5. 标定决定航向精度的大头5.1 硬磁和软磁两种最常见的误差我见过不少团队算法写得没问题硬件布局也没大毛病但航向就是差个三五度。最后查来查去都是没做磁标定。磁力计装在整机上后会因为周围金属和永磁体产生两类误差硬磁误差来自固定方向的外加磁场比如扬声器磁钢、主板上的磁珠、金属结构件。它的效果相当于是给三个轴各加了一个固定的偏移量。更简单的理解如果传感器在纯净磁场中旋转三轴数据的轨迹应该是一个标准球面有了硬磁干扰球面的球心就不在原点。软磁误差则来自铁磁材料对磁力线的“扭曲”。它不是增加或削掉一个固定磁场而是让本来均匀的磁场在特定方向被压缩或拉伸。结果就是旋转传感器时三轴数据的轨迹从球面变成了椭球面而且椭球的轴向不一定和传感器坐标轴对齐。所以标定的目标很明确先找到椭球球的球心去掉硬磁偏移再想办法把椭球“掰回”球形去掉软磁缩放和轴间耦合。只做前者能解决“整体偏一个固定角度”的问题只做后者而没做前者结果也一样拉胯。完整的标定就是这两件事同时做。5.2 现场标定操作流程标定必须在整机的最终状态、最终工作电流、最终外壳环境下进行不能拿裸板在桌面标完再装机。原因很简单外壳上的磁扣、电池屏蔽膜、结构件的螺丝都会改变传感器面前那个局部磁场。把传感器单独放在实验台上标得再漂亮装进整机后全部作废。实操步骤我一般是这样的把整机平放确保周围没有强磁环境别在电机旁边、别在电源适配器磁环边上。采样程序开启以10到20Hz的频率记录磁力计原始数据。操作员手持整机让它绕X轴转一整圈再绕Y轴转一整圈再绕Z轴转一整圈。这个动作的目的是让磁力计三轴都能覆盖到所有可能的磁场方向。如果嫌三轴各转一圈麻烦可以用“8字绕法”让设备在空中缓慢画8连续转一到两分钟数据也能覆盖得比较全。采样结束后把数据丢到上位机做偏移和椭球拟合得到硬磁偏移向量和软磁矩阵。烧到产品的非易失存储里。生产线上每台设备都要做这一步千万不要把所有设备用同一个标定结果因为每个产品的磁干扰源位置和装配公差都有差异。采集过程中最怕的是只在一个平面里画圈。那样Z轴数据覆盖不全拟合出来的椭球在Z方向几乎不可信装进产品后一旦倾斜航向误差立刻放大。这个坑我掉进去过后来我都会在标定界面上画一个简单的“球面覆盖率”指示数据点在某一个方向过于稀疏就提醒操作员重新转。5.3 椭球拟合用最小二乘推出来如果只需要粗略标定可以只算硬磁偏移让设备在水平面旋转取X轴最大值和最小值的平均值作为X偏置Y轴同理。但这对全姿态罗盘不够因为Z轴偏置你没有采集到。所以只要条件允许我建议直接做三维椭球拟合。椭球拟合可以转化成线性最小二乘问题。假设真实磁场模长H是常量测量经过偏移和软磁矩阵变换后满足[ (mx-bx) ]^T * A * [ (mx-bx) ] H^2把它展开就得到一个关于bx、by、bz、A矩阵元素的线性方程。每个采样点给一条方程用最小二乘解出这些参数就行。下面是我在Python里搭过的拟合代码骨架跑出来的参数喂给C代码里那个soft矩阵和hard偏移import numpy as np def fit_ellipsoid(measurements): # measurements: (N, 3) 的原始磁力计数据 mx measurements[:, 0] my measurements[:, 1] mz measurements[:, 2] # 构造线性方程组 A np.column_stack(( mx*mx, my*my, mz*mz, 2*mx*my, 2*mx*mz, 2*my*mz, 2*mx, 2*my, 2*mz )) b np.ones(len(mx)) # 假设 H^2 1归一化处理 coeff, _, _, _ np.linalg.lstsq(A, b, rcondNone) # 由系数求出椭球中心 # 具体公式是解一个3x3对称矩阵的逆和线性项的半负乘积 # 思路见“椭球拟合”经典文献代码里按公式展开即可 return center, soft_matrix从lstsq结果里把九个系数换成椭球中心坐标和软磁矩阵公式在“ellipsoid fitting”相关的文献里都能找到。步骤总结起来就是解线性方程组得到二次项矩阵和一次项向量然后中心就是二次项矩阵的逆乘以负的一次项向量的一半。这样求出的偏移比单纯拿最大值最小值求平均值鲁棒很多尤其是数据覆盖不完全均匀的时候。拟合完一定要做验证。把原始数据代入校正后的公式看校正后的数据模长是不是恒定值。如果拟合做得好校正后的模长标准差应该很小如果标准差还很大说明采集的数据量不足、覆盖不均匀或者中间有其它干扰源在做动态变化。我见过有人拟合完就把数据存起来用结果校正后模长忽大忽小那种情况多半不是公式问题而是数据采集环节的问题。6. 实机调试中踩过的坑6.1 扬声器、电机和电池的“动态硬磁”第一次把LSM303AH放进带扬声器的产品里我以为只要标定一次就万事大吉。结果发现播放音乐时航向角会随着音量大小漂移。原因很直接扬声器的音圈里流过的是动态电流电流产生的是一个动态磁场它叠加在静态磁钢的硬磁偏移之上。静态标定只能标掉固定的那部分音圈电流带来的那部分随时在变。遇到这种情况我能给的最有效建议是在硬件布局阶段就离喇叭远一点或者把传感器放到音圈磁场梯度更小的位置。如果空间实在不允许就只能靠软件侧降低动态电流的负面影响比如在音频播放暂停时重新校准或者对航向输出做幅度阈值判定检测到磁场模长异常时暂时报“状态不可靠”。磁力计本身没有能力区分地磁场和动态磁场所以这种问题最好在设计源头解决。电机的换向电流也类似只不过它是高频脉冲更多表现为噪声而不仅仅是偏移。电机启动、刹车瞬间磁场模长会有肉眼可见的跳变。带电机的小家电、机器人如果传感器离电机太近即便做了标定和滤波航向也会有规律性抖动。电池大电流回路也是个隐蔽的坑。电池负极经过PCB回流到负载这个回路上电流大时电流环路周围会产生磁场。手机、手表的瞬时大电流尤其在屏幕高亮、射频发射、电机转动共存的瞬间传感器观测到的磁场会明显波动。PCB布局上把大电流回路的面积尽量缩小让传感器避开这个回路是我在项目里验证过最有效的手段。6.2 屏幕刷新和大电流有一款设备里我一度被一个“时不时偏两度”的问题折腾了很久。后来拿示波器去测磁力计的电源轨才发现屏幕刷新期间电源电压有小幅跌落刷新结束又恢复。传感器供电不稳定内部ADC的参考电压就跟着晃输出值自然会产生偏差。这个问题跟地磁场本身无关却直接表现为航向误差。解决办法是传感器供电不要直接从屏幕电源附近取单独用一个稳定的LDO同时把传感器放在屏幕刷新造成的辐射耦合更小的位置。排查这类问题的一个技巧是持续记录磁场模长并和屏刷新事件打时间戳看模长变化是否和刷新同步。同步就能坐实是干扰源在作祟。6.3 温度对偏移和标定的影响磁力计的偏移量会随温度变化这种现象并不只存在于低端传感器里LSM303AH也一样会有温漂。我们有一款户外产品在常温下标定得好好的发到北方冬天去用用户反馈指北方向偏了好几度。后来把整机放进温箱做对照测试发现磁力计输出确实随温度发生了偏移。对精度要求高的产品我会在标定时增加温度点至少做常温、高温、低温三组标定按温度区间切换偏移表。如果系统里有温度传感器可以建立偏移量和温度的线性回归关系。如果产品工作温度范围比较窄简单地只在目标温度下标定一次也能把误差控制在可接受的范围。6.4 怎么快速验证航向精度产品做完了怎么判断这颗eCompass到底准不准我的验收方法比较朴素找一个无强干扰的室内空间摆放一台自己搭的简易转台把整机固定上去让系统每30度停一次记录航向输出值。以转台的角度作为参考如果转台本身精度不够就用机械定位销来保证位置连续旋转两圈记录每个位置的误差分布。这种测试能反映两件事一个是绝对精度也就是航向角整体偏了多少另一个是重复性也就是同一个位置两次测量之间差了多远。绝对精度不够多半是标定或磁偏角没处理重复性差往往来自传感器噪声、结构松动或滤波参数没调好。对常见的穿戴产品静态重复性做到正负1度以内是可以期待的绝对精度再到正负3度左右对大部分非导航类产品已经很够用。要特别提醒的是不要拿手机的指南针作为参考标定设备。手机的磁力计通常经过长时间融合、平滑还会根据GPS和陀螺仪修正你和它比永远有对不上的地方。如果现场没有转台用一根长杆把设备固定在远离铁器的木质平台上旋转到几个已知角度做对比也比直接拿手机比靠谱。做了这么多年我最深的体会是LSM303AH这类eCompass模块硬件接入本身并不难难的是把它“安排”在一个磁场足够干净、供电足够稳定、机械结构足够可靠的位置上。只要这几个前提做好后面的标定和解算就都是顺理成章的事情。希望这篇应用笔记能帮你少走几段弯路。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进