HC-SR04测距真相:为何必须用输入捕获+从模式复位

发布时间:2026/10/15 3:58:08

HC-SR04测距真相:为何必须用输入捕获+从模式复位 title: HC-SR04 超声测距为什么必须用「输入捕获 从模式复位」把 Echo 的每一段路都走一遍tags: [STM32, 定时器, 输入捕获, HC-SR04, 超声测距, 从模式控制器]---# 前言初学 HC-SR04最容易卡住的不是接线而是三个问题1. **Echo 的脉冲到底是谁产生的**2. **它进了 STM32 之后走了哪些路**3. **为什么非要开「从模式复位」和两个捕获通道一个不够吗**这篇笔记把这三件事一次性讲透。核心只有一句话 **Trig 是 STM32 发出去的发令枪Echo 是 HC-SR04 自己产生的秒表而 STM32 的定时器只负责给这块秒表拍两张照片。**---# 一、先分清两个脉冲别搞混| 脉冲 | 谁产生 | 走到哪 | 特征 ||---|---|---|---|| **Trig 触发脉冲** | STM32 的 **PA0**推挽输出 | → HC-SR04 的 **Trig** 脚 | 软件拉高 **≥ 10 µs** 再拉低 || **Echo 回响脉冲** | **HC-SR04 模块内部自己产生** | 从 **Echo** 脚输出 → STM32 | 高电平宽度 声波往返时间最长约 **38 ms** |一句话记牢 **Trig 引脚用于开启测量。要开启一次测量就得给 Trig 一个脉冲。** **Echo 的脉冲是 HC-SR04 模块自己产生的从 Echo 脚输出。**所以 STM32 的活儿只有一件**把 Echo 的高电平有多宽量出来。**---# 二、从声波到引脚Echo 是怎么被造出来的PA0 输出 10µs Trig 脉冲│▼HC-SR04 内部├─ ① 发射头 T 发出 8 个 40 kHz 超声波脉冲├─ ② 同时把 Echo 拉高开始计时├─ ③ 声波遇障碍物反射被接收头 R 收到└─ ④ 收到回波 → Echo 拉低计时结束- **Echo 高电平持续时间 声波去 回的总时间**- 距离换算$$\text{距离} \frac{\text{Echo 高电平时间} \times 340\,\text{m/s}}{2}$$ 除以 2 是因为声波走了一个来回。这是唯一需要软件做的换算。# 四、Echo 进入 STM32 之后的完整路线## 4.1 一句话版 **Echo 引脚 → 定时器 CH1 输入 → 输入滤波 → 边沿检测 → TI1FP1 → 一分为二** **一路触发从模式控制器把 CNT 清零同时 CH1 捕获上升沿存 CCR1** **另一路把信号送到 CH2等 Echo 下降沿到来时捕获 CNT 到 CCR2。**## 4.2 框图版┌──────────── CNT计数器────────────┐│ ▲ ││ ┌────┴────┐ ┌───────┐ ││ │ PSC │ │ ARR │ ││ └─────────┘ └───────┘ │└──────┬──────────────────┬───────────┘│ 捕获 │ 捕获┌────▼────┐ ┌────▼────┐│ CCR1 │ │ CCR2 │└────▲────┘ └────▲────┘│ 拍照 │ 拍照Echo ──► CH1 ──► 输入滤波 ──► 边沿检测 ──┐ ││ │ ││ ┌────┴──┴────┐│ │ 捕获分频 ││ │ ÷1/2/4/8 ││ └────────────┘│└──► 上升沿脉冲 ──┐├─► 信号选择 ─► TRC下降沿脉冲 ──┘ │▼┌──────────────────┐│ 从模式控制器 ││ (复位模式 Reset) │└────────┬─────────┘│清空 CNT 0关键点**Echo 接的是 TIM 的 CH1复用输入Trig 接的是普通 GPIO 输出PA0。**发送和接收分开走不要试图拿同一个引脚同时干两件事。---# 五、再把输入通道拆成 6 个节点这张图最值钱从引脚到 CCR 寄存器信号其实过了**四个阶段、六个节点**CH1引脚 ──①──► [输入滤波] ──②──► [边沿检测] ──③④──► [信号选择/TRC] ──⑤──► [捕获分频] ──⑥──► CCR1第一阶段 第二阶段 第三阶段 第四阶段底下六个波形就是同一根 Echo 信号在不同节点上的样子**越往右越干净、越窄、越稀疏。**## 第一阶段输入滤波节点 ① → ②fCK_INT ──► ÷1/2/4/8 ──► fDTS ──┐▼CH1引脚 ──────────────► [ 输入滤波 ] ──► 节点②- **作用**消抖、去毛刺。节点①里那段密集抖动到节点②被整块吃掉只留真正的边沿。- **原理**不是 RC 模拟滤波而是**数字采样**——用 fDTS 去连续采输入电平要求**连续 N 次采样都相同**N 由 IC1F[3:0] 决定输出才翻转。- **两个可调项**都在这一级- 前级 DTS 分频 ÷1 / ÷2 / ÷4 / ÷8 → 决定**采样快慢**- 滤波长度 IC1F → 决定**要连续采几次相同才算数**- **代价**滤波越强边沿延迟越大。 ⚠️ **别搞混**这里是 **fDTS 分频**后面第四阶段还有一个**捕获分频**。两者位置不同、作用完全不同。## 第二阶段边沿检测节点 ② → ③④信号在这一级被**一分为二**| 输出 | 含义 | 节点 ||---|---|---|| **上升沿脉冲** | 检到上升沿的**那一刻**产生一个脉冲 | 节点③ || **下降沿脉冲** | 检到下降沿的**那一刻**产生一个脉冲 | 节点④ |- 输出的**不是电平而是瞬间脉冲**所以节点③④看起来又窄又尖。- 这一级同时也分出 **CH2 的上升/下降沿脉冲**即 TI1FP2——这就是一个引脚能同时被两个通道使用的由来。- 选哪个沿由 CC1P / CC1NP 这类极性位决定。## 第三阶段信号选择 / TRC节点 ④ → ⑤上升沿脉冲 ─┐├─► [ 直接 / 间接 ] ─► TRC ─► 从模式控制器下降沿脉冲 ─┘- **直接 vs 间接**就是**是否再取反一次**。直接 原样送出间接 反相送出。- **TRC**触发选择器决定到底拿哪一路TI1FP1 / TI1FP2 / TI2FP1 …去驱动从模式控制器。- **节点⑤**就是最终真正送进定时器、去命令 CNT 动作的那个脉冲。## 第四阶段捕获分频节点 ⑤ → ⑥节点⑤ ──► [ 分频 ÷1/2/4/8 ] ──► 节点⑥ ──► CC1 捕获事件- 由 IC1PSC 配置**来 N 个边沿才真正捕获一次**。- 图中配的是 **÷2**所以红色圆圈里**两个脉冲只留了一个**节点⑥明显比节点⑤稀疏。- **测距必须配 ÷1**否则漏掉边沿脉宽直接算错。## 收尾拍照 清零节点⑥ ──► 捕获事件├─► 【拍照】把此刻 CNT 的值拷进 CCR1└─► 【清零】从模式控制器把 CNT 打回 0- **拍照**CCR 只负责记录此刻计数值像按快门。- **清零**复位模式Reset Mode下CNT 被硬件打回 0重新开始计时。- 两者**由同一个沿、在硬件上同时发生**。---# 六、核心机制上升沿存 CCR1下降沿存 CCR2这是整个方案的心脏一张图说清上升沿 下降沿│ │▼ ▼通道1 ──► ┌──────┐ ┌──────────┐│ CCR1 │ │ CCR2 │ ◄── 通道2└──────┘ └──────────┘▲ ▲│ │┌──────────┴────────────────────────┴──────────┐│ CNT 阶梯计数 │└──────────────────────────────────────────────┘- **遇到上升沿就保存到 CCR1 中**- **遇到下降沿就保存到 CCR2 中**于是脉宽 CCR2 - CCR1如果用**复位模式**上升沿会把 CNT 同时清零所以 **CCR1 恒等于 0**直接读 CCR2 就是微秒数距离(cm) CCR2 / 58 1 计数 1µs 时---# 七、为什么要用「从模式复位」一个通道不行吗理论上用两个通道分别捕获两个沿然后做减法也能算。但复位模式有三个实打实的好处1. **省掉减法也天然防溢出**上升沿把 CNT 归零脉宽直接就是 CCR2 的值。同时最大计数值被压到一个 Echo 周期内16 位计数器不容易溢出。2. **硬件级测量不受中断延迟影响**捕获值是硬件瞬间锁存的软件晚几十微秒再去读**测出来的时间依然是准的**。用软件中断记时间戳则会被中断延迟和优先级抖动污染。3. **一次触发、两路协同全程零 CPU 干预**CH1 管起跑清零 记起点CH2 管终点记终点一个定时器同时完成清零和两端捕获。---# 八、配置速查表| 阶段 | 寄存器位 | 作用 | 测距推荐值 ||---|---|---|---|| 一阶段 DTS 分频 | IC1F 中 DTS 位 | 采样时钟快慢 | 视噪声一般 ÷1 或 ÷2 || 一阶段 滤波长度 | IC1F[3:0] | 连续采样确认次数 | 0x3 ~ 0x7轻度滤波 || 二阶段 边沿极性 | CC1P/CC1NP、CC2P/CC2NP | 选捕获哪个沿 | CH1 上升沿、CH2 下降沿 || 三阶段 触发源 | TS[2:0] | TRC 选谁 | TI1FP1 || 三阶段 从模式 | SMS[2:0] | 触发后干什么 | **Reset mode复位模式** || 四阶段 捕获分频 | IC1PSC / IC2PSC | 几个沿捕获一次 | **÷1** || 时基 | PSC / ARR | 计数频率与范围 | PSC 711 µs 计数、ARR 65535 | 72 MHz / (711) **1 MHz**即 **1 个计数 1 µs**最大量程 65535 µs ≈ 65.5 ms刚好覆盖 38 ms。---# 九、实践踩坑清单1. **Trig 必须 ≥ 10 µs**太短模块不响应Echo 一直保持低电平。2. **Trig 别忘了拉低**只拉高不拉低模块不会启动一次新的测量。3. **捕获分频必须是 ÷1**配成 ÷2 会漏掉一半边沿测出来直接翻倍。4. **一定要加超时保护**前方无障碍物时 Echo 可能长时间不拉低程序不能死等下降沿——用 CC2 超时或 CNT 溢出判定。5. **PA0 的双重身份**作 Trig 时是 GPIO 推挽输出如果 Echo 也接到某个定时器通道配置时要分清输出模式和输入捕获模式不能在同一引脚的同一通道上同时生效。6. **警惕滤波延迟**滤波长度配得过大会引入几微秒的固定偏差近距离测量时误差明显。---# 十、全文一句话总结 **Trig 用 PA0 推挽输出一个 ≥10 µs 的脉冲开启测量HC-SR04 自己产生 Echo 高电平脉冲宽度正比于距离Echo 进定时器 CH1依次经过输入滤波、边沿检测、信号选择TRC、捕获分频÷1上升沿触发从模式复位把 CNT 清零、同时存进 CCR1下降沿通过 CH2 存进 CCR2CCR2 - CCR1 就是高电平时间除以 58 就是厘米数。**注学生自己复习用仅供参考/
延伸阅读

更多相关文章

2026/10/15 3:58:08

意识障碍研究--论文阅读3

Thalamic deep brain stimulation in traumatic brain injury: a phase 1, randomized feasibility study 总结:本文主要在已经恢复意识、但存在长期认知障碍的中重度创伤性脑损伤(msTBI)患者上进行了基于神经环路机制的精准DBS干预与早期临床…

2026/10/15 3:53:08

隧道的建立及前置基础

一、内网穿透原理 1、内网穿透 利用各种隧道技术,以网络防火墙允许的协议,绕过网络防火墙的封锁,实现访问被封锁的目标网络。 (1)端口转发:将发往外网的某个端口的数据完全转发给内网,是外网到…

2026/10/15 5:18:12

河北工业大学Java期末复习题:25道选择题考点剖析

简介:河北工业大学Java期末考试复习题(部分答案)是一份面向该校Java课程本科生的期末备考资料,适用于考前集中复习、常见题型演练和查漏补缺,也可供任课教师出题或备课参考。资源包共包含1个doc文档,整体约…

2026/10/15 5:18:12

FileChannel深度解析:零拷贝与内存映射实战指南

在Java的NIO体系里,FileChannel是很多人学完Buffer之后第一个真正上手的通道类。它解决的问题很朴素:让文件的读写不再像传统IO那样一边读一边频繁拷贝,而是把文件抽象成一个可定位、可映射、可高效搬移的通道。作为整个NIO中唯一和本地文件系…

2026/10/15 5:18:12

分数阶Calderón问题贝叶斯反演:MCMC与MATLAB实现全解析

做反问题这些年,我发现一个特别有意思的共识:只要把经典算子换成分数阶,问题难度往往会跳一个台阶,但能解释的物理现象也瞬间丰富很多。分数阶Caldern问题就是这个方向的典型代表——它既要处理边界测量反演内部参数的经典难点&am…

2026/10/15 5:18:12

LLM推理性能测试指南:并发压测与指标归因实战

性能测试这件事,最怕的不是结果不好看,而是结果说不出为什么,换个环境就崩。上个月我把 vLLM 和 SGLang 两个推理引擎拉到一起做并发实验,前前后后折腾了两周,最后发现坑全不在引擎本身,而在实验设计和指标…

2026/10/15 5:18:12

一文搞懂分类问题:算法选型、评估指标与实战避坑

1. 分类问题到底在解决什么:先想清楚边界在哪很多人一上来就背模型:逻辑回归、决策树、SVM、随机森林……但真到项目里,第一个卡住的往往不是模型不会调,而是"这个问题到底该不该当成分类来做"。我见过不少同学把回归问…

2026/10/15 5:13:12

PostgreSQL生产库备份方案:Barman全量备份与WAL归档实战

很多DBA做PostgreSQL备份,第一反应就是写个 cron 脚本,定时调 pg_dump。这套逻辑在几十 GB 的小库上确实够用,但当你手里管着几百 GB 甚至上 TB 的生产库,还要回答“我能恢复到什么时间点”“备份到底能不能用”这两个问题时&…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/15 0:02:22

防关联浏览器哪个好?三款产品实测差异解析

新手做多店铺,最纠结的就是防关联浏览器选哪个。飞跨、网易、站斧这三款被问得最多,先给结论:要一体化省心、长期便宜,选站斧;要网易招牌和稳,选网易;预算紧做东南亚 Lazada,选飞跨。…

2026/10/15 0:02:22

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成 一、技术背景 大模型(LLM)在通用场景下表现强大,但当我们将 GPT-4 或 Qwen 直接用于生成影刀RPA操作指令和 XPath 定位时,准确率通常只有 40%-60%。原因…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑