简介一份针对2019年Ti杯电子设计竞赛D题的备赛压缩包面向参赛学生与指导教师内容涵盖题目说明、技术规范、背景资料、样例代码与数据集等用于快速进入赛题研究。包内文件总数及类型明细暂未提供压缩包整体大小为54.39MB已有320人浏览学习。从根目录命名来看很可能包含源代码、电路设计、文档、测试数据等模块便于按项目结构查阅结合D题常见考点可帮助参赛者系统性复习电子设计基础、嵌入式系统微控制器编程/RTOS、模拟与数字电路、ADC/DAC转换、FPGA/CPLD应用、UART/SPI/I2C等通信协议以及数据分析与算法设计。资源还从项目管理、版本控制、团队协作角度给出备赛参考适合在方案设计、代码调试和作品演示各阶段用于对照自查与查漏补缺是一份较完整且实用的电赛D题资料集合。 每年电赛结束网上都会冒出一批以“年份题号电赛”命名的压缩包“2019年Ti杯电赛D题.zip”就是其中被翻得比较多的一个。这个压缩包我以前也下载过里面通常就是赛题PDF、几篇获奖论文和一份不清不楚的工程源码从资料到能跑通的方案之间还隔着大量电路调试、软件标定的活儿。2019年这道D题我记得全称是“纸张计数显示装置”两块金属极板中间塞进一叠纸装置要在几秒内报出纸张数量。听起来是个挺朴素的工具但真做起来光是“读数漂移”和“压不紧”这两件事就够人喝一壶。这篇博文把我复现D题的过程完整写下来从题目拆解、方案选型、硬件机械到软件标定和踩坑记录给正在翻资料包或者准备电赛的人一个可以直接参考的路线。1. D题考的是什么纸张计数显示装置赛题拆解1.1 任务指标回顾2019年Ti杯电赛D题全称是“纸张计数显示装置”。题目给的核心任务可以概括成三件事两片平行极板组成电容传感器一叠标准打印纸放入极板之间装置自动完成计数并显示结果。基本要求我记得大约是对10张以内的纸张计数误差不能超过±1张发挥部分要求把量程扩展到20张同时对整个装置的响应时间、显示稳定性提出更高要求。赛题还特别强调要用TI芯片这也是Ti杯电赛一贯的风格。题干看起来很简单不少人第一反应是“用红外对管数纸张边缘”但题目明确规定必须使用两块金属极板构成电容式传感器用“电容法”来检测纸张数量。这意味着整个方案的物理基础是明确的纸张数量的变化会引起两极板之间介电常数或极板间距的变化从而改变电容值测量电容值就可以反推张数。1.2 真正的难点微弱电容变化与重复性很多队伍在方案阶段没有意识到这道题的难点不在单片机也不在显示而在前端电容检测的灵敏度和稳定性。我做一个粗略的数量级估算。假设极板面积是100平方厘米极板间距约1毫米纯粹按空气介质计算电容大约是88.5皮法。往极板之间塞入一张纸如果结构是极板间距被纸顶开那么间距可能从1毫米变成0.9毫米电容会往100皮法左右走如果结构是间距固定、只改变介质一张纸带来的等效介电常数变化可能小到零点几皮法甚至更小。换句话说传感器输出的变化量可能只有整个电容值的1%甚至0.1%普通万用表的电容档根本分辨不出来。而且这题真正残酷的地方在于重复性。电容检测本身做到皮法甚至飞法级别不难难的是每次放纸、取纸、再放纸读数是否还能稳定落在同一个档位。手部靠近、引线弯曲、极板压紧力度、环境湿度任何一个因素都会叠加到读数上。所以做题的思路不能停留在“原理图能跑通”而是要在硬件结构和软件算法两层同时做工作才可能让最终判定稳定。2. 方案选型为什么FDC2214成了当年最优解2.1 自力更生测电容的三条老路在决定用FDC2214之前我先把经典的电容测量方案过了一遍。第一种是电桥法用电容电桥平衡来测精度高但需要精密正弦信号源、检波电路和大量调平衡操作放在四天三夜的赛程里很不现实。第二种是RC充放电法通过测量充电时间来算电容电路简单但对小电容分辨力差几十皮法量级还能玩想分辨其中零点几皮法的变化就吃力了。第三种是LC谐振法外接固定电感与待测电容构成并联谐振回路测量谐振频率变化再由公式反推电容值这个思路本身可行但需要自己搭振荡器、整形电路和频率测量PCB寄生电容和温度漂移会把精度毁得很快。当然还有更直接的思路用高精度电容表芯片比如AD7745它也能测几十皮法到几皮法的变化。不过在Ti杯现场FDC2214几乎是默认答案TI自家的高集成度电容数字转换器支持四通道内部集成了LC谐振激励和数字频率测量用户只需要外接一个固定电感把待测电容并到LC回路里通过IIC就可以读出与电容相关的数据。省掉了大量模拟前端设计让参赛队伍把精力集中在电极结构和算法上。2.2 FDC2214如何把电容变成数字FDC2214的原理值得稍微展开讲一下。它并不是直接对电容做ADC采样而是让外部电感和传感器电容组成LC并联谐振回路芯片内部输出一个射频激励信号测量回路当前的谐振频率。谐振频率与电感和电容的关系是f等于2π乘以根号下LC的倒数。当纸张进入极板导致电容变化谐振频率就会发生偏移芯片内部通过参考频率对这些偏移做高分辨率计数最终在寄存器里给出一个与频率相关的大数把这个数代回公式就能反推出电容。这里面有个很关键的工程技巧到最后判断纸张张数时通常不需要真的把寄存器数值换算成“多少皮法”直接用寄存器原始读数建立标定表反而更稳。因为任何换算都会引入电感L精度、参考时钟误差等额外不确定性而原始读数本身已经包含了所有这些因素的一致性。只要标定环境和实际测量环境一致原始读数的分段区间才是真正可靠的判定依据。2.3 系统架构与器件选型清单我的系统架构是这样的STM32F103C8T6作为主控通过IIC读取FDC2214采样数据传感器极板用两条铜箔直线引出接到FDC2214的INxA和INxB端口再在端口之间并联一个固定电感OLED屏显示结果加上按键触发一次测量。整个系统用3.3V供电FDC2214的LC回路供电单独用一个小LDO避免主控数字噪声窜进去。主要器件清单大致如下主控STM32F103C8T6最小系统板电容检测FDC2214模块LC回路电感10μH到100μH贴片电感实际取33μH时读数范围比较舒服极板两片覆铜板或铝板5厘米乘10厘米显示0.96寸OLED或LCD1602机械结构亚克力板、导轨、限位旋钮、弹簧这个组合的优势是采购容易、例程多、调试资料丰富。网上大量FDC2214的驱动代码可以直接移植省去了从头看数据手册的麻烦。但我还是建议自己把寄存器配置过一遍因为直接抄的驱动往往针对特定硬件通道号、转换时间、RCOUNT这些参数都要按自己的极板大小和读数速度重调。3. 硬件与机械决定读数稳不稳的隐藏因素3.1 极板设计面积、间距、引线很多参赛队在软件上花了很多心思最后发现读数不稳的根子在极板。极板面积太小时边缘效应相对占比过大纸张放的位置稍微偏一点读数就明显不同面积太大时基础电容变大对微小变化的敏感度反而下降。我实测下来5厘米乘10厘米左右的矩形极板对A4纸张计数比较合适既能保证纸张覆盖大部分面积又不会让边缘效应失控。间距方面如果采用“纸张顶开极板”的结构极板原始间距要留够最好能容纳20张纸的厚度加一点余量。普通打印纸单张厚度大约0.1毫米20张大概2毫米所以我用亚克力做了一个限位槽极板原始间隙约3毫米纸张放进去后由限位旋钮把上极板压到固定位置。这里的关键是“压到固定位置”而不是“用多大劲压”因为每次压紧力不同会直接改变极板间距给读数引入无法用滤波消除的系统偏差。引线是另一个容易被忽略的地方。从极板到FDC2214的引线只要动一下寄生电感电容就会变读数跟着就飘。我试过用普通杜邦线连接手一碰线读数能跳几十个数。后来改成直接焊接、尽量缩短走线再用双绞屏蔽线引出屏蔽层单端接地情况才稳定下来。3.2 屏蔽与寄生电容FDC2214测的是LC回路谐振频率而传感器电容本身很小任何靠近极板的导体都会通过寄生电容改变谐振条件。最典型的场景是手悬在极板上方十几厘米处读数就开始缓慢漂移人站近一点读数也会跳。这是因为人体和大地之间存在电容人靠近极板相当于在传感器上并联了一个小电容。解决办法有两层。第一层是结构屏蔽用接地金属罩把极板罩起来只留一个放纸的开口人体和外界干扰被金属罩挡住不会直接耦合到极板。第二层是引线屏蔽极板引线用同轴电缆或双绞屏蔽线屏蔽层在FDC2214端单点接地避免屏蔽层形成环路电流。需要注意的是屏蔽罩本身也会给极板增加一个固定寄生电容这没关系只要这个寄生电容不变它只是让基数值变大不影响张数之间的差值。3.3 压紧结构一致性比精度更重要我最早做的一版压紧结构用的是弹簧加手柄按下手柄后弹簧把上极板压向纸堆。看起来很方便但实际用起来读数重复性很差同一叠纸放进去压三次能读出三个不同的区间值因为弹簧压紧力很难做到每次完全一致纸张的压缩程度和极板间距就在变。后来我把结构改成限位式的。下极板固定上极板通过两根光轴导轨上下滑动测量时放好纸旋动一个带限位挡块的旋钮把上极板压到底让极板间距完全由纸堆厚度和下方垫块高度决定。这样每次压紧后的间距是确定的读数重复性明显改善。为了配合这个结构我在程序里加了“压紧到位后才开始采样”的逻辑用一个微动开关检测极板是否到位避免人在没压好时就按键触发测量。这个改动让我意识到这道题的硬件设计核心不是“电路原理有多高级”而是“机械结构能不能保证每次测量条件一致”。很多队伍最后死在数据不稳定上其实不是芯片不行而是极板压紧机构太随意。4. 软件与算法从原始读数到“数得准”4.1 FDC2214寄存器配置与读取FDC2214的使用步骤不复杂但寄存器配置直接影响数据质量。我需要配置的核心寄存器包括MUX_CONFIG选择通道和内部或外部时钟源SETTLECOUNT设置每次转换前的稳定时间RCOUNT设置转换采样点数CLOCK_DIVIDERS设置参考频率分频。这几个参数相互影响RCOUNT越大等效于采样越多分辨率越高但转换时间也越长SETTLECOUNT太短则激励还没稳定就采样读数噪声大。我最终用的配置大致是开启CH0通道、SETTLECOUNT等于200、RCOUNT取0x1FFF、参考时钟不分频每次采样转换大概几十毫秒。对这道题来说几秒内显示结果完全够用所以把转换时间调长一点换稳定性是划算的。下面是一段简化后的读取流程uint32_t FDC2214_ReadChannel(uint8_t ch) { uint8_t buf[4]; uint32_t raw 0; // 等待通道数据就绪 while ((FDC2214_ReadReg(0x18) (1 ch)) 0); // 读取32位数据寄存器DATA_CH0 地址为 0x00 FDC2214_ReadRegs(0x00 ch * 2, buf, 4); raw ((uint32_t)buf[0] 24) | ((uint32_t)buf[1] 16) | ((uint32_t)buf[2] 8) | buf[3]; return raw; }这段代码的关键是先查状态寄存器的转换完成标志再读数据寄存器否则可能读到上一次的旧值。读回来的32位数据不是直接用低16位或高16位而是需要根据CLOCK_DIVIDERS配置组合出完整的频率计数值驱动源码里通常会有对应的换算宏。4.2 滤波与标定表原始读数虽然单调性很好但逐次采样还是有随机波动。我的处理是每张纸连续采20次去掉一个最大值和一个最小值再取平均值作为一次测量的代表值。这比简单平均抗尖峰能力强很多而且代码量很小。标定阶段程序进入标定模式从0张到20张每种张数测量若干次把均值存进一个数组。比如calibration[0]保存0张时的平均读数calibration[1]保存1张时的平均读数。为了减少偶然误差每种张数我重复测10次取中位数而不是平均数因为中位数对个别异常值更鲁棒。标定表建好之后实际测量时只需要在标定表里找一个最接近的区间。这里要特别强调不要试图用C等于1除以L乘2πf的平方去算绝对电容然后判断张数。我试过这条路计算结果受电感L的标称值误差影响很大同一个L用万用表量出来参考值算出来的电容整体偏大或偏小但张数之间的差值仍然稳定。与其纠结绝对电容不如直接用原始读数的相对位置。4.3 阈值判断与滞回设计有了标定表判定逻辑很简单。假设读数x落在calibration[k]和calibration[k1]之间那么取与两边距离更近的那个作为判定结果。等价于用相邻标定值的均值作为阈值threshold[k]等于calibration[k]和calibration[k1]的平均值读数小于threshold[k]判为k张大于threshold[k]判为k1张。但直接这样做有个问题阈值附近的读数抖动会导致显示数字反复跳。比如一张纸的读数偶尔越过threshold[1]显示就会在“1张”和“2张”之间来回闪。我的做法是加滞回只有读数连续多次越过阈值并且越过量超过一个设定的死区才切换判定结果。死区取相邻标定值差值的10%到15%比较合适太小没作用太大则延迟响应。标定表的维护也是一个容易忽略的点。纸张一旦受潮或者气温变化大整条标定曲线会整体平移但如果只平移不改变斜率相邻阈值之间的差值基本不变。所以比赛现场我准备了一个“现场快速标定”功能赛前放0张和10张纸各采一次把整条标定曲线按比例平移就能快速修正环境变化不用把20种张数全部重新测一遍。这个小功能在评测前非常救命。5. 实测复盘读数漂到怀疑人生的几个真凶5.1 手靠近极板导致的寄生电容我在调试阶段遇到过一件很诡异的事极板里什么都没放显示却是“3张”。排查半天才发现是我的手放在了极板上方准备取纸手一靠近读数就开始往上走。撤走手读数回到0张区间。这个现象其实在原理里已经解释过了人体与大地之间的耦合电容会并联到传感器上。这个问题困扰了我一个晚上后来用接地金属屏蔽罩把极板三面围住只留正面放纸的开口读数才稳定下来。金属罩本身给传感器并联了一个固定的几十皮法寄生电容但它不会波动反而把外界干扰挡在了外面。需要注意金属罩不能完全封闭否则放纸操作不方便而且完全封闭会让极板与罩壳构成一个附加的平行板电容读数基础值过大。5.2 湿度与纸张含水率如果说手靠近极板是一次性发现的明显问题湿度则是那种“时好时坏、最让人头疼”的隐性杀手。同一叠纸放在空调房里测一个读数放到窗边晒了一天再测又是另一个读数差出来能有一张甚至更多的量级。纸张的介电常数和含水率强相关空气湿度大时纸吸潮介电常数上升整个标定曲线就偏移了。比赛现场没法控制评测环境的湿度所以我做了两件事。第一测量的核心依据从“绝对读数”改成“放纸前后读数的差值”。空气湿度、温度对极板基电容的影响是共模的但放入纸张后多出来的那部分电容变化量对湿度的敏感度要低得多。第二准备一个现场标定模式测评前用一叠确定张数的纸快速校准一下当前环境把阈值曲线平移到位。这个方法不能保证做到实验室级别的精度但能让装置在几种典型环境下来回搬动时误差明显缩小。5.3 从“偶尔对”到“稳定对”的调试记录把整个调试过程的数据放在一起看其实能发现不少规律。最开始裸奔状态0张和1张的读数区间有重叠偶尔判错加上屏蔽罩之后0到10张的读数间隔拉开重叠消失基本能稳定判对加上限位压紧结构和“压紧到位再采样”逻辑后同一叠纸反复测20次的结果全部一致。这说明每个环节解决的是不同层面的问题屏蔽解决干扰机械解决重复性软件标定解决非线性三者缺一不可。调试过程中我也记录了部分实测读数作为判定参考大致趋势是单调递减的下面这组数据只反映相对关系不同硬件具体数值会不一样张数平均计数值相邻差值08846-7718769-7128698-6938629-7248557-7058487-71可以看到相邻差值基本在70左右远大于滤波后的噪声所以阈值判断有充足的裕量。如果某个区间差值掉到噪声量级那就要回头检查极板结构是不是压紧不一致或者引线屏蔽没做好。6. 拿到“2019年Ti杯电赛D题.zip”之后该做什么6.1 资料包里真正值钱的部分聊回到这个zip压缩包。网上下载的电赛资料包质量参差不齐我见过最差的只有一个赛题PDF稍微好一点的会有获奖论文和技术报告个别压缩包还带了完整的工程源码和原理图。真正值钱的东西不是赛题PDF而是那几份“技术报告”里关于极板尺寸、结构设计、标定方法、异常处理的经验内容。但我要提醒一句技术报告里的原理图、PCB和源码都只能当参考不能直接拿去用。获奖报告往往有美化成分很多关键参数被略写直接照抄的工程常常针对特定开发板寄存器配置和引脚定义都不一样。我的习惯是先把赛题指标抄下来对照技术报告看他们解决了哪些难点然后用自己熟悉的平台从头实现一遍这样出了问题才能定位。6.2 我的复盘节奏先复现指标再谈优化如果你现在手头就是这样一个压缩包我给一个具体的复盘顺序。第一步打开赛题PDF把硬性指标用红笔标出来包括量程、误差、响应时间这些是评判成败的唯一标准。第二步通读技术报告重点记下他们用的传感器原理、关键器件型号、机械结构示意图暂时不用管具体数值。第三步按顺序先搭硬件环境、跑通FDC2214读取再设计极板和压紧结构然后做标定和阈值判断最后在评测条件下反复测重复性把所有读数记下来看有没有区间重叠。这个过程太顺的时候反而要警惕。我第一次复现时就觉得很简单结果在评测前发现手靠近干扰还没解决临时加屏蔽结构忙到最后一晚。电赛这种短周期高密度任务最值得投入时间的地方就是“稳定性”而不是多跑通一个花哨功能。先把基准跑稳再考虑OLED动画、蓝牙传输这些加分项这个顺序能省掉大量返工。按这个节奏一个基础完整的方案两个人一两天就能落地剩下时间全用来做压力测试和环境对抗。我个人的经验是把同一叠纸反复测几十次、把机器搬到不同空间再测、故意让手在极板附近晃这些“刁难测试”暴露出来的问题远比多看几份报告值钱。本文还有配套的精品资源点击获取
