MPU6050:结构、参数与寄存器基础
对应课程:MPU6050 简介
课堂录音:
2026-09-13 10_33 记录MPU6050介绍_原文.docx芯片/模块:MPU6050、常见 GY-521 类模块
前置笔记:23_I2C通信协议与基本时序.md
整理日期:2026-09-13
本节边界:认识芯片、硬件和关键寄存器,建立后续软件/硬件 I²C 驱动所需的完整思路;并补充用户现有 GY-30(BH1750)作为实际 I²C 练习模块
1. 老师的整条思路
上一节已经具备"通过 I²C 指定地址读写从机寄存器"的能力。本节把抽象的"外挂芯片"具体化为 MPU6050:先了解它测量什么,再理解原始数据的含义和局限,接着分析模块引脚与芯片框图,最后从寄存器手册中挑出后续代码真正需要的寄存器。
#mermaid-svg-l2sNkvUyZksVWFWQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-l2sNkvUyZksVWFWQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-l2sNkvUyZksVWFWQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-l2sNkvUyZksVWFWQ .error-icon{fill:#552222;}#mermaid-svg-l2sNkvUyZksVWFWQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-l2sNkvUyZksVWFWQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-l2sNkvUyZksVWFWQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-l2sNkvUyZksVWFWQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-l2sNkvUyZksVWFWQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-l2sNkvUyZksVWFWQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-l2sNkvUyZksVWFWQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-l2sNkvUyZksVWFWQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-l2sNkvUyZksVWFWQ .marker.cross{stroke:#333333;}#mermaid-svg-l2sNkvUyZksVWFWQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-l2sNkvUyZksVWFWQ p{margin:0;}#mermaid-svg-l2sNkvUyZksVWFWQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-l2sNkvUyZksVWFWQ .cluster-label text{fill:#333;}#mermaid-svg-l2sNkvUyZksVWFWQ .cluster-label span{color:#333;}#mermaid-svg-l2sNkvUyZksVWFWQ .cluster-label span p{background-color:transparent;}#mermaid-svg-l2sNkvUyZksVWFWQ .label text,#mermaid-svg-l2sNkvUyZksVWFWQ span{fill:#333;color:#333;}#mermaid-svg-l2sNkvUyZksVWFWQ .node rect,#mermaid-svg-l2sNkvUyZksVWFWQ .node circle,#mermaid-svg-l2sNkvUyZksVWFWQ .node ellipse,#mermaid-svg-l2sNkvUyZksVWFWQ .node polygon,#mermaid-svg-l2sNkvUyZksVWFWQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-l2sNkvUyZksVWFWQ .rough-node .label text,#mermaid-svg-l2sNkvUyZksVWFWQ .node .label text,#mermaid-svg-l2sNkvUyZksVWFWQ .image-shape .label,#mermaid-svg-l2sNkvUyZksVWFWQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-l2sNkvUyZksVWFWQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-l2sNkvUyZksVWFWQ .rough-node .label,#mermaid-svg-l2sNkvUyZksVWFWQ .node .label,#mermaid-svg-l2sNkvUyZksVWFWQ .image-shape .label,#mermaid-svg-l2sNkvUyZksVWFWQ .icon-shape .label{text-align:center;}#mermaid-svg-l2sNkvUyZksVWFWQ .node.clickable{cursor:pointer;}#mermaid-svg-l2sNkvUyZksVWFWQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-l2sNkvUyZksVWFWQ .arrowheadPath{fill:#333333;}#mermaid-svg-l2sNkvUyZksVWFWQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-l2sNkvUyZksVWFWQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-l2sNkvUyZksVWFWQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-l2sNkvUyZksVWFWQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-l2sNkvUyZksVWFWQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-l2sNkvUyZksVWFWQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-l2sNkvUyZksVWFWQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-l2sNkvUyZksVWFWQ .cluster text{fill:#333;}#mermaid-svg-l2sNkvUyZksVWFWQ .cluster span{color:#333;}#mermaid-svg-l2sNkvUyZksVWFWQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-l2sNkvUyZksVWFWQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-l2sNkvUyZksVWFWQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-l2sNkvUyZksVWFWQ .icon-shape,#mermaid-svg-l2sNkvUyZksVWFWQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-l2sNkvUyZksVWFWQ .icon-shape p,#mermaid-svg-l2sNkvUyZksVWFWQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-l2sNkvUyZksVWFWQ .icon-shape .label rect,#mermaid-svg-l2sNkvUyZksVWFWQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-l2sNkvUyZksVWFWQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-l2sNkvUyZksVWFWQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-l2sNkvUyZksVWFWQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 明确目标:读写MPU6050寄存器
认识加速度计和陀螺仪
理解姿态角与数据融合
学习16位原始值、量程和灵敏度
确认I2C地址及模块引脚
分析芯片内部信号链
查寄存器总表
解除睡眠并配置采样、滤波、量程
读取高低字节并换算物理量
2. 为什么要先看两本 MPU6050 手册
模块资料中有两份用途不同的官方文档:
| 文档 | 文件 | 主要解决的问题 |
|---|---|---|
| 产品规格书 | PS-MPU-6000A.pdf |
芯片能做什么、量程与灵敏度、电气条件、引脚、框图、接口时序 |
| 寄存器映射与描述 | RM-MPU-6000A.pdf |
每个寄存器地址、位含义、复位值以及如何配置 |
学习新器件时可以记住:
- 想知道"它是什么、参数如何、硬件怎样接",先看产品规格书;
- 想知道"代码应向哪里写什么值",查寄存器手册;
- 模块原理图决定你手上这块板子的稳压、上拉和引脚默认电平,不能只看裸芯片规格。
3. MPU6050 到底是什么

图 1 老师 PPT 第 136 页:三轴加速度计、三轴陀螺仪和坐标方向。
MPU6050 集成:
- 三轴加速度计:测量 X、Y、Z 三个方向的线加速度;
- 三轴陀螺仪:测量绕 X、Y、Z 三轴的角速度;
- 温度传感器;
- 6 组 16 位 ADC;
- 数字低通滤波器、采样分频器、FIFO、中断与 DMP;
- 主 I²C 从机接口和辅助 I²C 主机接口。
所以"六轴"不是空间存在六根轴,而是 3 个加速度测量通道 + 3 个角速度测量通道。
| 常见称呼 | 传感器组成 |
|---|---|
| 6 轴 | 3 轴加速度 + 3 轴角速度 |
| 9 轴 | 6 轴 + 3 轴磁场 |
| 10 轴 | 9 轴 + 气压/高度信息 |
官方产品规格书第 7 页确认了三轴 MEMS 陀螺仪、三轴 MEMS 加速度计、DMP、辅助 I²C、FIFO 和温度传感器等结构。
4. 加速度计测到的是什么
4.1 静止时为什么也不是三个轴都为零
加速度计测量的是比力。模块静止放在桌面上时,通常会在某一轴看到约 ±1 g,另外两个轴接近 0。方向正负取决于芯片坐标系和安装朝向。
1 g ≈ 9.80665 m/s²,课堂近似使用 9.8 m/s²。
#mermaid-svg-H7q51qjQVkKOLmAj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-H7q51qjQVkKOLmAj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-H7q51qjQVkKOLmAj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-H7q51qjQVkKOLmAj .error-icon{fill:#552222;}#mermaid-svg-H7q51qjQVkKOLmAj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-H7q51qjQVkKOLmAj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-H7q51qjQVkKOLmAj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-H7q51qjQVkKOLmAj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-H7q51qjQVkKOLmAj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-H7q51qjQVkKOLmAj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-H7q51qjQVkKOLmAj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-H7q51qjQVkKOLmAj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-H7q51qjQVkKOLmAj .marker.cross{stroke:#333333;}#mermaid-svg-H7q51qjQVkKOLmAj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-H7q51qjQVkKOLmAj p{margin:0;}#mermaid-svg-H7q51qjQVkKOLmAj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-H7q51qjQVkKOLmAj .cluster-label text{fill:#333;}#mermaid-svg-H7q51qjQVkKOLmAj .cluster-label span{color:#333;}#mermaid-svg-H7q51qjQVkKOLmAj .cluster-label span p{background-color:transparent;}#mermaid-svg-H7q51qjQVkKOLmAj .label text,#mermaid-svg-H7q51qjQVkKOLmAj span{fill:#333;color:#333;}#mermaid-svg-H7q51qjQVkKOLmAj .node rect,#mermaid-svg-H7q51qjQVkKOLmAj .node circle,#mermaid-svg-H7q51qjQVkKOLmAj .node ellipse,#mermaid-svg-H7q51qjQVkKOLmAj .node polygon,#mermaid-svg-H7q51qjQVkKOLmAj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-H7q51qjQVkKOLmAj .rough-node .label text,#mermaid-svg-H7q51qjQVkKOLmAj .node .label text,#mermaid-svg-H7q51qjQVkKOLmAj .image-shape .label,#mermaid-svg-H7q51qjQVkKOLmAj .icon-shape .label{text-anchor:middle;}#mermaid-svg-H7q51qjQVkKOLmAj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-H7q51qjQVkKOLmAj .rough-node .label,#mermaid-svg-H7q51qjQVkKOLmAj .node .label,#mermaid-svg-H7q51qjQVkKOLmAj .image-shape .label,#mermaid-svg-H7q51qjQVkKOLmAj .icon-shape .label{text-align:center;}#mermaid-svg-H7q51qjQVkKOLmAj .node.clickable{cursor:pointer;}#mermaid-svg-H7q51qjQVkKOLmAj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-H7q51qjQVkKOLmAj .arrowheadPath{fill:#333333;}#mermaid-svg-H7q51qjQVkKOLmAj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-H7q51qjQVkKOLmAj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-H7q51qjQVkKOLmAj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-H7q51qjQVkKOLmAj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-H7q51qjQVkKOLmAj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-H7q51qjQVkKOLmAj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-H7q51qjQVkKOLmAj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-H7q51qjQVkKOLmAj .cluster text{fill:#333;}#mermaid-svg-H7q51qjQVkKOLmAj .cluster span{color:#333;}#mermaid-svg-H7q51qjQVkKOLmAj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-H7q51qjQVkKOLmAj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-H7q51qjQVkKOLmAj rect.text{fill:none;stroke-width:0;}#mermaid-svg-H7q51qjQVkKOLmAj .icon-shape,#mermaid-svg-H7q51qjQVkKOLmAj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-H7q51qjQVkKOLmAj .icon-shape p,#mermaid-svg-H7q51qjQVkKOLmAj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-H7q51qjQVkKOLmAj .icon-shape .label rect,#mermaid-svg-H7q51qjQVkKOLmAj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-H7q51qjQVkKOLmAj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-H7q51qjQVkKOLmAj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-H7q51qjQVkKOLmAj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 外界运动和重力作用
MEMS质量块产生位移
电容等电学量改变
模拟信号调理
16位ADC量化
ACCEL_X/Y/Z寄存器
4.2 为什么加速度计适合修正静态倾角
物体静止或缓慢运动时,测得的加速度主要来自重力,可以由重力在三个轴上的投影估算倾斜方向。因此加速度计具有长期参考,不会像积分那样无限漂移。
但车辆突然加速、机体振动时,测量值还包含运动加速度。仅靠加速度计会把"向前加速"误认为"姿态倾斜",所以它静态较稳定、动态易受干扰。
5. 陀螺仪测到的是什么
陀螺仪输出绕各轴旋转的角速度,单位通常为 °/s。若已知采样间隔 Δt,可以积分得到角度变化:
text
角度变化 ≈ 角速度 × Δt
angle[k] = angle[k-1] + gyro[k] × Δt
陀螺仪短时间内能很好地反映快速旋转,不会把直线运动加速度误判为倾角。但即使静止,零偏和噪声也不可能严格为零;很小的误差经过持续积分会积累成明显角度漂移,所以它动态响应好、长期会漂移。
6. 为什么需要数据融合
| 传感器 | 优势 | 局限 |
|---|---|---|
| 加速度计 | 可提供长期稳定的重力方向参考 | 运动加速度和振动会污染倾角 |
| 陀螺仪 | 快速运动时连续、响应快 | 零偏积分后产生长期漂移 |
| 磁力计 | 可提供航向长期参考 | 易受电机、磁铁和硬铁/软铁干扰 |
#mermaid-svg-1MarsEnt5VhFZueG{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1MarsEnt5VhFZueG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1MarsEnt5VhFZueG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1MarsEnt5VhFZueG .error-icon{fill:#552222;}#mermaid-svg-1MarsEnt5VhFZueG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1MarsEnt5VhFZueG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1MarsEnt5VhFZueG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1MarsEnt5VhFZueG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1MarsEnt5VhFZueG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1MarsEnt5VhFZueG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1MarsEnt5VhFZueG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1MarsEnt5VhFZueG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1MarsEnt5VhFZueG .marker.cross{stroke:#333333;}#mermaid-svg-1MarsEnt5VhFZueG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1MarsEnt5VhFZueG p{margin:0;}#mermaid-svg-1MarsEnt5VhFZueG .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1MarsEnt5VhFZueG .cluster-label text{fill:#333;}#mermaid-svg-1MarsEnt5VhFZueG .cluster-label span{color:#333;}#mermaid-svg-1MarsEnt5VhFZueG .cluster-label span p{background-color:transparent;}#mermaid-svg-1MarsEnt5VhFZueG .label text,#mermaid-svg-1MarsEnt5VhFZueG span{fill:#333;color:#333;}#mermaid-svg-1MarsEnt5VhFZueG .node rect,#mermaid-svg-1MarsEnt5VhFZueG .node circle,#mermaid-svg-1MarsEnt5VhFZueG .node ellipse,#mermaid-svg-1MarsEnt5VhFZueG .node polygon,#mermaid-svg-1MarsEnt5VhFZueG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1MarsEnt5VhFZueG .rough-node .label text,#mermaid-svg-1MarsEnt5VhFZueG .node .label text,#mermaid-svg-1MarsEnt5VhFZueG .image-shape .label,#mermaid-svg-1MarsEnt5VhFZueG .icon-shape .label{text-anchor:middle;}#mermaid-svg-1MarsEnt5VhFZueG .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1MarsEnt5VhFZueG .rough-node .label,#mermaid-svg-1MarsEnt5VhFZueG .node .label,#mermaid-svg-1MarsEnt5VhFZueG .image-shape .label,#mermaid-svg-1MarsEnt5VhFZueG .icon-shape .label{text-align:center;}#mermaid-svg-1MarsEnt5VhFZueG .node.clickable{cursor:pointer;}#mermaid-svg-1MarsEnt5VhFZueG .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1MarsEnt5VhFZueG .arrowheadPath{fill:#333333;}#mermaid-svg-1MarsEnt5VhFZueG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1MarsEnt5VhFZueG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1MarsEnt5VhFZueG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1MarsEnt5VhFZueG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1MarsEnt5VhFZueG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1MarsEnt5VhFZueG .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1MarsEnt5VhFZueG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1MarsEnt5VhFZueG .cluster text{fill:#333;}#mermaid-svg-1MarsEnt5VhFZueG .cluster span{color:#333;}#mermaid-svg-1MarsEnt5VhFZueG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1MarsEnt5VhFZueG .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1MarsEnt5VhFZueG rect.text{fill:none;stroke-width:0;}#mermaid-svg-1MarsEnt5VhFZueG .icon-shape,#mermaid-svg-1MarsEnt5VhFZueG .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1MarsEnt5VhFZueG .icon-shape p,#mermaid-svg-1MarsEnt5VhFZueG .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1MarsEnt5VhFZueG .icon-shape .label rect,#mermaid-svg-1MarsEnt5VhFZueG .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1MarsEnt5VhFZueG .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1MarsEnt5VhFZueG .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1MarsEnt5VhFZueG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 陀螺仪短期角度变化
互补滤波或卡尔曼滤波
加速度计长期重力参考
可选磁力计航向参考
更稳定的Roll/Pitch/Yaw
课程本节只显示原始六轴数据,不做姿态解算。Roll(横滚)、Pitch(俯仰)、Yaw(偏航)的定义和正方向还会受到坐标系约定影响,后续做算法前必须统一传感器坐标、机体坐标和旋转正方向。
7. 16 位原始值、量程与灵敏度

图 2 老师 PPT 第 137 页:16 位 ADC、可选量程、滤波、采样分频和 I²C 地址。
7.1 原始数据为什么是 -32768~32767
每个轴输出 16 位二进制补码有符号数:
text
-2^15 ~ 2^15-1 = -32768 ~ 32767
正负表示沿该轴的两个方向。每个 16 位结果分为高、低两个 8 位寄存器存放。
7.2 加速度计量程与灵敏度
依据产品规格书第 13 页:
AFS_SEL |
满量程 | 灵敏度 |
|---|---|---|
| 0 | ±2 g | 16384 LSB/g |
| 1 | ±4 g | 8192 LSB/g |
| 2 | ±8 g | 4096 LSB/g |
| 3 | ±16 g | 2048 LSB/g |
换算公式:
text
加速度(g) = 原始值 / 对应灵敏度(LSB/g)
加速度(m/s²) = 加速度(g) × 9.80665
例如选择 ±2 g,读取原始值 8192:
text
8192 / 16384 = 0.5 g
0.5 × 9.80665 ≈ 4.90 m/s²
7.3 陀螺仪量程与灵敏度
依据产品规格书第 12 页:
FS_SEL |
满量程 | 灵敏度 |
|---|---|---|
| 0 | ±250 °/s | 131 LSB/(°/s) |
| 1 | ±500 °/s | 65.5 LSB/(°/s) |
| 2 | ±1000 °/s | 32.8 LSB/(°/s) |
| 3 | ±2000 °/s | 16.4 LSB/(°/s) |
换算公式:
text
角速度(°/s) = 原始值 / 对应灵敏度
例如选择 ±250 °/s,读取 1310:
text
1310 / 131 = 10 °/s
7.4 量程怎样选
- 量程越小:相同 16 位码数覆盖更窄范围,每个 LSB 代表的物理量更小,分辨率更高;
- 量程越大:能测更剧烈的运动,但分辨率降低;
- 量程太小会削顶饱和,量程太大则浪费有效分辨率。
工程上先估计最大运动,再留一定余量;若经常读到接近 ±32767,通常说明量程不够。
8. 数字低通滤波和采样率
8.1 数字低通滤波器 DLPF
CONFIG(0x1A)中的 DLPF_CFG[2:0] 设置加速度计和陀螺仪的低通滤波。滤波带宽越低,输出越平滑,但响应延迟越大。寄存器手册第 11 页列出了不同档位的带宽与延迟。
因此不能只追求"不抖":控制系统需要在噪声与相位延迟之间折中。
8.2 采样分频器
SMPLRT_DIV(0x19)决定输出采样率,官方寄存器手册第 10 页给出:
text
Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV)
- DLPF 启用时,陀螺仪输出率通常为 1 kHz;
- DLPF 关闭且
DLPF_CFG=0/7时,陀螺仪输出率为 8 kHz; - 加速度计输出率为 1 kHz,因此请求高于 1 kHz 时可能重复同一加速度样本。
例:DLPF 启用、SMPLRT_DIV=9:
text
1000 / (1 + 9) = 100 Hz
9. I²C 地址:0x68、0x69、0xD0、0xD1
MPU6050 的 7 位地址高 6 位固定为 110100,最低位由 AD0 决定:
| AD0 | 7 位地址 | 写地址字节 | 读地址字节 |
|---|---|---|---|
| 0 | 0x68 |
0xD0 |
0xD1 |
| 1 | 0x69 |
0xD2 |
0xD3 |
text
地址字节 = (7位地址 << 1) | R/W
所以"MPU6050 地址为 0xD0"是一种把读写位位置也包含进去的旧式说法;更清晰的表达是:7 位地址为 0x68,写地址字节为 0xD0,读地址字节为 0xD1。
10. 模块硬件与引脚

图 3 老师 PPT 第 138 页:模块原理图和引脚功能。
10.1 引脚功能
| 模块引脚 | 用途 | 本节基础实验是否必需 |
|---|---|---|
| VCC、GND | 模块供电 | 必需 |
| SCL、SDA | STM32 访问 MPU6050 的主 I²C 接口 | 必需 |
| XCL、XDA | MPU6050 作为 I²C 主机连接磁力计等辅助传感器 | 不必需 |
| AD0 | 选择 I²C 地址最低位 | 按默认地址时不需额外连接 |
| INT | 数据就绪、运动、FIFO 等事件的中断输出 | 轮询读取时可不接 |
10.2 模块原理图核对

图 4 模块资料 MPU6050-V1-SCH.jpg:稳压、上拉、AD0 下拉和外围电容。
从这张具体模块原理图可以确认:
- VCC 输入经过板载 3.3 V LDO 给芯片供电;
- SCL、SDA 各有一个约 4.7 kΩ 电阻上拉到 3.3 V;
- AD0 通过 4.7 kΩ 默认下拉,所以默认 7 位地址为
0x68; - 板上有电源指示 LED;
- CPOUT、REGOUT 等外围电容按芯片要求连接。
裸 MPU6050 的 VDD 规格是 2.375~3.46 V,不能把"某模块 VCC 可接 5 V"推广成"裸芯片能直接接 5 V"。本模块的宽输入范围来自板载稳压器,而且 I²C 线仍被上拉到 3.3 V。
11. XCL/XDA、INT 和扩展传感器
MPU6050 自身是 STM32 主 I²C 总线上的从机,但它内部还带一个辅助 I²C 主机,可通过 XCL/XDA 读取磁力计、气压计等外部传感器。
#mermaid-svg-qVvzPJSLfuVSTvyr{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qVvzPJSLfuVSTvyr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qVvzPJSLfuVSTvyr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qVvzPJSLfuVSTvyr .error-icon{fill:#552222;}#mermaid-svg-qVvzPJSLfuVSTvyr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qVvzPJSLfuVSTvyr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qVvzPJSLfuVSTvyr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qVvzPJSLfuVSTvyr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qVvzPJSLfuVSTvyr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qVvzPJSLfuVSTvyr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qVvzPJSLfuVSTvyr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qVvzPJSLfuVSTvyr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qVvzPJSLfuVSTvyr .marker.cross{stroke:#333333;}#mermaid-svg-qVvzPJSLfuVSTvyr svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qVvzPJSLfuVSTvyr p{margin:0;}#mermaid-svg-qVvzPJSLfuVSTvyr .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qVvzPJSLfuVSTvyr .cluster-label text{fill:#333;}#mermaid-svg-qVvzPJSLfuVSTvyr .cluster-label span{color:#333;}#mermaid-svg-qVvzPJSLfuVSTvyr .cluster-label span p{background-color:transparent;}#mermaid-svg-qVvzPJSLfuVSTvyr .label text,#mermaid-svg-qVvzPJSLfuVSTvyr span{fill:#333;color:#333;}#mermaid-svg-qVvzPJSLfuVSTvyr .node rect,#mermaid-svg-qVvzPJSLfuVSTvyr .node circle,#mermaid-svg-qVvzPJSLfuVSTvyr .node ellipse,#mermaid-svg-qVvzPJSLfuVSTvyr .node polygon,#mermaid-svg-qVvzPJSLfuVSTvyr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qVvzPJSLfuVSTvyr .rough-node .label text,#mermaid-svg-qVvzPJSLfuVSTvyr .node .label text,#mermaid-svg-qVvzPJSLfuVSTvyr .image-shape .label,#mermaid-svg-qVvzPJSLfuVSTvyr .icon-shape .label{text-anchor:middle;}#mermaid-svg-qVvzPJSLfuVSTvyr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qVvzPJSLfuVSTvyr .rough-node .label,#mermaid-svg-qVvzPJSLfuVSTvyr .node .label,#mermaid-svg-qVvzPJSLfuVSTvyr .image-shape .label,#mermaid-svg-qVvzPJSLfuVSTvyr .icon-shape .label{text-align:center;}#mermaid-svg-qVvzPJSLfuVSTvyr .node.clickable{cursor:pointer;}#mermaid-svg-qVvzPJSLfuVSTvyr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qVvzPJSLfuVSTvyr .arrowheadPath{fill:#333333;}#mermaid-svg-qVvzPJSLfuVSTvyr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qVvzPJSLfuVSTvyr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qVvzPJSLfuVSTvyr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qVvzPJSLfuVSTvyr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qVvzPJSLfuVSTvyr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qVvzPJSLfuVSTvyr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qVvzPJSLfuVSTvyr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qVvzPJSLfuVSTvyr .cluster text{fill:#333;}#mermaid-svg-qVvzPJSLfuVSTvyr .cluster span{color:#333;}#mermaid-svg-qVvzPJSLfuVSTvyr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qVvzPJSLfuVSTvyr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qVvzPJSLfuVSTvyr rect.text{fill:none;stroke-width:0;}#mermaid-svg-qVvzPJSLfuVSTvyr .icon-shape,#mermaid-svg-qVvzPJSLfuVSTvyr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qVvzPJSLfuVSTvyr .icon-shape p,#mermaid-svg-qVvzPJSLfuVSTvyr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qVvzPJSLfuVSTvyr .icon-shape .label rect,#mermaid-svg-qVvzPJSLfuVSTvyr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qVvzPJSLfuVSTvyr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qVvzPJSLfuVSTvyr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qVvzPJSLfuVSTvyr :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SCL/SDA
XCL/XDA辅助I2C
XCL/XDA辅助I2C
STM32主机
MPU6050从机
磁力计
气压计
DMP/FIFO/外部传感器寄存器
也可以通过旁路模式,让 STM32 直接访问辅助总线器件。选择"MPU6050 代读"还是"STM32 直接读",取决于是否使用 DMP、FIFO、同步采样和现有驱动架构。
INT 引脚可输出数据就绪、FIFO 溢出、自由落体、运动/零运动、辅助 I²C 错误等事件。产品规格书第 31~32 页和寄存器手册第 29~30 页给出了相关说明。本节只用轮询读取时可以暂不连接。
12. 芯片内部框图怎样理解

图 5 老师 PPT 第 139 页:传感器、ADC、信号调理、寄存器、FIFO、DMP 和通信接口。
从左向右沿信号链看:
#mermaid-svg-wzGkGNJd1zqsqkz7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wzGkGNJd1zqsqkz7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wzGkGNJd1zqsqkz7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wzGkGNJd1zqsqkz7 .error-icon{fill:#552222;}#mermaid-svg-wzGkGNJd1zqsqkz7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wzGkGNJd1zqsqkz7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wzGkGNJd1zqsqkz7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wzGkGNJd1zqsqkz7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wzGkGNJd1zqsqkz7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wzGkGNJd1zqsqkz7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wzGkGNJd1zqsqkz7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wzGkGNJd1zqsqkz7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wzGkGNJd1zqsqkz7 .marker.cross{stroke:#333333;}#mermaid-svg-wzGkGNJd1zqsqkz7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wzGkGNJd1zqsqkz7 p{margin:0;}#mermaid-svg-wzGkGNJd1zqsqkz7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wzGkGNJd1zqsqkz7 .cluster-label text{fill:#333;}#mermaid-svg-wzGkGNJd1zqsqkz7 .cluster-label span{color:#333;}#mermaid-svg-wzGkGNJd1zqsqkz7 .cluster-label span p{background-color:transparent;}#mermaid-svg-wzGkGNJd1zqsqkz7 .label text,#mermaid-svg-wzGkGNJd1zqsqkz7 span{fill:#333;color:#333;}#mermaid-svg-wzGkGNJd1zqsqkz7 .node rect,#mermaid-svg-wzGkGNJd1zqsqkz7 .node circle,#mermaid-svg-wzGkGNJd1zqsqkz7 .node ellipse,#mermaid-svg-wzGkGNJd1zqsqkz7 .node polygon,#mermaid-svg-wzGkGNJd1zqsqkz7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wzGkGNJd1zqsqkz7 .rough-node .label text,#mermaid-svg-wzGkGNJd1zqsqkz7 .node .label text,#mermaid-svg-wzGkGNJd1zqsqkz7 .image-shape .label,#mermaid-svg-wzGkGNJd1zqsqkz7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-wzGkGNJd1zqsqkz7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wzGkGNJd1zqsqkz7 .rough-node .label,#mermaid-svg-wzGkGNJd1zqsqkz7 .node .label,#mermaid-svg-wzGkGNJd1zqsqkz7 .image-shape .label,#mermaid-svg-wzGkGNJd1zqsqkz7 .icon-shape .label{text-align:center;}#mermaid-svg-wzGkGNJd1zqsqkz7 .node.clickable{cursor:pointer;}#mermaid-svg-wzGkGNJd1zqsqkz7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wzGkGNJd1zqsqkz7 .arrowheadPath{fill:#333333;}#mermaid-svg-wzGkGNJd1zqsqkz7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wzGkGNJd1zqsqkz7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wzGkGNJd1zqsqkz7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wzGkGNJd1zqsqkz7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wzGkGNJd1zqsqkz7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wzGkGNJd1zqsqkz7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wzGkGNJd1zqsqkz7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wzGkGNJd1zqsqkz7 .cluster text{fill:#333;}#mermaid-svg-wzGkGNJd1zqsqkz7 .cluster span{color:#333;}#mermaid-svg-wzGkGNJd1zqsqkz7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wzGkGNJd1zqsqkz7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wzGkGNJd1zqsqkz7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-wzGkGNJd1zqsqkz7 .icon-shape,#mermaid-svg-wzGkGNJd1zqsqkz7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wzGkGNJd1zqsqkz7 .icon-shape p,#mermaid-svg-wzGkGNJd1zqsqkz7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wzGkGNJd1zqsqkz7 .icon-shape .label rect,#mermaid-svg-wzGkGNJd1zqsqkz7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wzGkGNJd1zqsqkz7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wzGkGNJd1zqsqkz7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wzGkGNJd1zqsqkz7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 三轴加速度计和三轴陀螺仪
模拟信号与自测激励
六路16位ADC
数字信号调理与滤波
传感器数据寄存器
I2C接口供STM32读取
FIFO
DMP姿态处理
关键认识:传感器采样和寄存器刷新由芯片内部自动进行。STM32 配置好芯片后,不需要自己触发每一次 ADC 转换,只需在合适的时刻读取最新数据,或使用 Data Ready/FIFO 管理采样。
框图中的其他模块
- Self Test:内部施加测试激励,比较开启和关闭自测时的输出差;
- Factory Calibration:芯片出厂校准信息,普通使用不需直接修改;
- FIFO:1024 字节缓存,可积攒数据后突发读取,降低主机唤醒频率;
- DMP:数字运动处理器,可配合固件完成部分运动处理;
- Charge Pump:为 MEMS 电路产生内部所需电压,外部只按手册接电容;
- Clock:可选内部振荡器、陀螺仪 PLL 参考或外部时钟。
13. 后续代码最需要掌握的寄存器
| 地址 | 寄存器 | 作用 | 手册页码 |
|---|---|---|---|
0x19 |
SMPLRT_DIV |
采样率分频 | 寄存器手册第 10 页 |
0x1A |
CONFIG |
DLPF 与外部同步配置 | 第 11 页 |
0x1B |
GYRO_CONFIG |
陀螺仪自测和量程 FS_SEL |
第 12 页 |
0x1C |
ACCEL_CONFIG |
加速度计自测和量程 AFS_SEL |
第 13~14 页 |
0x38 |
INT_ENABLE |
数据就绪等中断使能 | 第 29 页 |
0x3B~0x40 |
ACCEL_*OUT_H/L |
三轴加速度原始值 | 第 31 页 |
0x41~0x42 |
TEMP_OUT_H/L |
温度原始值 | 第 32 页 |
0x43~0x48 |
GYRO_*OUT_H/L |
三轴角速度原始值 | 第 33 页 |
0x6B |
PWR_MGMT_1 |
复位、睡眠、时钟源 | 第 44~45 页 |
0x75 |
WHO_AM_I |
设备身份验证,复位值 0x68 |
第 49 页 |
寄存器总表位于寄存器手册第 5~8 页;师兄笔记 PDF 第 110~111 页也标出了课程使用的重点寄存器。
14. 为什么上电后第一件事是解除睡眠
寄存器手册说明所有寄存器复位值通常为 0x00,但:
PWR_MGMT_1(0x6B)复位值为0x40;0x40表示 bit6SLEEP=1;- 因此芯片上电默认处于睡眠状态;
- 使用传感器前必须清除 SLEEP,并按需要选择时钟源。
text
PWR_MGMT_1 = 0x40
^ bit6 SLEEP = 1
例如写 0x00 可以唤醒并使用内部 8 MHz 振荡器;正式应用常选择某个陀螺仪 PLL 参考作为更稳定的时钟源。具体设置应按后续驱动目标决定。
15. WHO_AM_I 与 I²C 地址不是同一个可变值
WHO_AM_I 位于 0x75,官方复位值为 0x68,用于验证器件身份。它保存的是地址中固定的高 6 位,bit0 和 bit7 固定为 0;AD0 的状态不会反映到该寄存器中。
因此:
- AD0=0 时,总线 7 位地址
0x68,WHO_AM_I=0x68; - AD0=1 时,总线 7 位地址
0x69,WHO_AM_I仍为0x68。
课堂提到个别芯片可能读出其他 ID。按官方手册,正常 MPU6050 应返回 0x68;若不同,应优先排查 I²C 时序、地址、接线、电源、兼容芯片或器件真伪,而不能直接认定"一定不影响使用"。
16. 高低字节怎样合成 16 位有符号数
每个轴占两个连续寄存器,高字节在前。例如 X 轴加速度:
text
0x3B ACCEL_XOUT_H = bits[15:8]
0x3C ACCEL_XOUT_L = bits[7:0]
安全的组合方式:
c
uint8_t high = ...;
uint8_t low = ...;
int16_t raw = (int16_t)(((uint16_t)high << 8) | low);
必须最终解释为 int16_t,否则负方向数据会被当作很大的正数。
负数示例
若高字节 0xFC、低字节 0x18:
text
组合位模式 = 0xFC18
按 int16_t 补码解释 = -1000
若加速度量程为 ±2 g:
text
-1000 / 16384 ≈ -0.0610 g
17. 温度值换算
产品规格书第 14 页给出温度传感器灵敏度 340 LSB/°C,以及对应偏移。常用换算为:
text
Temperature(°C) = TEMP_OUT / 340 + 36.53
它测量的是芯片内部温度,不能简单等同于环境空气温度;封装自热、板上热源和空气流动都会造成差异。
18. 一个清晰的基础使用流程
#mermaid-svg-vLGF9EzQk5iRmfuK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vLGF9EzQk5iRmfuK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vLGF9EzQk5iRmfuK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vLGF9EzQk5iRmfuK .error-icon{fill:#552222;}#mermaid-svg-vLGF9EzQk5iRmfuK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vLGF9EzQk5iRmfuK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vLGF9EzQk5iRmfuK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vLGF9EzQk5iRmfuK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vLGF9EzQk5iRmfuK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vLGF9EzQk5iRmfuK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vLGF9EzQk5iRmfuK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vLGF9EzQk5iRmfuK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vLGF9EzQk5iRmfuK .marker.cross{stroke:#333333;}#mermaid-svg-vLGF9EzQk5iRmfuK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vLGF9EzQk5iRmfuK p{margin:0;}#mermaid-svg-vLGF9EzQk5iRmfuK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vLGF9EzQk5iRmfuK .cluster-label text{fill:#333;}#mermaid-svg-vLGF9EzQk5iRmfuK .cluster-label span{color:#333;}#mermaid-svg-vLGF9EzQk5iRmfuK .cluster-label span p{background-color:transparent;}#mermaid-svg-vLGF9EzQk5iRmfuK .label text,#mermaid-svg-vLGF9EzQk5iRmfuK span{fill:#333;color:#333;}#mermaid-svg-vLGF9EzQk5iRmfuK .node rect,#mermaid-svg-vLGF9EzQk5iRmfuK .node circle,#mermaid-svg-vLGF9EzQk5iRmfuK .node ellipse,#mermaid-svg-vLGF9EzQk5iRmfuK .node polygon,#mermaid-svg-vLGF9EzQk5iRmfuK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vLGF9EzQk5iRmfuK .rough-node .label text,#mermaid-svg-vLGF9EzQk5iRmfuK .node .label text,#mermaid-svg-vLGF9EzQk5iRmfuK .image-shape .label,#mermaid-svg-vLGF9EzQk5iRmfuK .icon-shape .label{text-anchor:middle;}#mermaid-svg-vLGF9EzQk5iRmfuK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vLGF9EzQk5iRmfuK .rough-node .label,#mermaid-svg-vLGF9EzQk5iRmfuK .node .label,#mermaid-svg-vLGF9EzQk5iRmfuK .image-shape .label,#mermaid-svg-vLGF9EzQk5iRmfuK .icon-shape .label{text-align:center;}#mermaid-svg-vLGF9EzQk5iRmfuK .node.clickable{cursor:pointer;}#mermaid-svg-vLGF9EzQk5iRmfuK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vLGF9EzQk5iRmfuK .arrowheadPath{fill:#333333;}#mermaid-svg-vLGF9EzQk5iRmfuK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vLGF9EzQk5iRmfuK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vLGF9EzQk5iRmfuK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vLGF9EzQk5iRmfuK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vLGF9EzQk5iRmfuK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vLGF9EzQk5iRmfuK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vLGF9EzQk5iRmfuK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vLGF9EzQk5iRmfuK .cluster text{fill:#333;}#mermaid-svg-vLGF9EzQk5iRmfuK .cluster span{color:#333;}#mermaid-svg-vLGF9EzQk5iRmfuK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vLGF9EzQk5iRmfuK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vLGF9EzQk5iRmfuK rect.text{fill:none;stroke-width:0;}#mermaid-svg-vLGF9EzQk5iRmfuK .icon-shape,#mermaid-svg-vLGF9EzQk5iRmfuK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vLGF9EzQk5iRmfuK .icon-shape p,#mermaid-svg-vLGF9EzQk5iRmfuK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vLGF9EzQk5iRmfuK .icon-shape .label rect,#mermaid-svg-vLGF9EzQk5iRmfuK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vLGF9EzQk5iRmfuK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vLGF9EzQk5iRmfuK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vLGF9EzQk5iRmfuK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
查模块原理图并连接VCC/GND/SCL/SDA
初始化I2C主机
按0x68或0x69寻址
读取0x75 WHO_AM_I
是否为0x68?
排查地址、AD0、接线、供电和器件
写0x6B清除SLEEP并选择时钟
配置DLPF和采样率
配置加速度和陀螺仪量程
从0x3B开始突发读取14字节
高低字节合成7个int16_t
按灵敏度换算加速度、温度和角速度
显示、滤波或送入姿态融合算法
从 0x3B 连续读取 14 字节,可以一次获得:
text
Accel X/Y/Z 6字节
Temperature 2字节
Gyro X/Y/Z 6字节
总计 14字节
官方寄存器手册第 31~33 页说明,突发读取有助于保证一组传感器数据来自同一采样时刻;若分开进行多个单字节读取,则应结合 Data Ready 确保一致性。
19. 从"现象"反推哪里可能有问题
| 现象 | 优先检查 |
|---|---|
| I²C 无应答 | 供电、共地、SCL/SDA 是否接反、7 位地址、AD0、上拉电阻 |
WHO_AM_I 不是 0x68 |
读寄存器地址是否为 0x75、重复起始和读写位是否正确、器件兼容性 |
| 所有轴恒为 0 或不变化 | 是否清除 PWR_MGMT_1.SLEEP、是否读对寄存器 |
| 负方向显示为很大的正数 | 高低字节合成后没有转换为 int16_t |
| 数值比例不对 | 换算灵敏度与 FS_SEL/AFS_SEL 实际配置不一致 |
| 静止时 Z 轴约 1 g | 通常是正常重力投影,不是偏置错误 |
| 角度长期漂移 | 陀螺仪零偏积分的固有问题,需要标定和数据融合 |
| 数据抖动明显 | 检查机械振动、量程、采样率和 DLPF,不要只盲目平均 |
20. 容易混淆的地方与转写校正
| 录音或常见说法 | 正确理解 |
|---|---|
| "MP16050、MPO6050"等 | 均为 MPU6050 的转写错误 |
| "IPhone C、FNC"等 | 均指 I²C |
地址二进制 1001000 |
正确固定高位是 1101000(AD0=0) |
| "0x65 是地址" | 转写错误;1101000₂ = 0x68 |
| 16 位范围"到 6767"等 | 应为 -32768~32767 |
| 量程越小一定越好 | 量程小分辨率高,但运动超量程时会饱和 |
| 加速度计直接得到姿态角 | 只有静态/低动态时可近似,运动加速度会干扰 |
| 陀螺仪积分就能得到稳定角度 | 短期有效,长期会因零偏和噪声漂移 |
| 模块可接 5 V,所以芯片可接 5 V | 模块依赖板载 LDO;裸芯片 VDD 上限为 3.46 V |
| AD0=1 时 WHO_AM_I 变成 0x69 | 错误;WHO_AM_I 仍为 0x68 |
| 寄存器值可以一次读几个单字节拼起来 | 可以,但突发读取更容易保证同一采样时刻 |
21. 没有 MPU6050 时:用 GY-30 练习 I²C
你当前没有 MPU6050,但有 GY-30 光照度模块。常见 GY-30 的核心芯片是 ROHM 的 BH1750FVI,它是 16 位数字环境光传感器,通过 I²C 直接返回照度数据,单位为 lux(勒克斯)。
硬件确认:不同商家的 GY-30 板卡可能在稳压器、上拉电阻和引脚排列上有所差异。使用前应检查你手中模块的芯片丝印和 PCB 引脚标识;如果方便,后续可提供模块正反面照片再进一步核对。
21.1 GY-30 与 MPU6050 的共同点和区别
| 比较项 | MPU6050 | GY-30 / BH1750 |
|---|---|---|
| 测量对象 | 三轴加速度、三轴角速度、芯片温度 | 环境照度 |
| 总线 | I²C | I²C |
| 输出宽度 | 每个测量量为 16 位有符号数 | 16 位无符号照度原始值 |
| 访问模型 | 先指定内部寄存器地址,再读写寄存器 | 主要发送操作码,然后直接读取两字节测量结果 |
| 地址选择 | AD0:0x68/0x69 |
ADDR:0x23/0x5C |
| 数据换算 | 按量程灵敏度换算为 g、°/s | 默认高分辨率模式下约为 raw/1.2 lux |
| 适合练习 | 寄存器型 I²C 器件驱动 | 命令型 I²C 器件、延时测量和双字节读取 |
这正好能说明:I²C 只规定总线收发规则,不规定每种芯片都必须使用"寄存器地址 + 数据"的格式。 MPU6050 的第二个字节通常是寄存器地址,而 BH1750 接收到的字节通常是测量命令。
22. GY-30 / BH1750 的硬件信息
22.1 常见模块引脚
| 模块丝印 | 功能 | 连接 STM32 时的原则 |
|---|---|---|
| VCC | 模块电源 | 不确定板卡版本时优先接 3.3 V |
| GND | 地 | 与 STM32 共地 |
| SCL | I²C 时钟 | 接软件 I²C 时钟脚或硬件 I²C SCL |
| SDA | I²C 数据 | 接软件 I²C 数据脚或硬件 I²C SDA |
| ADDR / ADD | 地址选择 | 低电平通常为 0x23,高电平为 0x5C |
BH1750FVI 裸芯片的工作电源范围为 2.4~3.6 V,I²C 参考电压范围为 1.65 V~VCC。市售 GY-30 模块有些带稳压器并标称可接 5 V,但这属于模块电路能力,不是裸芯片能力;没有确认原理图前不要直接假定 VCC 和 I²C 引脚均可承受 5 V。
还要检查模块是否已经带有 SDA/SCL 上拉电阻。若 STM32 板和多个模块都带上拉,多个电阻会并联,使等效阻值变小、低电平灌电流增大。
22.2 I²C 地址
依据 BH1750FVI 手册第 10 页的地址定义:
| ADDR 电平 | 7 位地址 | 写地址字节 | 读地址字节 |
|---|---|---|---|
| 低 | 0x23 |
0x46 |
0x47 |
| 高 | 0x5C |
0xB8 |
0xB9 |
text
地址字节 = (7位地址 << 1) | R/W
和 MPU6050 一样,写驱动时要先确认底层 I²C 函数需要的是 7 位地址,还是已经左移并加入 R/W 位的地址字节。
23. BH1750 命令与测量模式
BH1750 上电后处于 Power Down。常用命令如下:
| 命令 | 操作码 | 作用 | 典型测量时间/分辨率 |
|---|---|---|---|
| Power Down | 0x00 |
进入低功耗状态 | --- |
| Power On | 0x01 |
上电等待测量命令 | --- |
| Reset | 0x07 |
清除照度数据寄存器;需先 Power On | --- |
| 连续高分辨率 | 0x10 |
持续更新测量值 | 约 120 ms,1 lx |
| 连续高分辨率模式 2 | 0x11 |
持续更新,分辨率加倍 | 约 120 ms,0.5 lx |
| 连续低分辨率 | 0x13 |
持续快速更新 | 约 16 ms,4 lx |
| 单次高分辨率 | 0x20 |
测量一次后自动 Power Down | 约 120 ms,1 lx |
| 单次高分辨率模式 2 | 0x21 |
测量一次后自动 Power Down | 约 120 ms,0.5 lx |
| 单次低分辨率 | 0x23 |
测量一次后自动 Power Down | 约 16 ms,4 lx |
官方推荐常规使用高分辨率模式;较长的积分时间也有利于抑制部分 50/60 Hz 光源波动。测量时间存在器件范围,代码不能只延时一个过短的典型值:官方示例对高分辨率第一次测量等待最长约 180 ms,低分辨率最长约 24 ms。
连续模式和单次模式怎样选
- 要周期性刷新 OLED、连续采集环境光:使用
0x10连续高分辨率模式; - 要低功耗且采样间隔较长:每次发送
0x20,等待转换,再读取两字节; - 要快速粗略判断亮暗:可使用
0x13或0x23,但分辨率较低。
24. GY-30 的完整基础流程
24.1 连续高分辨率模式
#mermaid-svg-Tl57iCWOTy3PKoKt{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Tl57iCWOTy3PKoKt .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Tl57iCWOTy3PKoKt .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Tl57iCWOTy3PKoKt .error-icon{fill:#552222;}#mermaid-svg-Tl57iCWOTy3PKoKt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Tl57iCWOTy3PKoKt .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Tl57iCWOTy3PKoKt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Tl57iCWOTy3PKoKt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Tl57iCWOTy3PKoKt .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Tl57iCWOTy3PKoKt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Tl57iCWOTy3PKoKt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Tl57iCWOTy3PKoKt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Tl57iCWOTy3PKoKt .marker.cross{stroke:#333333;}#mermaid-svg-Tl57iCWOTy3PKoKt svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Tl57iCWOTy3PKoKt p{margin:0;}#mermaid-svg-Tl57iCWOTy3PKoKt .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Tl57iCWOTy3PKoKt .cluster-label text{fill:#333;}#mermaid-svg-Tl57iCWOTy3PKoKt .cluster-label span{color:#333;}#mermaid-svg-Tl57iCWOTy3PKoKt .cluster-label span p{background-color:transparent;}#mermaid-svg-Tl57iCWOTy3PKoKt .label text,#mermaid-svg-Tl57iCWOTy3PKoKt span{fill:#333;color:#333;}#mermaid-svg-Tl57iCWOTy3PKoKt .node rect,#mermaid-svg-Tl57iCWOTy3PKoKt .node circle,#mermaid-svg-Tl57iCWOTy3PKoKt .node ellipse,#mermaid-svg-Tl57iCWOTy3PKoKt .node polygon,#mermaid-svg-Tl57iCWOTy3PKoKt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Tl57iCWOTy3PKoKt .rough-node .label text,#mermaid-svg-Tl57iCWOTy3PKoKt .node .label text,#mermaid-svg-Tl57iCWOTy3PKoKt .image-shape .label,#mermaid-svg-Tl57iCWOTy3PKoKt .icon-shape .label{text-anchor:middle;}#mermaid-svg-Tl57iCWOTy3PKoKt .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Tl57iCWOTy3PKoKt .rough-node .label,#mermaid-svg-Tl57iCWOTy3PKoKt .node .label,#mermaid-svg-Tl57iCWOTy3PKoKt .image-shape .label,#mermaid-svg-Tl57iCWOTy3PKoKt .icon-shape .label{text-align:center;}#mermaid-svg-Tl57iCWOTy3PKoKt .node.clickable{cursor:pointer;}#mermaid-svg-Tl57iCWOTy3PKoKt .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Tl57iCWOTy3PKoKt .arrowheadPath{fill:#333333;}#mermaid-svg-Tl57iCWOTy3PKoKt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Tl57iCWOTy3PKoKt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Tl57iCWOTy3PKoKt .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Tl57iCWOTy3PKoKt .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Tl57iCWOTy3PKoKt .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Tl57iCWOTy3PKoKt .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Tl57iCWOTy3PKoKt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Tl57iCWOTy3PKoKt .cluster text{fill:#333;}#mermaid-svg-Tl57iCWOTy3PKoKt .cluster span{color:#333;}#mermaid-svg-Tl57iCWOTy3PKoKt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Tl57iCWOTy3PKoKt .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Tl57iCWOTy3PKoKt rect.text{fill:none;stroke-width:0;}#mermaid-svg-Tl57iCWOTy3PKoKt .icon-shape,#mermaid-svg-Tl57iCWOTy3PKoKt .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Tl57iCWOTy3PKoKt .icon-shape p,#mermaid-svg-Tl57iCWOTy3PKoKt .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Tl57iCWOTy3PKoKt .icon-shape .label rect,#mermaid-svg-Tl57iCWOTy3PKoKt .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Tl57iCWOTy3PKoKt .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Tl57iCWOTy3PKoKt .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Tl57iCWOTy3PKoKt :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 模块接3.3V并共地
初始化I2C总线
确定ADDR对应0x23或0x5C
发送命令0x10
首次等待足够的转换时间
以读方向寻址模块
读取高字节并回ACK
读取低字节并回NACK
STOP
raw等于High左移8位或Low
lux等于raw除以1.2
延时后再次读取
线路事务可概括为:
text
发送测量命令:S → SLA+W → ACK → 0x10 → ACK → P
读取测量结果:S → SLA+R → ACK
→ High Byte → 主机ACK
→ Low Byte → 主机NACK → P
BH1750 每个操作码后要求 STOP,不能在同一次写事务中连续塞入多个不同命令。
24.2 两字节组合与照度换算
c
uint8_t high = ...;
uint8_t low = ...;
uint16_t raw = ((uint16_t)high << 8) | low;
float lux = raw / 1.2f; // 默认MTreg=69,高分辨率模式
BH1750 结果是无符号数,不要像 MPU6050 那样转换成 int16_t。
例如:
text
High = 0x01,Low = 0x20
raw = 0x0120 = 288
lux = 288 / 1.2 = 240 lx
高分辨率模式 2(0x11/0x21)的输出灵敏度是普通高分辨率模式的 2 倍,默认 MTreg 下应使用:
text
lux = raw / 2.4
若修改测量时间寄存器 MTreg,则普通高分辨率模式的通用换算为:
text
lux = raw × (69 / MTreg) / 1.2
模式 2 再额外除以 2。初学阶段建议保持默认 MTreg=69,先把基本通信跑通。
25. GY-30 与普通光敏电阻模块不要混淆
你的项目中已有 模块资料/4-光敏电阻传感器,它与 GY-30 不是同一种模块:
| 项目 | GY-30 / BH1750 | 普通光敏电阻模块 |
|---|---|---|
| 信号类型 | 数字 I²C | 模拟电压 AO 和/或比较器数字量 DO |
| 结果含义 | 近似照度值 lux | 光强相关电压或"超过阈值" |
| MCU 外设 | I²C 或软件模拟 I²C | ADC 或普通 GPIO |
| 标定与一致性 | 内部完成光电转换和数字输出 | 受光敏电阻、分压和电位器阈值影响较大 |
| 适合任务 | 显示照度、按 lux 控制背光 | 简单亮暗检测、阈值报警 |
因此你可以用 GY-30 完成本章的 I²C 学习目标,用普通光敏电阻模块复习 ADC/GPIO。两者不能直接共用驱动代码。
推荐实践顺序
#mermaid-svg-TAmHNbJZrsUkwRJk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TAmHNbJZrsUkwRJk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TAmHNbJZrsUkwRJk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TAmHNbJZrsUkwRJk .error-icon{fill:#552222;}#mermaid-svg-TAmHNbJZrsUkwRJk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TAmHNbJZrsUkwRJk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TAmHNbJZrsUkwRJk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TAmHNbJZrsUkwRJk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TAmHNbJZrsUkwRJk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TAmHNbJZrsUkwRJk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TAmHNbJZrsUkwRJk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TAmHNbJZrsUkwRJk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TAmHNbJZrsUkwRJk .marker.cross{stroke:#333333;}#mermaid-svg-TAmHNbJZrsUkwRJk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TAmHNbJZrsUkwRJk p{margin:0;}#mermaid-svg-TAmHNbJZrsUkwRJk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-TAmHNbJZrsUkwRJk .cluster-label text{fill:#333;}#mermaid-svg-TAmHNbJZrsUkwRJk .cluster-label span{color:#333;}#mermaid-svg-TAmHNbJZrsUkwRJk .cluster-label span p{background-color:transparent;}#mermaid-svg-TAmHNbJZrsUkwRJk .label text,#mermaid-svg-TAmHNbJZrsUkwRJk span{fill:#333;color:#333;}#mermaid-svg-TAmHNbJZrsUkwRJk .node rect,#mermaid-svg-TAmHNbJZrsUkwRJk .node circle,#mermaid-svg-TAmHNbJZrsUkwRJk .node ellipse,#mermaid-svg-TAmHNbJZrsUkwRJk .node polygon,#mermaid-svg-TAmHNbJZrsUkwRJk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TAmHNbJZrsUkwRJk .rough-node .label text,#mermaid-svg-TAmHNbJZrsUkwRJk .node .label text,#mermaid-svg-TAmHNbJZrsUkwRJk .image-shape .label,#mermaid-svg-TAmHNbJZrsUkwRJk .icon-shape .label{text-anchor:middle;}#mermaid-svg-TAmHNbJZrsUkwRJk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-TAmHNbJZrsUkwRJk .rough-node .label,#mermaid-svg-TAmHNbJZrsUkwRJk .node .label,#mermaid-svg-TAmHNbJZrsUkwRJk .image-shape .label,#mermaid-svg-TAmHNbJZrsUkwRJk .icon-shape .label{text-align:center;}#mermaid-svg-TAmHNbJZrsUkwRJk .node.clickable{cursor:pointer;}#mermaid-svg-TAmHNbJZrsUkwRJk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-TAmHNbJZrsUkwRJk .arrowheadPath{fill:#333333;}#mermaid-svg-TAmHNbJZrsUkwRJk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TAmHNbJZrsUkwRJk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TAmHNbJZrsUkwRJk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TAmHNbJZrsUkwRJk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-TAmHNbJZrsUkwRJk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TAmHNbJZrsUkwRJk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-TAmHNbJZrsUkwRJk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TAmHNbJZrsUkwRJk .cluster text{fill:#333;}#mermaid-svg-TAmHNbJZrsUkwRJk .cluster span{color:#333;}#mermaid-svg-TAmHNbJZrsUkwRJk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TAmHNbJZrsUkwRJk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TAmHNbJZrsUkwRJk rect.text{fill:none;stroke-width:0;}#mermaid-svg-TAmHNbJZrsUkwRJk .icon-shape,#mermaid-svg-TAmHNbJZrsUkwRJk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TAmHNbJZrsUkwRJk .icon-shape p,#mermaid-svg-TAmHNbJZrsUkwRJk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-TAmHNbJZrsUkwRJk .icon-shape .label rect,#mermaid-svg-TAmHNbJZrsUkwRJk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TAmHNbJZrsUkwRJk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TAmHNbJZrsUkwRJk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TAmHNbJZrsUkwRJk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 先扫描或尝试0x23
发送0x10连续高分辨率命令
等待首次转换
循环读取2字节
换算并在OLED显示lux
设置亮暗阈值控制LED
比较室内、遮挡和手机闪光灯数据
再尝试单次模式降低功耗
初次调试建议记录三组现象:手掌遮挡、正常室内光、手机闪光灯靠近。若读数始终为 0x0000 或 0xFFFF,优先检查地址、供电、上拉、等待时间及两字节读取后的 ACK/NACK 顺序。
26. 本节边界与下一步
本节已经讲清:
- MPU6050 六轴的组成;
- 加速度计和陀螺仪各自的物理意义与局限;
- 量程、灵敏度、滤波和采样率;
- 模块供电、I²C、AD0、INT、XCL/XDA;
- 芯片框图和数据产生路径;
- 关键配置与数据寄存器;
- 解除睡眠、身份验证、高低字节拼接和物理量换算。
课程下一节会正式编写软件 I²C 驱动,通过指定地址写配置 MPU6050,再通过指定地址读取得六轴数据。你没有 MPU6050 时,可以先把相同的 I²C 基本单元复用于 GY-30:发送一个测量命令,等待转换,再读取两个字节并换算 lux。需要注意 GY-30 是命令型器件,不照搬 MPU6050 的寄存器地址流程。
27. 复习自测
- MPU6050 的"六轴"分别是哪六个测量通道?
- 为什么加速度计静止时通常有一个轴约为 1 g?
- 为什么仅靠加速度计不能稳定测量动态姿态?
- 为什么陀螺仪角度积分会随时间漂移?
- ±2 g 和 ±16 g 哪个分辨率更高,哪个更不易饱和?
- ±2 g 下原始值 16384 对应多少 g?
- ±500 °/s 下原始值 655 对应多少 °/s?
0x68与0xD0/0xD1分别代表什么?- AD0 拉高后,WHO_AM_I 为什么仍为
0x68? - 为什么上电后要先处理
PWR_MGMT_1? - 如何把
0xFC和0x18合成正确的负数? - 为什么推荐从
0x3B一次突发读取 14 字节? - 模块 VCC 能接受较高输入时,为什么仍不能把裸芯片接到 5 V?
- DLPF 带宽降低会同时带来什么好处和代价?
- GY-30 的 7 位地址由哪个引脚决定,两个可能值是什么?
- 为什么裸 BH1750FVI 不能因为"模块可接 5 V"就直接使用 5 V?
0x10和0x20模式在重复测量行为上有什么区别?- 为什么发送测量命令后不能立即读取结果?
- 默认 MTreg 下,普通高分辨率模式读取
raw=1200对应多少 lux? - 为什么 GY-30 的原始值使用
uint16_t,而 MPU6050 单轴值使用int16_t? - GY-30 和普通光敏电阻模块分别应该使用 STM32 的什么外设?
28. 参考资料与页码索引
- 课堂录音:00:03~03:39 功能与姿态;03:39~07:39 加速度计和陀螺仪;07:39~12:38 参数与地址;12:38~19:50 模块硬件与芯片框图;19:50~27:04 手册和关键寄存器;
- 教师 PPT:第 136~139 页;
- 师兄笔记:
STM32笔记.pdf第 108~111 页; - 产品规格书:
PS-MPU-6000A.pdf第 7 页(总体结构)、第 12~14 页(量程、灵敏度、供电和温度)、第 30~32 页(时钟、数据寄存器、FIFO 和中断)、第 36 页起(数字接口); - 寄存器手册:
RM-MPU-6000A.pdf第 5~8 页(总表)、第 10~14 页(采样、滤波、量程)、第 29~33 页(中断与传感器数据)、第 44~45 页(电源管理)、第 49 页(WHO_AM_I); - 模块原理图:
模块资料/13-MPU6050 陀螺仪加速度计/MPU6050-V1-SCH.jpg。 - GY-30 芯片资料:ROHM《BH1750FVI Technical Note》PDF 第 1 页(电源和量程)、第 4~5 页(状态和命令)、第 7 页(读数示例)、第 10~12 页(地址、读写格式、MTreg 与模式 2)。项目中暂未找到该模块的本地手册,参数依据 BH1750FVI 数据手册镜像 核对;
- 项目内普通光敏模块资料:
模块资料/4-光敏电阻传感器,与 GY-30 驱动方式不同。
29. 一句话总结
MPU6050 和 GY-30 都通过 I²C 输出 16 位测量结果,但 MPU6050 以寄存器方式提供有符号六轴数据,GY-30 以命令方式提供无符号照度数据;掌握地址、命令/寄存器语义、转换等待、双字节组合与量纲换算,才能把同一套 I²C 基本时序迁移到不同传感器。