24_MPU6050结构参数与寄存器基础

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

CONFIG0x1A)中的 DLPF_CFG[2:0] 设置加速度计和陀螺仪的低通滤波。滤波带宽越低,输出越平滑,但响应延迟越大。寄存器手册第 11 页列出了不同档位的带宽与延迟。

因此不能只追求"不抖":控制系统需要在噪声与相位延迟之间折中。

8.2 采样分频器

SMPLRT_DIV0x19)决定输出采样率,官方寄存器手册第 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_10x6B)复位值为 0x40
  • 0x40 表示 bit6 SLEEP=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 位地址 0x68WHO_AM_I=0x68
  • AD0=1 时,总线 7 位地址 0x69WHO_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,等待转换,再读取两字节;
  • 要快速粗略判断亮暗:可使用 0x130x23,但分辨率较低。

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
比较室内、遮挡和手机闪光灯数据
再尝试单次模式降低功耗

初次调试建议记录三组现象:手掌遮挡、正常室内光、手机闪光灯靠近。若读数始终为 0x00000xFFFF,优先检查地址、供电、上拉、等待时间及两字节读取后的 ACK/NACK 顺序。

26. 本节边界与下一步

本节已经讲清:

  • MPU6050 六轴的组成;
  • 加速度计和陀螺仪各自的物理意义与局限;
  • 量程、灵敏度、滤波和采样率;
  • 模块供电、I²C、AD0、INT、XCL/XDA;
  • 芯片框图和数据产生路径;
  • 关键配置与数据寄存器;
  • 解除睡眠、身份验证、高低字节拼接和物理量换算。

课程下一节会正式编写软件 I²C 驱动,通过指定地址写配置 MPU6050,再通过指定地址读取得六轴数据。你没有 MPU6050 时,可以先把相同的 I²C 基本单元复用于 GY-30:发送一个测量命令,等待转换,再读取两个字节并换算 lux。需要注意 GY-30 是命令型器件,不照搬 MPU6050 的寄存器地址流程。

27. 复习自测

  1. MPU6050 的"六轴"分别是哪六个测量通道?
  2. 为什么加速度计静止时通常有一个轴约为 1 g?
  3. 为什么仅靠加速度计不能稳定测量动态姿态?
  4. 为什么陀螺仪角度积分会随时间漂移?
  5. ±2 g 和 ±16 g 哪个分辨率更高,哪个更不易饱和?
  6. ±2 g 下原始值 16384 对应多少 g?
  7. ±500 °/s 下原始值 655 对应多少 °/s?
  8. 0x680xD0/0xD1 分别代表什么?
  9. AD0 拉高后,WHO_AM_I 为什么仍为 0x68
  10. 为什么上电后要先处理 PWR_MGMT_1
  11. 如何把 0xFC0x18 合成正确的负数?
  12. 为什么推荐从 0x3B 一次突发读取 14 字节?
  13. 模块 VCC 能接受较高输入时,为什么仍不能把裸芯片接到 5 V?
  14. DLPF 带宽降低会同时带来什么好处和代价?
  15. GY-30 的 7 位地址由哪个引脚决定,两个可能值是什么?
  16. 为什么裸 BH1750FVI 不能因为"模块可接 5 V"就直接使用 5 V?
  17. 0x100x20 模式在重复测量行为上有什么区别?
  18. 为什么发送测量命令后不能立即读取结果?
  19. 默认 MTreg 下,普通高分辨率模式读取 raw=1200 对应多少 lux?
  20. 为什么 GY-30 的原始值使用 uint16_t,而 MPU6050 单轴值使用 int16_t
  21. 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 基本时序迁移到不同传感器。

相关推荐
ZLG_zhiyuan1 小时前
低空测试“升维”:ZUS系列示波器如何破解复杂信号的“测与析”难点?
单片机·嵌入式硬件
诗词在线2 小时前
江上渔者|原文+注释+译文+赏析+考点
学习
逆境不可逃2 小时前
Pi Agent 学习笔记:不同模型如何接入同一套工具循环
笔记·学习
词却2 小时前
OpenCV学习:dlib 人脸检测
人工智能·opencv·学习
爱吃苹果的日记本2 小时前
数据结构第三课补充(空间复杂度)
数据结构·学习
..Dauntless..3 小时前
【stm32】GPIO(下篇)——统一编址、源码理解和输入模式
stm32·单片机·嵌入式硬件
PC2005-cloud3 小时前
Rust学习笔记:所有权、借用与生命周期——Rust的核心机制
笔记·学习·rust
霍金的微笑4 小时前
fuccc
学习
潜心一志4 小时前
HALCON软件——数据结构
学习·计算机视觉