芯片参数取自 MEMSIC《MMC5603NJ Rev.B》数据手册(18 页),模块参数取自 DFRobot SKU:0805 商品页与本项目实测程序。
VCC/GND 给模块供电,SDA/SCL 走 I²C。模块没有地址跳线,接线之外不需要任何额外配置。
| MMC5603 VCC | ESP32 3V3 |
| MMC5603 GND | ESP32 GND |
| MMC5603 SDA | GPIO 21 |
| MMC5603 SCL | GPIO 22 |
Wire.begin() 的两个参数。
| MMC5603 VCC | CYD 3V3 |
| MMC5603 GND | CYD GND |
| MMC5603 SDA | IO 27 |
| MMC5603 SCL | IO 22 |
接线以本图与项目 FZZ 为准,人工确认后不再自动重布线。
红色 STEMMA QT / Qwiic 座可直插 4 针线,插反不会烧,但读不到数据。
四段视频分别对应接线顺序、模块认识、芯片原理和源码逐行讲解,全部由本项目素材生成。
VCC、GND、SDA、SCL 四根线的走向,以及 Qwiic 座与排针两种接法。
板上器件、引脚定义与典型使用场景。
磁场如何变成寄存器里的数字量,以及 SET/RESET 复位的作用。
begin / setDataRate / getEvent / readTemperature 的实际执行顺序。
磁力计不需要外接负载:桌面环境本身就有约 50 µT 的地磁场,这就是最方便的“标准信号源”。
VCC 3.3V、GND、SDA、SCL 四根线;CYD 屏的 SDA 必须走 IO27。
I²C 扫描只应看到 0x30;扫不到先查供电与 SDA/SCL 是否反接。
数据率设 100 Hz,有效样本少于 3 个直接判失败。
磁铁靠近时对应轴明显变化,移开后回到原值,说明三轴都活着。
| 判定项 | 通过条件 | 取值来源 |
|---|---|---|
| 芯片通信 | 0x30 应答成功 | mmc.begin() |
| 有效样本 | 10 次中至少 3 次 | getEvent() |
| 三轴量值 | 各轴平均 < 3000 µT 且至少一轴非零 | X / Y / Z 均值 |
| 芯片温度 | -40 °C ~ 125 °C | readTemperature() |
| 地磁区间 | 合磁场 15 ~ 80 µT | √(X²+Y²+Z²) |
库直接输出 µ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
同一块模块,两种输出:串口版逐行打印原始数据,工装版在 2.8 寸屏上直接给 PASS / FAIL 与累计数量。
串口 115200 逐行打印,每 200 ms 一组。
三轴均值的矢量长度,用来判断是否在环境地磁区间。
atan2(Y, X) 折算到 0 ~ 360°,模块水平旋转时连续变化。
片内温度传感器读数,兼作上电自检的第二个证据。
工装每 500 ms 扫描一次总线:插上模块自动开始测试,拔掉回到等待页,可循环使用。
屏幕显示四项判定明细与累计测试数、通过数,产线上一眼可判断好坏。
mmc.setDataRate(100):演示与产线测试足够,最高可到 1 kHz 频率响应。
Wire.setClock(400000):I²C 走快速模式,杜邦线较长时可回退到 100 kHz 再试。
MMC5603 只有一个 I²C 地址,也没有可配置的引脚,所以问题几乎都出在接线与外部环境上。
先量 VCC 是否 3.3 ~ 5V,再确认 SDA/SCL 没反接;CYD 屏必须用 IO27,普通 ESP32 用 GPIO21。
多为 getEvent() 未取到有效样本。检查是否设置了数据率、总线是否被其他设备拉低。
附近有磁铁、电机、电源适配器或铁质桌面;把模块拿离桌面重新读取,能回稳就不是模块问题。
正常现象。地磁场有倾角,模块平放时垂直分量本来就最大,换个方向读数会重新分配。
三者都是 I²C 三轴磁力计,但地址、寄存器和换算系数都不同:MMC5603 固定 0x30,HMC5883L 常见 0x1E,QMC5883L 常见 0x10。
MMC5603 没有可选地址引脚,同一条 I²C 总线上挂两颗会直接冲突。需要多点测量时,用 I²C 多路复用器(如 TCA9548A)给每颗独立通道。
摘自本项目串口版 main.cpp(SDA=GPIO21 / SCL=GPIO22,地址 0x30),完整源码可在下载区获取。
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);
}
下载的是副本,项目中的原始程序、图片和动画均保持原位。