2023电赛B题实战解析:基于立创天空星开发板的同轴线缆长度与负载测量系统
2023电赛B题实战解析:基于立创天空星开发板的同轴线缆长度与负载测量系统
最近有不少同学在准备电赛,或者对高精度测量感兴趣,问起2023年电赛B题(同轴线缆长度与负载测量)的具体实现方案。正好,我之前用立创EDA的天空星开发板(STM32F103核心)完整地做了一套,实测效果还不错。今天,我就把自己从硬件选型、电路设计到软件编程、参数标定的全过程,掰开揉碎了讲给大家听。无论你是想复现这个项目,还是想学习其中的精密测量思路,这篇文章都能给你一份清晰的“施工图”。
咱们这个系统的目标是:测量一段同轴线缆的长度,以及线缆末端接的负载是多大(负载可能是电阻,也可能是电容)。听起来简单,但要达到厘米级的长度精度和皮法级的电容精度,就得花点心思了。整个系统以天空星开发板为主控,核心的测量方案有两种,我会重点讲解更稳定、更易实现的方案二(NE555测电容法),同时也会带你了解方案一(TDR时域反射法)的原理,方便你理解不同方案的优劣。
1. 快速上手:如何复现这个项目
如果你手头有材料,想最快速度把系统搭起来跑通,可以按照这个“快速开始”指南来操作。
1.1 材料准备与硬件焊接
首先,你需要准备好所有硬件。我已经把整个项目的PCB设计文件开源了,你可以在立创EDA直接下单打板,元件也基本都可以在立创商城配齐。
- PCB与元件:直接使用项目提供的PCB文件下单即可,无需修改。元件清单也是标准化配置,你可以使用立创EDA的“元件下单”功能一键购买。这里有个关键点:程序默认使用长度测量方案二,所以方案一(涉及TDC-GP22、TLV3501等芯片)的元件你可以选择不购买、不焊接,这样可以节省成本和焊接时间。
- 待测物准备:
- 同轴线缆:建议购买RG316型号。因为程序里默认的标定参数(比如线缆的寄生电容)是基于RG316的,用它能最快获得准确结果。
- 负载:可以购买标准的SMA校准负载(电阻、电容)。更经济实惠的做法是买一些SMA连接器和直插的精密电阻、电容,自己焊接成负载模块,方便更换测试。
焊接时,牢记上面提到的点:如果只复现方案二,那么PCB上关于TDC-GP22、74AHC1G14、TLV3501等芯片的电路部分可以空着不焊。
1.2 程序烧录与测试
硬件焊好之后,就是让板子“活”起来。
- 程序烧录:我提供了编译好的
.bin和.hex文件。你只需要使用STM32CubeProgrammer这类烧录工具,选择对应的文件,一键烧录到天空星开发板即可。如果想自己修改代码、深入学习,则需要搭建开发环境,可以参考项目附件里的《CLion开发STM32环境搭建》文档。 - 连接测试:将待测的同轴线缆一端接到板子的测量端口。对于负载测试,有个小技巧:在同轴线缆的末端焊一个SMA母头,然后把不同的电阻或电容负载焊在SMA公头上。这样,你就能像换插头一样快速更换负载,非常方便进行批量测试或标定。
2. 核心方案解析:长度与负载怎么测?
题目要求先测线缆长度,再测末端负载(电阻或电容)。下面我分别讲解两种长度测量方案,以及电阻、电容负载的测量方法。
2.1 长度测量方案一:TDR时域反射法(原理了解)
这个方案非常“硬核”,利用的是雷达测距的原理。当线缆末端开路时,你从始端发射一个快速电脉冲,脉冲到达末端后会反射回来。只要精确测量发射脉冲和反射脉冲之间的时间差,就能根据信号在线缆中的传播速度算出长度。
硬件难点与破解:
- 脉冲要够“陡”:STM32的普通GPIO引脚驱动能力有限,直接产生的脉冲上升沿太慢,会被线缆的寄生电容“磨平”。解决办法是加一级74AHC1G14(高速反相器)作为驱动器,它能把脉冲的上升时间压缩到10纳秒左右。
- 反射信号很微弱:反射回来的脉冲幅度会衰减得很厉害。我们需要用TLV3501这款超高速比较器给它“整形”,把微弱、变形的脉冲整形成单片机容易识别的干净方波。
- 时间差要测得“极准”:1米线缆带来的时间差大约只有10纳秒。普通单片机定时器根本测不了这么准。这里祭出大杀器——TDC-GP22。这是一款专门用于精密时间测量的芯片,分辨率高达45皮秒(0.045纳秒),理论上测长度分辨率能优于1厘米。
软件驱动要点:
发射脉冲不能用普通的HAL库函数,太慢。必须直接操作寄存器来翻转GPIO,代码如下:
// 产生一个低电平脉冲 PULSE_GPIO_Port->BSRR = (uint32_t)PULSE_Pin << 16U; // 引脚置低 (Reset) PULSE_GPIO_Port->BSRR = PULSE_Pin; // 引脚置高 (Set)TDC-GP22通过SPI接口配置,寄存器配置比较复杂。项目中已经写好了驱动(
tdc.c/.h),核心配置如下表:寄存器地址 配置值 主要作用 0x80 0x009620 设置测量范围,使能时钟和自动校准 0x81 0x014100 设置计算方式:用STOP1的脉冲时间减START的脉冲时间 0x82 0xE00000 开启所有中断,设置边沿检测 0x86 0x010000 关键:将分辨率从90ps提升到45ps 测量业务逻辑在
getL.c中,需要你根据实际线缆标定两个参数:#define SPEED_FACTOR 0.6997f // 同轴线缆速度因子(信号速度/真空中光速) #define BIAS_LENGTH 23.178f // 长度补偿(零长时的系统固有延迟,单位厘米)
注意:TDR方案硬件复杂、成本高,容易受干扰,但它是直接测量,理论上更“纯粹”。方案二则另辟蹊径。
2.2 长度测量方案二:NE555测电容法(推荐实现)
这是咱们重点讲解和默认使用的方案,因为它更简单、稳定,且精度完全满足题目要求。它的思路很巧妙:不直接测时间差,而是通过测量线缆的寄生电容来反推长度。
- 原理:同轴线缆本身可以看作一个分布电容。像RG316这种线,它的单位长度电容值(约96.45pF/米)在手册上是固定的,并且很稳定。所以,只要我能测出整段线缆的总寄生电容,除以单位电容值,长度不就出来了吗?
- 如何测电容?——NE555振荡电路: 这里用了一个经典的NE555芯片构成多谐振荡器。它的妙处在于,输出方波的频率只跟电路中的两个电阻和一个电容有关。公式是:
频率 f = 1.44 / ((R1 + 2*R2) * C)当我们把公式里的电容C换成待测的同轴线缆寄生电容,那么测出振荡频率f,就能反推出电容C的大小。在本项目中,我们固定R1=10kΩ,R2=1MΩ。 - 单片机如何测频率?——输入捕获: NE555输出的方波信号接到STM32的一个具有输入捕获功能的定时器引脚(如TIM2_CH1)。配置该定时器在输入信号的每个上升沿捕获当前计数器的值,连续两次捕获值之差就是方波的周期,取倒数就是频率。STM32的定时器精度很高,轻松实现优于1pF的电容测量分辨率。
- 软件实现与标定: 相关代码在
getC.c中。同样,你需要标定两个参数来补偿电路本身的误差:
标定方法:找几段已知长度的线缆,测出对应的电容值,然后在Excel里做线性拟合(电容为Y轴,长度为X轴),拟合出的斜率和截距就对应着需要修正的#define C_K 0.977f // 电容比例补偿(主要因NE555电路的电阻值不准) #define C_BIAS_PF (-13.9f) // 电容零点补偿(电路板自身的寄生电容)C_K和C_BIAS_PF。
2.3 负载测量方案
测出长度后,系统会通过继电器自动切换到负载测量模式。
电容负载测量: 方法和上面测线缆寄生电容一模一样!还是用NE555电路。只不过,此时测到的总电容是线缆寄生电容和末端负载电容并联的结果。所以,最终的负载电容值 = 测得的总电容 - 之前存储的线缆寄生电容。
提示:如果你之前长度测量选的是TDR方案(方案一),那系统里就没有线缆的电容值。这时需要悄悄地用NE555电路先测一下线缆的电容,再测总电容,两者相减得到负载电容。
电阻负载测量:采用简单的分压法。 电路原理很简单:一个已知的精密电阻(本项目用51Ω)和待测的负载电阻串联,测量它们中间连接点的电压。根据分压公式,就能算出待测电阻的阻值。单片机通过ADC读取这个电压。
- 软件与标定:代码在
getR.c中。这里需要注意,测得的电阻包含了线缆本身的寄生电阻(很小,约0.14Ω/米)。计算时需要减去。标定参数如下:#define R_K 0.988f // 电阻比例补偿(分压电阻的精度误差) #define R_BIAS (-0.25f) // 电阻零点补偿(测量回路固有电阻) #define CABLE_R_PER_M 0.14f // 线缆单位长度电阻(Ω/m)
- 软件与标定:代码在
2.4 系统调度与显示
- 测量流程控制:板子上用了信号继电器来切换不同的测量电路(长度测量、电容测量、电阻测量)。程序的控制逻辑是:
- 先让继电器切换到电阻测量电路,测一下。如果阻值在合理范围(比如<1000Ω),就判定为电阻负载,显示结果。
- 如果不是电阻,再切换到电容测量电路去测。如果容值合理(比如>10pF),就判定为电容负载,显示结果。
- 如果两者都不符合,就判断为终端开路。
- 结果显示:使用了一块OLED屏幕来显示。我移植了一个轻量好用的OLED库(波特律动OLED库),并制作了12x12点阵的中文字库。所有显示相关的代码在
oled.c和font.c中。如果你想增加新的汉字显示,可以用他们提供的取模工具生成字模,添加到font.c数组里。
3. 实测效果与精度
纸上谈兵终觉浅,是骡子是马拉出来遛遛。下面是我们实际测试得到的数据,你可以作为参考:
长度测量精度(方案二)
| 实际线缆长度 | 装置测量值 | 相对误差 |
|---|---|---|
| 1949 cm | 1948.99 cm | 0.00% |
| 1050 cm | 1049.98 cm | 0.00% |
| 50 cm | 49.96 cm | 0.08% |
| 10 cm | 10.01 cm | 0.10% |
电阻负载测量精度
| 实际电阻值 | 装置测量值 | 相对误差 |
|---|---|---|
| 19.9986 Ω | 19.961 Ω | 0.19% |
| 9.9751 Ω | 9.964 Ω | 0.11% |
电容负载测量精度
| 实际电容值 | 装置测量值 | 相对误差 |
|---|---|---|
| 203.672 pF | 203.15 pF | 0.26% |
| 101.381 pF | 101.54 pF | 0.16% |
从数据看,这套系统在长度、电阻、电容的测量上都达到了很高的精度,完全满足甚至超出了题目要求。
4. 总结与心得
走完整个项目,我的体会是,电赛这类题目不仅考验你对原理的理解,更考验工程实现和误差处理的能力。基于立创天空星开发板的这个方案,有以下几个关键点,算是我的“踩坑”心得:
- 方案选择:对于初学者或希望快速稳定的队伍,强烈推荐方案二(NE555测电容法)。它硬件简单,软件成熟,标定后精度非常可靠。TDR方案虽然直接,但高速电路设计、布局布线、抗干扰要求极高,容易调得怀疑人生。
- 标定是关键:所有测量系统都有系统误差。文中提到的
C_K,C_BIAS,R_K,R_BIAS等参数,务必用自己的硬件和线缆重新标定。用已知标准值多测几个点,做线性拟合,是获得高精度的不二法门。 - 细节决定成败:
- 测量电阻和电容时,一定要记得减去线缆本身的寄生参数(寄生电阻和寄生电容)。
- 使用SMA接头连接负载,能保证接触良好,重复性高,这是获得稳定数据的基础。
- NE555振荡电路的电阻(R1, R2)要选用温漂小、精度高的金属膜电阻。
希望这篇详细的解析能帮你理清思路。无论是为了参赛复现,还是学习精密测量系统的设计方法,这个项目都是一个很好的起点。代码和硬件都已开源,剩下的就是动手实践了。遇到问题,多查数据手册,多调试,你一定能把它搞定。
