MM MMC5603 测试指南
DFRobot SKU:0805 · I²C 0x30

MMC5603 三轴磁力计
快速测试资料

四根线就能读出 X/Y/Z 磁场和芯片温度。本页给出两套接线(普通 ESP32 与 2.8 寸 CYD 黄屏)、批量测试工装的判定标准、单位换算和常见故障排查。

±30 G 满量程 20 位 输出分辨率 1 kHz 频率响应 I²C 地址 0x30
MMC5603 三轴磁力计模块正面

MMC5603 模块主要参数

芯片参数取自 MEMSIC《MMC5603NJ Rev.B》数据手册(18 页),模块参数取自 DFRobot SKU:0805 商品页与本项目实测程序。

主芯片MEMSIC MMC5603NJ
传感器类型AMR 三轴磁传感器
模块DFRobot SKU:0805
板载接口STEMMA QT / Qwiic
通信接口I²C 快速模式 / I3C
I²C 地址0x30 注: 唯一地址
满量程磁场±30 Gauss(±3000 µT)
输出分辨率20 位
磁场分辨率约 0.0625 mG(≈ 6.25 µT)
频率响应上限1 kHz
芯片供电 VDD1.62V ~ 3.6V
模块 VCC3.3V ~ 5V
片内温度传感器支持(单位 °C)
工作环境温度-40°C ~ 85°C
驱动库Adafruit_MMC56x3
本项目 I²C 地址0x30

四根线:电源两根,总线两根

VCC/GND 给模块供电,SDA/SCL 走 I²C。模块没有地址跳线,接线之外不需要任何额外配置。

普通 ESP32 开发板

MMC5603 VCCESP32 3V3
MMC5603 GNDESP32 GND
MMC5603 SDAGPIO 21
MMC5603 SCLGPIO 22
注意 串口版程序使用 SDA=GPIO21、SCL=GPIO22;换引脚要同步改 Wire.begin() 的两个参数。

2.8 寸 CYD 黄屏(批量测试工装)

MMC5603 VCCCYD 3V3
MMC5603 GNDCYD GND
MMC5603 SDAIO 27
MMC5603 SCLIO 22
易错点 ESP32-2432S028R 的 I²C 扩展口只把 SDA 引到 IO27,沿用 GPIO21 会一直扫不到 0x30。

本项目接线图(Fritzing)

MMC5603 与 ESP32 的 Fritzing 接线图

接线以本图与项目 FZZ 为准,人工确认后不再自动重布线。

Qwiic 直插与排针

MMC5603 模块 STEMMA QT 接口

红色 STEMMA QT / Qwiic 座可直插 4 针线,插反不会烧,但读不到数据。

芯片内部信号链

外界磁场 X / Y / Z
→
MMC5603NJAMR 惠斯通电桥
SET/RESET 复位
片内信号处理 + 20 位 ADC
→
数字总线I²C 0x30
→
主控ESP32
原理 AMR 桥输出经片内放大与 20 位量化,温度传感器同路输出;主控只需按寄存器读出 X/Y/Z 与温度。

先看接线,再看原理与源码

四段视频分别对应接线顺序、模块认识、芯片原理和源码逐行讲解,全部由本项目素材生成。

Fritzing 动画

完整接线顺序

VCC、GND、SDA、SCL 四根线的走向,以及 Qwiic 座与排针两种接法。

模块解说

MMC5603 模块认识

板上器件、引脚定义与典型使用场景。

芯片原理

AMR 电桥到 20 位输出

磁场如何变成寄存器里的数字量,以及 SET/RESET 复位的作用。

源码讲解

初始化与读取逐行看

begin / setDataRate / getEvent / readTemperature 的实际执行顺序。

先确认通信,再确认量值

磁力计不需要外接负载:桌面环境本身就有约 50 µT 的地磁场,这就是最方便的“标准信号源”。

1

上电前核对引脚

VCC 3.3V、GND、SDA、SCL 四根线;CYD 屏的 SDA 必须走 IO27。

2

扫描到 0x30

I²C 扫描只应看到 0x30;扫不到先查供电与 SDA/SCL 是否反接。

3

读 10 个样本取平均

数据率设 100 Hz,有效样本少于 3 个直接判失败。

4

拿磁铁复核变化

磁铁靠近时对应轴明显变化,移开后回到原值,说明三轴都活着。

三轴合磁场换算

合磁场 -- µT
方位角 (XY 平面) -- °
换算 Gauss -- G
占满量程 ±3000 µT -- %

批量测试工装的判定项

判定项通过条件取值来源
芯片通信0x30 应答成功mmc.begin()
有效样本10 次中至少 3 次getEvent()
三轴量值各轴平均 < 3000 µT 且至少一轴非零X / Y / Z 均值
芯片温度-40 °C ~ 125 °CreadTemperature()
地磁区间合磁场 15 ~ 80 µT√(X²+Y²+Z²)
提示 合磁场超出 15 ~ 80 µT 通常不是模块坏,而是旁边有磁铁、铁质桌面、电源适配器或电机。
44.7 µT 等于 0.447 G,不是 44.7 G

单位换算是唯一的坑

库直接输出 µT;数据手册用 Gauss 和 mG。1 G = 100 µT = 1000 mG,满量程 ±30 G = ±3000 µT,桌面环境地磁约 25 ~ 65 µT。

µT ÷ 100 = G;  G × 1000 = mG;  ±30 G = ±3000 µT

串口版看数值,CYD 版看结论

同一块模块,两种输出:串口版逐行打印原始数据,工装版在 2.8 寸屏上直接给 PASS / FAIL 与累计数量。

X / Y / Z µT 三轴磁场

串口 115200 逐行打印,每 200 ms 一组。

44.7 µT 合磁场

三轴均值的矢量长度,用来判断是否在环境地磁区间。

145° 方位角

atan2(Y, X) 折算到 0 ~ 360°,模块水平旋转时连续变化。

28.6 °C 芯片温度

片内温度传感器读数,兼作上电自检的第二个证据。

等待 / 测试中

工装每 500 ms 扫描一次总线:插上模块自动开始测试,拔掉回到等待页,可循环使用。

结果 / 计数

屏幕显示四项判定明细与累计测试数、通过数,产线上一眼可判断好坏。

100 Hz

mmc.setDataRate(100):演示与产线测试足够,最高可到 1 kHz 频率响应。

400 kHz

Wire.setClock(400000):I²C 走快速模式,杜邦线较长时可回退到 100 kHz 再试。

按这个顺序查,基本不用换模块

MMC5603 只有一个 I²C 地址,也没有可配置的引脚,所以问题几乎都出在接线与外部环境上。

现象

扫不到 0x30

先量 VCC 是否 3.3 ~ 5V,再确认 SDA/SCL 没反接;CYD 屏必须用 IO27,普通 ESP32 用 GPIO21。

现象

读数一直是 0

多为 getEvent() 未取到有效样本。检查是否设置了数据率、总线是否被其他设备拉低。

现象

数值乱跳

附近有磁铁、电机、电源适配器或铁质桌面;把模块拿离桌面重新读取,能回稳就不是模块问题。

现象

Z 轴与 X/Y 差很多

正常现象。地磁场有倾角,模块平放时垂直分量本来就最大,换个方向读数会重新分配。

不要为了“好看”去改标定值 合磁场落在 15 ~ 80 µT 之外时,先排除外部磁源与安装方向,再考虑工装阈值。放宽阈值等于放弃判定,产线不建议这么做。
关于 ±3000 µT 满量程 接近满量程时数据会饱和,此时读数不再随磁场线性增长。测强磁体请用霍尔传感器或保持足够距离。

不能直接套用 HMC5883L / QMC5883L 程序

三者都是 I²C 三轴磁力计,但地址、寄存器和换算系数都不同:MMC5603 固定 0x30,HMC5883L 常见 0x1E,QMC5883L 常见 0x10。

本工程统一使用 Adafruit_MMC56x3(支持 MMC5603 / MMC56x3 系列),platformio.ini 已配置 adafruit/Adafruit MMC56x3。
查看 Adafruit MMC56x3 库 ↗

一条总线只能挂一颗

MMC5603 没有可选地址引脚,同一条 I²C 总线上挂两颗会直接冲突。需要多点测量时,用 I²C 多路复用器(如 TCA9548A)给每颗独立通道。

导航类应用一般只需一颗;姿态融合可与陀螺、加速度计同总线,只要地址不重复。
查看 MEMSIC 官方资料 ↗

核心初始化与采样

摘自本项目串口版 main.cpp(SDA=GPIO21 / SCL=GPIO22,地址 0x30),完整源码可在下载区获取。

main.cpp — MMC5603 初始化与采样
Adafruit_MMC5603 mmc = Adafruit_MMC5603(12345);

void setup(void) {
  Serial.begin(115200);
  Wire.begin();                       // 普通 ESP32: SDA=21, SCL=22
  if (!mmc.begin(MMC56X3_DEFAULT_ADDRESS, &Wire)) {
    Serial.println("未检测到 MMC5603, 检查接线");
    while (1) delay(10);
  }
  mmc.setDataRate(100);               // 100Hz 输出
  mmc.setContinuousMode(false);
}

void loop(void) {
  sensors_event_t mag_event;
  mmc.getEvent(&mag_event);           // 单位 µT
  float temp = mmc.readTemperature(); // 单位 °C

  Serial.print("X: "); Serial.print(mag_event.magnetic.x, 2); Serial.print(" uT");
  Serial.print("  Y: "); Serial.print(mag_event.magnetic.y, 2); Serial.print(" uT");
  Serial.print("  Z: "); Serial.print(mag_event.magnetic.z, 2); Serial.print(" uT");
  Serial.print("  T: "); Serial.println(temp, 1);
  delay(200);
}

源码与动画放在一起

下载的是副本,项目中的原始程序、图片和动画均保持原位。