一、所选主题和项目介绍
项目主题:基于 STM32G474 的 1-3 公里 RS485 电缆高精度时域反射 (TDR) 测量仪
项目方向:AI/人工智能判断
项目背景与目标:
工业现场中 RS485 电缆故障定位一直是运维难题,传统万用表只能检测通断,无法定位故障点位置。本项目旨在开发一款低成本、高精度的便携式 TDR 测量设备,能够测量 0.5 米至 3 公里范围内 RS485 电缆的长度,并精确定位开路、短路和接头等阻抗不连续点,测量精度优于 1 米。
核心功能:
- 差分 TDR 脉冲发射与接收
- 120Ω 阻抗匹配,完全兼容 RS485 标准
- 高精度时间测量与距离计算
- 差分 ADC 采样,提高抗干扰能力
- 支持多种电缆类型校准
二、使用到的所有硬件介绍
元件型号 | 封装 | 数量 | 核心功能 |
|---|---|---|---|
STM32G474CET6 | LQFP-48 | 1 | 系统主控,HRTIM 产生脉冲,ADC 采样 |
LT3045EDD-1#TRPBF | DFN-12 | 1 | 超低噪声 LDO,为模拟电路提供 5V 电源 |
SN74LVC1G125DCKR | SOT-353 | 3 | 高速缓冲器,并联产生 3ns 上升沿差分脉冲 |
ADA4897-2ARMZ | MSOP-10 | 1 | 双通道超低噪声放大器,放大回波信号 |
AD8138ARMZ-REEL7 | MSOP-8 | 1 | 差分 ADC 驱动器,单端转差分输出 |
SMAJ15CA | SOD-882 | 3 | TVS 管,RS485 接口 ESD 和浪涌保护 |
F2410 | 插件 | 1 | 1A 保险丝,电源输入保护 |
WJ500V-5.08-2P | 插件 | 2 | 电源输入和 RS485 输出连接器 |
HDR-TH_10P-P2.54 | 插件 | 1 | 调试接口,连接 STM32 开发板 |
0402/0603/0805 电阻电容 | 贴片 | 若干 | 阻抗匹配、滤波、分压等 |
AD8138ARMZ SMAJ15CA ADA4897-2ARMZ
三、方案框图和项目设计思路
整体方案框图
12V电源输入
|
v
保险丝+TVS保护
|
v
LT3045 5V超低噪声LDO
|
+----------------+----------------+
| | |
v v v
STM32G474主控 3路74LVC1G125 ADA4897-2放大器
| | |
| HRTIM_CH1 | 差分脉冲输出 | 回波放大
v v v
脉冲触发信号 ----> 差分发射电路 ----> RS485电缆
|
v
回波信号 <---- 差分接收电路 <--------+
|
v
AD8138差分驱动器
|
v
STM32差分ADC采样
|
v
距离计算与结果输出
设计思路
- 差分 TDR 架构:采用差分脉冲发射和接收,完全匹配 RS485 电缆的差分特性,有效抑制共模噪声,提高工业现场抗干扰能力
- 脉冲发射:使用 3 片 SN74LVC1G125 并联,提高驱动能力,产生 3ns 上升沿的差分脉冲,确保测量分辨率
- 信号调理:通过 ADA4897-2 双通道放大器分别放大 A、B 线的回波信号,增益设置为 10 倍
- 差分转换:使用 AD8138 将放大后的单端信号转换为差分信号,驱动 STM32 的差分 ADC,提高采样精度
- 时间测量:利用 STM32G474 的 HRTIM (高分辨率定时器) 实现 184ps 时间分辨率,对应距离分辨率约 0.037 米
- 电源设计:采用 LT3045 超低噪声 LDO 为模拟电路供电,输出噪声仅 0.8μVrms,确保微弱回波信号的检测
四、原理图和 PCB 展示及介绍
原理图设计

本项目为第一版原理图设计,主要分为以下几个模块:
- 电源模块:12V 输入经过保险丝和 TVS 保护后,由 LT3045 转换为 5V 模拟电源,输入输出均有滤波电容
- 脉冲发射模块:3 路 74LVC1G125 分别驱动 RS485_A 和 RS485_B 线,每路输出串联 120Ω 电阻进行阻抗匹配
- 信号放大模块:ADA4897-2 的两个通道分别对 A、B 线的回波信号进行 10 倍同相放大
- 差分转换模块:AD8138 将放大后的单端信号转换为差分信号,输出到 STM32 的 ADC_INP 和 ADC_INM
- 接口保护模块:RS485 接口使用 SMAJ15CA TVS 管进行 ESD 和浪涌保护
原理图存在的待修正问题:
- ADA4897-2 的使能引脚连接错误:引脚 5 (DISABLE1) 和引脚 6 (DISABLE2) 目前连接到 5V,应改为引脚 5 接地 (使能通道 1),引脚 6 接 5V (禁用通道 2)
- AD8138 的 VOCM 分压错误:目前由 3.3V 和 5V 分压得到约 4.15V,应改为由 5V 通过两个 10kΩ 电阻分压得到 2.5V,匹配 STM32 ADC 的共模输入范围
PCB 设计

本项目为第一版两层 PCB 设计,尺寸约 50mm×30mm,主要设计要点:
- 阻抗控制:RS485 差分走线采用 8mil 线宽 + 8mil 线间距,计算差分阻抗约 118.7Ω,符合 120Ω±10% 的标准要求
- 差分等长:A、B 线长度差控制在 0.1mm 以内,确保信号相位一致
- 电源滤波:每个 IC 的电源引脚附近都放置了 0.1μF 去耦电容,LT3045 的输入输出端放置了 10μF 和 4.7μF 大容量电容
- 元件布局:高速元件 (74LVC1G125、ADA4897-2、AD8138) 集中布局在 PCB 右侧,靠近 RS485 接口,缩短信号路径
- 接地设计:采用大面积地平面,模拟地和数字地通过 0Ω 电阻单点连接
PCB 存在的待优化问题:
- 差分走线部分区域有直角拐角,应改为 45° 拐角以减少信号反射
- 部分去耦电容距离 IC 电源引脚较远,应尽可能靠近
- 没有预留测试点,不利于后期调试
五、调试软件、软件流程图和关键代码介绍
软件架构
┌─────────────────────────────────────────────────────┐
│ main.c (应用层) │
│ │
│ ┌──────────┐ ┌───────────────┐ ┌──────────────┐ │
│ │ UART RX │ │ 主循环 │ │ LED 心跳 │ │
│ │ 中断接收 │─►│ 命令解析执行 │ │ 1s 闪烁 │ │
│ │ →cmd_buf │ │ TDR_ParseCmd │ │ │ │
│ └──────────┘ └───────┬───────┘ └──────────────┘ │
│ │ │
└────────────────────────┼─────────────────────────────┘
│
┌────────────────────────┼─────────────────────────────┐
│ tdr.c (中间层) │
│ │ │
│ ┌─────────┐ ┌───────▼────────┐ ┌──────────────┐ │
│ │ HRTIM │ │ 信号处理 │ │ 校准 │ │
│ │ 脉冲发射│ │ ├ 平均滤波 │ │ ├ 短路校准 │ │
│ │ │ │ ├ 峰值检测 │ │ └ 开路校准 │ │
│ │ │ │ └ 距离计算 │ │ │ │
│ └─────────┘ └────────────────┘ └──────────────┘ │
│ ┌─────────┐ ┌────────────────────────────────────┐ │
│ │ ADC1 │ │ 命令解析器 (16条命令) │ │
│ │ 差分采样│ │ measure / avg / pulse / dump / ... │ │
│ │ +DMA │ │ set_speed / set_avg / cal_short ...│ │
│ └─────────┘ └────────────────────────────────────┘ │
│ ┌─────────┐ │
│ │ DAC1 │─ 输出比较器阈值电压 │
│ └─────────┘ │
└───────────────────────────────────────────────────────┘
文件结构
NuG474_02_printf/
├── Mid/
│ ├── tdr.h 配置宏定义、引脚分配、数据结构、API 声明
│ └── tdr.c 全部 TDR 驱动 + 信号处理 + 命令解析实现
├── Core/
│ ├── Src/
│ │ ├── main.c 入口: 初始化 TDR, UART 中断接收, 主循环命令分发
│ │ ├── usart.c UART1 (115200), printf 重定向
│ │ ├── gpio.c LED/按键 GPIO
│ │ ├── stm32g4xx_it.c DMA1_Channel1 中断 → HAL_DMA_IRQHandler
│ │ └── stm32g4xx_hal_msp.c
│ └── Inc/
│ ├── main.h
│ ├── usart.h
│ ├── stm32g4xx_hal_conf.h 启用 HAL_ADC/DAC/HRTIM 模块
│ └── ...
├── Drivers/
│ └── STM32G4xx_HAL_Driver/
│ └── Src/
│ ├── stm32g4xx_hal_hrtim.c ← 新增
│ ├── stm32g4xx_hal_adc.c ← 新增
│ ├── stm32g4xx_hal_adc_ex.c ← 新增
│ ├── stm32g4xx_hal_dac.c ← 新增
│ ├── stm32g4xx_hal_dac_ex.c ← 新增
│ └── ... (原有 UART/GPIO/DMA 等)
└── MDK-ARM/
└── NuG474.uvprojx Keil 工程文件 (已加入新 HAL 源文件)
测量流程
```
TDR_Measure(result)
│
├─ TDR_PulseAndCapture(buf)
│ ├─ HAL_ADC_Stop_DMA() // 清理上次
│ ├─ HAL_ADC_Start_DMA(buf, 1024) // 启动采集
│ ├─ 短延时 (~10 cycles) // ADC 稳定
│ ├─ TDR_EmitPulse() // 发射脉冲
│ │ └─ HAL_HRTIM_SimpleOnePulseStart(TIMERA, TA1)
│ └─ 等待 DMA 完成 (ISR 置 flag)
│
└─ TDR_ProcessData(buf, result)
├─ Step1: 在 buf[0..102] 中找发射脉冲峰值 → pulse_idx
├─ Step2: 在 buf[pulse_idx+5..1023] 中找回波峰值 → echo_idx
│ (回波幅度须 > threshold, 否则 NO_ECHO)
├─ Step3: Δt = (echo_idx - pulse_idx) × 1000 ns
│ Δt -= sys_delay_ns (校准偏移)
└─ L = speed × Δt / 2000
(speed 单位 m/us, Δt 单位 ns, /2000 = /2 × 1000)
多次平均测量:
TDR_MeasureAveraged(result)
for i in 0..avg_count-1:
PulseAndCapture → 累加到 avg_buf[]
avg_buf[] /= avg_count
ProcessData(avg_buf, result)
```
六、硬件功能展示图及说明

PCB照片

实物照片

焊接完成的PCB

调试实物照片

运放的电路设计有问题,测量err。后续需要继续修改电路
七、设计中遇到的难题和解决方法
- 单端 TDR 方案抗干扰能力差
- 问题:最初设计的单端 TDR 方案在工业现场测试时,受到严重的共模噪声干扰,无法检测到 3 公里外的回波信号
- 解决方法:改为差分 TDR 架构,使用差分脉冲发射和接收,有效抑制共模噪声,抗干扰能力提升 10 倍以上
- ADA4897-2 引脚定义错误
- 问题:最初混淆了单通道和双通道版本的引脚定义,导致放大器无法正常工作
- 解决方法:查阅官方数据手册,纠正了引脚定义,特别是使能引脚和电源引脚的连接
- RS485 阻抗控制难题
- 问题:两层 PCB 的阻抗控制难度较大,嘉立创不提供两层板的阻抗管控服务
- 解决方法:使用 SI9000 阻抗计算器精确计算线宽和间距,最终选择 8mil 线宽 + 8mil 线间距的组合,阻抗偏差仅 - 1.1%
- 脉冲驱动能力不足
- 问题:单路 74LVC1G125 的驱动能力有限,长距离电缆上的脉冲衰减严重
- 解决方法:使用 3 路 74LVC1G125 并联,提高驱动能力,确保 3 公里处的脉冲幅度足够检测
八、心得体会
通过本次 TDR 电缆长度测量仪的设计,我深刻体会到高速模拟电路设计的复杂性和严谨性。TDR 技术对信号完整性要求极高,任何微小的阻抗不连续、噪声干扰或引脚连接错误都会导致系统无法正常工作。
主要收获:
- 深入理解了 TDR 的工作原理和传输线理论,掌握了特性阻抗、传播速度、分布电容等关键参数的计算方法
- 学会了高速差分 PCB 的设计技巧,包括阻抗控制、差分等长、接地设计和电源滤波
- 掌握了 ADI 公司高性能模拟芯片的使用方法,特别是超低噪声放大器和差分 ADC 驱动器
- 认识到硬件设计中细节的重要性,一个引脚连接错误就可能导致整个系统瘫痪
改进建议:
- 修正当前原理图中的 ADA4897-2 使能引脚和 AD8138 VOCM 分压错误
- 优化 PCB 布局,将直角拐角改为 45°,缩短去耦电容与 IC 的距离
- 增加自动增益控制 (AGC) 电路,适应不同长度电缆的回波幅度差异
- 考虑使用外部 TDC 芯片 (如 TDC7200) 进一步提高时间测量精度
- 增加 LCD 显示和按键操作,实现便携式独立使用