ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

电赛H题满分方案:同步Buck数字闭环控制与开源工程复盘

电赛H题满分方案:同步Buck数字闭环控制与开源工程复盘 2026年8月的最后一个晚上我们那套板子封箱的时候示波器上最后一条波形刚好压着指标线电流环的阶跃响应干净得像用尺子画的。四天三夜H题满分完赛省一确认回来之后我把整套电赛H题的工程代码、原理图工程、上位机脚本全部整理了一遍现在已经开源。这篇东西不打鸡血也不写情怀我就想把这道题从需求拆解、方案选型、硬件实现、算法落地到现场调测的完整链路摊开讲一遍讲清楚每一步为什么这么做、哪里差点翻车、哪些坑你现在就可以绕开。如果你是准备明年上场的学生或者带队的年轻老师又或者只是想看看一套真实拿奖的闭环控制系统长什么样这篇应该能给你省下至少两周的试错时间。代码开源的地址和目录结构我会在最后一节说明也会讲清楚怎么把这套框架直接搬到别的电源类、测量类、控制类题目上。1. 选题判断与整体方案怎么定1.1 先把题目拆成一个个能被测量的指标H题这类题目的共性是“看着像电源题实际是测量题本质是控制题”。很多队伍栽跟头不是因为电路做不出来而是从第一天起就没有把题目读成一张指标表。我们拿到题的第一件事是把题干里所有带数字的、带“不大于”“不超过”“误差”的句子全部抄到白纸上然后做三件事分清基本要求和发挥部分、判断哪些指标之间存在耦合、给每个指标留出内部裕量。举个具体的例子题目要求输出电流在0到5A范围内可设定设定精度优于1%读数加10mA。这句话表面上是说精度实际上它同时锁死了三样东西采样链路的分辨率、DAC或者PWM设定值的位数、以及闭环的静差。1%读数在5A满量程对应50mA加上10mA固定误差总共60mA。如果你的采样链路本身噪声峰峰值就有80mA那你再怎么调PID都不可能达标。我们当时做的指标分解表大概是这样指标类别题目给出的门槛我们设定的内部目标裕量的来源电流设定精度1%RD 10mA0.3%RD 3mA慢速24位ADC 两点校准电压测量精度0.5%RD 20mV0.15%RD 5mV分压电阻0.1%配对 单片校准输出纹波不大于50mVpp不大于25mVpp二级LC滤波 开关频率拉高负载调整率不大于1%不大于0.3%电流内环带宽提到2kHz效率不低于85%不低于92%同步整流 低导通电阻MOS保护响应未明确2微秒内关断硬件比较器直接封锁驱动这张表看着朴素但它是整个项目的地基。因为后面每一次方案争论都可以回到这张表上问一句这个改动能帮我哪一项指标如果一项都帮不上那就别做。电赛四天三夜最贵的成本不是元器件是决策时间。注意内部目标不要定成“刚好等于题目门槛”一定要留20%到50%的裕量。原因很现实评委测量的时候用的仪器比你的好环境温度和你调试时也不一样。你现场调出“刚好达标”的东西换个台子就掉出去了。1.2 我们推翻过的三个方案第一个方案是线性稳压。理由很诱人纹波小、噪声低、响应快、电路简单。算一下功耗就清醒了输入24V输出5V电流5A调整管上要烧掉(24-5)×595W。这个热量需要多大的散热器我们实验室那块巴掌大的铝散热片热阻大概2.5摄氏度每瓦95W直接升温237摄氏度管子当场就没了。线性方案在大电流压差场合是没有出路的只在末级小电流的模拟供电上可以保留。第二个方案是单管Buck开环PWM。用一个固定占空比的PWM驱动MOS靠调节占空比来调输出。这个方案做出来能亮但精度完全取决于输入电压的稳定度和负载。输入电压波动1V输出就跟着漂几十毫伏负载调整率一塌糊涂。测了一下5A满载和空载之间输出差了将近400mV直接出局。第三个方案也就是最终采用的是同步Buck加数字闭环再叠一套独立的慢速高精度测量通道。这里的关键设计决策是“快慢分离”控制用的采样链路追求带宽和实时性用12位ADC配合运放追求的是2kHz以上的环路带宽测量和显示用的链路追求精度用24位ΣΔ ADC采样率100SPS左右追求的是0.1%以内的绝对精度。两条链路各干各的事互不干扰。这个思路在电源类和测量类题目里几乎是通用的值得记下来。为什么不干脆用一条高精度高速度的链路因为24位ΣΔ的建立时间决定了它做不了高速闭环而12位ADC的绝对精度又受参考源和温漂限制。硬要用一条链路兼顾最后往往是两边都不达标。分开做硬件成本增加不到二十块钱调试难度反而下降。1.3 系统分层与信号流向整套系统我习惯分成四层来理解这样出问题的时候能快速定位在哪一层。第一层是功率层负责能量的变换和传递包括输入滤波、同步Buck功率级、输出LC滤波、假负载和继电器切换。第二层是采样层包括分流电阻、电流检测放大器、分压网络、仪表放大器、ADC。第三层是控制层也就是主控芯片和它的外设负责PWM生成、ADC触发、闭环运算、保护逻辑。第四层是人机层包括本地屏幕、按键编码器、蜂鸣器以及通过USB虚拟串口连到电脑的上位机波形显示。这四层的划分不是学术上的洁癖而是调试顺序的依据。正确的调试顺序永远是先单独验证功率层能开环工作再单独验证采样层的读数准确再接起来做闭环最后才做人机交互。我见过太多队伍一上电就把所有东西接好结果输出不对完全不知道是驱动没起来、采样不准还是算法写错了一整天就耗在这上面。2. 硬件实现里那些决定成败的细节2.1 主控选型的取舍逻辑主控我们用的是STM32G474。选它的理由有三条而且都是硬需求。第一条是高分辨率定时器。G474内部有一个HRTIM能产生184皮秒分辨率的多路PWM并且支持互补输出和可编程死区。同步Buck最怕的就是上下管直通死区时间给大了效率掉给小了炸管。用普通定时器做200kHz的PWM一个计数周期只有5微秒在170MHz主频下也只有850个计数点死区精度受限。HRTIM把这个问题彻底解决了我们最终设定的死区是80纳秒实测上下管都没有出现直通。第二条是ADC的触发链路。G474支持定时器事件直接触发ADC采样而且采样时刻可以在PWM周期内任意设定。这一点对电流采样极其重要因为我们必须在开关管导通的中点去采电流才能避开开关噪声。如果用软件触发中断延迟抖动能到几百纳秒采到的电流值就是一片噪声。第三条是CORDIC和硬件浮点。PID运算加上前馈和坐标变换在170MHz的M4F上跑20kHz的电流环CPU占用率大概在35%左右还有充足余量做通信和显示。如果换成没有浮点的M0就得全部改成定点运算调参的时候会非常痛苦。顺带说一句TI的C2000系列在电源控制上确实更专业但开发环境上手慢而且我们队伍之前没有积累。选型不能只看纸面参数要看队伍三天之内能不能把它跑起来。这是电赛不是芯片评测。2.2 电流采样链路怎么算才不心虚电流采样是这道题最关键的环节因为几乎所有指标都直接依赖它。我们用的是10毫欧的合金分流电阻配上INA240电流检测放大器增益选20倍。先把量程算清楚最大电流5A分流电阻10毫欧压降是50mV。经过20倍放大输出1V。这个1V要落在ADC的量程内3.3V参考下还有充足余量甚至有点浪费。如果追求极限分辨率可以选增益50倍输出2.5V更贴近满量程。但我们选了20倍理由是要给短路保护留出余量短路瞬间电流可能冲到20A20倍增益下输出4V会被运放的轨到轨特性削顶反而保护了ADC如果是50倍输出会到10V虽然被钳位但运放可能进入异常状态。分流电阻的选择也不是随便挑的。10毫欧的阻值在5A下功耗是0.25W选2512封装、1W额定功率、温度系数25ppm的合金电阻温升控制在20摄氏度以内。这里有个细节容易被忽略分流电阻的走线必须用开尔文接法也就是电压取样点从电阻本体的焊盘内侧引出而不是从电流流过的路径上引出。如果用普通接法PCB走线上那几毫欧的铜阻会直接串进采样结果几十个ppm的误差就这么来了。采样后的滤波网络也值得算一算。我们在INA240输出端加了一级RCR取1kC取1nF截止频率是1/(2π×1000×1e-9)159kHz。这个频率远高于我们需要的2kHz环路带宽同时又能把200kHz的开关噪声衰减约2倍再配合ADC前面的抗混叠效果刚好。RC不能给太大否则相位滞后会吃掉环路的相位裕度。2.3 功率级的参数计算过程同步Buck的几个核心参数我按实际计算过程写一遍你照着换数字就能用。开关频率选200kHz。这个频率是折中频率高电感和电容可以小动态响应快频率低开关损耗小效率高。200kHz下MOS的开关损耗和驱动损耗还在可接受范围电感用22微亨这种常规值就能满足纹波要求。电感量的计算ΔI取满载电流的30%也就是1.5A。在输入24V、输出12V、占空比0.5的条件下L(Vin-Vout)×D/(ΔI×f)(24-12)×0.5/(1.5×200000)20微亨。取标准值22微亨实测纹波电流约1.36A比设计值还小一点安全。输出电容按纹波电压要求算题目要求50mVpp我们内部目标25mVpp。电容的纹波主要由两部分贡献容性纹波ΔVΔI/(8×f×C)ESR纹波ΔVΔI×ESR。如果只靠容性要达到25mV需要C1.5/(8×200000×0.025)375微亨不对单位算错是CΔI/(8×f×ΔV)1.5/(8×200000×0.025)3.75e-5法也就是37.5微法。听起来很小但实际电解电容和陶瓷电容的ESR贡献会远大于这个值。所以我们的做法是两颗220微法低ESR固态电容并联负责中低频再并四颗10微法X7R陶瓷负责高频最后串一级小电感做二级LC滤波把开关频率的残余纹波再压一次。实测满载纹波18mVpp稳稳达标。MOS选的是CSD18540导通电阻典型值2.6毫欧栅极电荷比较小配合UCC27211半桥驱动。上管和下管都用同一颗方便备料。驱动电阻选了4.7欧实测上升沿约25纳秒既压住了振铃又没有让开关损耗失控。2.4 PCB布局上的三条铁律功率级的PCB布局我总结成三条铁律违反任何一条都会在调试阶段让你怀疑人生。第一条功率回路面积最小化。输入电容、上管、下管、地这四点组成的回路里电流在开关瞬间是以几十安培每微秒的速率变化的。这个回路面积每大一平方厘米寄生电感就增加几纳亨振铃幅度就上一个台阶。我们的做法是把两颗输入陶瓷电容直接贴在上下管的漏源极旁边中间不留任何过孔。第二条采样信号走差分并且远离功率节点。分流电阻的电压取样走一对等长等宽的差分线紧贴着走回ADC中间不跨越任何开关节点。同时差分线两侧铺地并打过孔做屏蔽。这一条做好之后电流波形的噪声能直接下降一个数量级。第三条模拟地和功率地单点连接。功率地在输入电容负极附近汇合然后通过一个零欧姆电阻或者一条窄铜皮连到模拟地。绝对不要让功率电流从模拟地上流过否则ADC的参考地会跟着抖精度全毁。实操心得布线完成之后先不要急着打板把功率回路的电流路径用荧光笔在PCB图上画一遍看看有没有绕远路。这个动作花十分钟能省掉一次改板的三天。3. 软件架构与核心算法的落地3.1 用触发链而不是中断链来组织实时任务很多同学写电赛代码的习惯是主循环里放一堆if靠定时器中断打标志位然后在主循环里轮询执行。这套写法在简单的题目上没问题但在需要精确控制采样时刻的电源题上会出大问题因为主循环的执行时间不确定采样时刻会抖动。我们的做法是用硬件触发链HRTIM产生PWMPWM的周期事件触发ADC采样ADC转换完成触发DMA搬运DMA搬运完成中断里执行PID运算并更新比较寄存器。整条链路上没有任何软件判断采样时刻的抖动在纳秒级。这就是所谓的“触发链”思路比中断链可靠得多。任务的时间分配是这样任务频率触发方式执行位置电流环PID20kHzADC转换完成DMA中断电压外环1kHz定时器主循环高精度测量采样100Hz定时器主循环保护检查20kHz与电流环同步DMA中断前半段显示刷新10Hz定时器主循环上位机通信100Hz定时器主循环按键扫描200Hz定时器主循环这个表的价值在于它让你清楚知道哪个任务绝对不能被打断哪个任务晚一百微秒没关系。保护检查放在电流环中断的前半段执行意味着一旦发现过流当个周期就能把PWM封掉响应时间就是一个开关周期5微秒。3.2 PID到底怎么写才能在电源上用教科书上的位置式PID在电源上直接用大概率会出现积分饱和、微分噪声放大、超调严重这三连击。我们用的是一份改过的结构体实现核心改动有四处。第一处微分项加一阶低通。电流采样信号里必然带着开关噪声纯微分会把噪声放大几十倍输出直接抖成锯齿。我们对微分项做了一阶滤波滤波系数取0.1左右既保留了微分的作用又把高频噪声压住了。第二处微分作用在测量值上而不是误差上。这叫“微分先行”。如果微分作用在误差上那么设定值一变化误差瞬间跳变微分项会产生一个巨大的冲击输出直接冲顶。作用在测量值上就没有这个问题设定值改的时候只有比例项跳变过渡平缓得多。第三处条件积分抗饱和。积分项最容易出的问题是输出已经到限幅了误差还在积分继续累积等到误差反向的时候要花很长时间才能把积分“放掉”表现出来就是恢复特别慢。我们的做法是当输出已经限幅且误差方向与积分方向一致时停止积分累加。第四处前馈。这道题的负载是可预期的我们可以把负载电流对应的稳态占空比直接前馈到输出上PID只需要负责修正误差。加了前馈之后负载从1A跳到5A输出电压的下陷从300mV降到80mV恢复时间从5毫秒降到1.2毫秒。前馈的系数可以通过实测确定在目标输出电压下分别测出空载和满载的稳态占空比做线性插值即可。代码大概长这样typedef struct { float kp, ki, kd; float integ; float integ_max; float d_last; float d_filt; float out_min, out_max; float ff_gain, ff_offset; } pid_t; float pid_step(pid_t *p, float sp, float fb, float dt) { float err sp - fb; float p_term p-kp * err; /* 条件积分:输出未饱和时才累加 */ float out_unsat p_term p-integ p-d_filt; if (!((out_unsat p-out_max err 0.0f) || (out_unsat p-out_min err 0.0f))) { p-integ p-ki * err * dt; if (p-integ p-integ_max) p-integ p-integ_max; if (p-integ -p-integ_max) p-integ -p-integ_max; } /* 微分先行 一阶低通 */ float d_raw (p-d_last - fb) / dt; p-d_filt 0.15f * (p-kd * d_raw - p-d_filt); p-d_last fb; /* 前馈 */ float ff p-ff_gain * fb p-ff_offset; float out p_term p-integ p-d_filt ff; if (out p-out_max) out p-out_max; if (out p-out_min) out p-out_min; return out; }调参顺序也有讲究。先把ki和kd归零只调kp加到系统开始等幅振荡记下这个kp记作Ku然后kp取Ku的一半ki从很小开始加观察到恢复时间明显缩短但还没有超调最后轻轻加一点kd压住过冲。整个过程在示波器上看阶跃响应参数改一次看一次波形不要盲调。3.3 高精度测量通道的校准方案慢速通道用的是外部24位ADC采样率100SPS。这条链路决定的是电压电流的绝对精度题目里那些0.5%读数的指标全靠它。校准分两步。第一步是零点校准输入端短接或者不接负载读100次取平均作为零点存进Flash。第二步是增益校准用六位半台式表做基准在量程内取5个点比如0.5A、1A、2A、3.5A、5A分别记录标准值和ADC读数做最小二乘拟合出一条直线斜率和截距存进Flash。开机的时候读出来用。对于要求更高的情况可以做分段线性插值。因为分流电阻本身有温漂运放的失调也有非线性两点校准在中间段可能会有偏差。分五段做线性插值实测在全量程内误差能压到0.05%以内。/* 五点分段线性校准 */ static const float cal_raw[5] { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }; /* 出厂实测 */ static const float cal_std[5] { 0.5f, 1.0f, 2.0f, 3.5f, 5.0f }; float cal_current(float raw) { int i; if (raw cal_raw[0]) return cal_std[0] * raw / cal_raw[0]; for (i 1; i 5; i) { if (raw cal_raw[i]) { float k (raw - cal_raw[i-1]) / (cal_raw[i] - cal_raw[i-1]); return cal_std[i-1] k * (cal_std[i] - cal_std[i-1]); } } return cal_std[4]; }温漂补偿也不能忽略。我们在分流电阻旁边贴了一颗数字温度传感器每隔一秒读一次温度根据电阻的温度系数做一阶修正。实测在20到50摄氏度范围内不补偿的时候读数会漂0.8%补偿之后降到0.15%以内。这个动作的成本不到五块钱但能救回0.6个百分点的精度。3.4 通信帧设计与上位机本地显示只能看瞬时值要观察动态过程必须靠上位机。我们用的是USB虚拟串口波特率虽然名义上是12M但为了兼容性设成115200也能跑。协议很简单自定义帧头加长度加命令加数据加校验0xAA 0x55 | LEN | CMD | PAYLOAD... | CRC16_H | CRC16_LCRC16用常见的CCITT多项式0x1021初值0xFFFF。这么做的好处是现场电磁环境差串口受到干扰的时候校验能直接把坏帧丢掉不会让上位机画出错误的波形。上位机用Python写的PyQtGraph画波形100Hz刷新率下CPU占用很低。脚本里做了自动量程和数据保存赛后复盘的时候可以直接把当时的数据翻出来看。这套上位机代码也一起开源了改改协议就能用。4. 从点到面实际调测过程复盘4.1 上电顺序与第一次点亮上电顺序这件事说起来简单但我们第一块板子就是在这里炸的。当时的顺序是先给主控上电再给驱动上电最后给功率级上电。结果功率级上电的瞬间主控的PWM输出脚还处于浮空状态驱动芯片的输入端被干扰拉高上下管同时导通一声脆响两颗MOS和驱动芯片一起归天。正确的顺序是功率级上电之前先确保主控已经复位并且PWM输出被硬件拉低。我们的做法是在驱动芯片的输入端加下拉电阻同时在固件里把PWM引脚配置为输出低电平之后再使能。调试阶段用一个带限流的直流电源给功率级供电限流设在200mA即使有直通也不会炸管只会听到电源进入恒流模式的嗡嗡声。第一次点亮的目标不是让输出达标而是让输出“能出来”。我们先用固定占空比30%驱动输入12V理论上输出3.6V实测3.55V说明功率级和驱动都正常。然后上电测试采样通道用外部电源灌入1A电流看ADC读数是否对应误差在2%以内说明采样链路通了。这两步都过了才开始接闭环。4.2 指标冲刺阶段的优先级四天三夜里第三天通常是提升指标的关键期。这个阶段的优先级怎么排直接决定最终成绩。我的建议顺序是先保精度再保响应最后保纹波。理由是这样的。精度类指标是硬指标达不到就是不达标扣分最狠。响应类指标通常有多个档次达到第一档就有分往上提升难度大但收益也大。纹波类指标一般要求不高而且靠硬件滤波就能解决不太依赖调试。所以把时间花在精度上是性价比最高的。我们在第三天上午用了三个小时专门做校准。校准之前电流读数的误差在1.2%左右勉强不达标。做了零点和增益校准之后降到0.15%然后加温度补偿在整机跑热之后复测还是0.2%以内。这三个小时换来的是稳稳的满分项。下午做响应。把负载切换用一个MOS加电阻组成的电子开关来做切换时间控制在1微秒以内用示波器抓输出电压的跌落和恢复。第一版参数下5A阶跃的跌落是420mV恢复3.8毫秒。加了前馈之后降到85mV和1.1毫秒。这个过程我改了大概十五版参数每一版都截图存档最后挑出最好的一组。4.3 四天三夜的时间分配很多人以为电赛是拼谁更熬夜其实拼的是时间分配。我们这届的实际分配大概是这样时间段主要工作关键产出第一天上午读题、指标分解、方案讨论指标表、方案确定第一天下午原理图设计、元器件领用原理图定稿第一天晚上PCB布局布线投板文件第二天上午制板、焊接、单元电路验证功率级可开环工作第二天下午采样链路验证、通信打通数据链路通第二天晚上闭环首次运行输出稳定可控第三天上午精度校准、温补精度指标达标第三天下午响应优化、保护验证响应与保护达标第三天晚上整机联调、边界测试全指标通过第四天上午撰写报告、封箱报告完成第四天下午现场测试与答辩交付注意看制板和焊接占了整整半天这是必须提前预留的。如果第一天晚上布完线当天不能制板第二天上午就得空等后面的节奏全乱。我们提前联系好了校内的制板渠道当天晚上送过去第二天早上拿到。这个资源一定要在赛前确认好。注意事项报告千万不要留到最后一天才写。我们的做法是每完成一个模块就补一节报告数据和截图当场记录。最后一天上午只是把散落的章节串起来排版两个小时就能搞定。我见过太多队伍第四天凌晨还在赶报告测试反而没时间做。5. 常见问题与排查速查调试过程中的问题我整理成一张表基本覆盖了这类题目90%的故障。现象最可能的原因排查动作处理方式上电瞬间炸管死区不足或驱动输入浮空示波器看上下管栅极波形测死区增加死区到80ns以上输入加下拉输出纹波远超标输入电容不足或布局回路大用短地线探头测输入电容两端补陶瓷电容缩短功率回路电流读数有规律跳变采样时刻落在开关沿上调整ADC触发相位移到PWM周期中点采样电流读数缓慢漂移分流电阻温漂或运放失调用手摸电阻看读数变化加温度补偿换低失调运放闭环后输出振荡环路带宽过高或相位裕度不足看阶跃响应是否等幅振荡降kp加微分低通负载切换时恢复慢没有前馈或积分饱和看恢复段是否有长尾加前馈改条件积分满载效率偏低同步整流未开启或死区过大测下管导通期间的压降检查驱动时序优化死区上位机波形跳帧串口干扰或校验失败率高统计丢帧比例缩短线缆加磁环降波特率屏幕显示闪烁显示刷新占用主循环太久测量主循环单次耗时改为DMA刷屏或降刷新率长时间运行后精度下降温升导致基准漂移热机一小时后复测换低温漂基准加温补这张表建议打印出来贴在工位上。电赛现场最怕的不是遇到问题而是遇到问题之后不知道从哪下手两个人对着板子干瞪眼一小时就过去了。还有几个容易被忽略的坑我单独说。第一个坑是示波器探头的地线。用普通的长地线夹去测开关波形看到的振铃有一大半是探头环路感应来的不是电路本身的。测功率级波形一定要用短地线弹簧或者干脆用差分探头。这个细节能让你少改三版电路。第二个坑是杜邦线。调试阶段为了方便很多人用杜邦线连接模块。杜邦线的接触电阻在几十毫欧量级对大电流路径是致命的而且插拔几次之后接触会变差故障时有时无。我们从第二天开始就把关键路径全部改成焊接线问题一下子少了一半。第三个坑是电源的共地。调试台上往往有好几台电源如果它们的输出地没有共在一起示波器看到的地电位差可能有几十毫伏会让你误判电路有问题。上电之前先用万用表量一遍所有地是否等电位。第四个坑是代码版本管理。四天三夜改代码上千次如果没有版本管理某次改动把好的参数覆盖了你根本回不去。我们的做法是在U盘上建一个目录每次确认一版稳定参数就复制一份并加时间戳。这个习惯救过我们一次第三天晚上改前馈参数时把PID参数一起改了振荡得厉害直接从备份恢复五分钟解决问题。第五个坑是边界测试。指标都在额定条件下测但评委会测边界。比如输出电压设到最低、电流设到最大、输入电压拉到上下限这些组合都要提前测一遍。我们在第三天晚上专门做了一轮边界组合测试发现输入电压降到18V时最大输出电流只能到4.3A。原因是占空比接近极限驱动自举电容的充电时间不够。解决办法是把自举电容从100nF加大到1微法问题解决。如果这个测试放到现场才发现那就没法补救了。6. 代码开源与工程复用指南6.1 仓库结构和模块划分代码已经全部开源目录结构是这样的esc2026-h/ ├── firmware/ │ ├── Core/ │ │ ├── main.c 主循环与任务调度 │ │ ├── pid.c PID与前馈实现 │ │ └── calib.c 分段校准与温补 │ ├── Drivers/ │ │ ├── hrtim_pwm.c 互补PWM与死区配置 │ │ ├── adc_fast.c 高速采样链 │ │ ├── adc_slow.c 24位慢速测量 │ │ └── uart_proto.c 通信协议与CRC │ └── App/ │ ├── protect.c 硬件与软件双重保护 │ └── ui.c 按键与显示 ├── hardware/ │ ├── schematic.pdf 原理图 │ └── bom.csv 物料清单与替代型号 ├── host/ │ └── monitor.py 上位机波形工具 └── docs/ ├── tuning.md 调参记录 └── pitfalls.md 踩坑清单这个结构的核心思想是把驱动层、算法层、应用层分开。换一颗主控芯片的时候只需要改Drivers目录算法和应用层几乎不用动。这个划分方式其实是被逼出来的因为我们赛前准备的是另一颗芯片赛题下来之后发现资源不够临时换到G474只花了一个晚上就把驱动层替换完了。6.2 把这套框架移植到别的题目这套东西的复用价值不在于具体某一行代码而在于几个可以整体搬走的模块。第一个可以搬的是采样触发链。任何需要在固定相位采样的场合包括逆变、电机控制、功率因数校正这套“定时器触发ADC加DMA搬运加中断运算”的结构都能直接用。你只需要改一下触发源和采样通道数量。第二个可以搬的是校准模块。分段线性加温度补偿这个组合适用于所有需要绝对精度的测量场景不管是电压、电流、温度还是压力。你只要换掉传感器和量程表就行。第三个可以搬的是通信协议。帧头、长度、命令、载荷、CRC这个结构几乎可以用在任何需要可靠串口通信的项目上。上位机脚本里的解帧和画图部分改一下字段定义就能复用。第四个可以搬的是保护逻辑。硬件比较器直接封锁驱动加软件判断双重保护这个思路是所有功率变换项目的标配。硬件保护负责快软件保护负责灵活和记录故障原因。移植的时候有几个地方必须重新算不能直接抄参数开关频率相关的电感电容值、采样链路的增益和量程、PID的三个参数、死区时间。前三个取决于你的功率等级死区时间取决于你选的MOS和驱动芯片换型号就得重新测。6.3 开源这件事本身的一些经验最后聊聊开源本身。把代码放出去之前我们做了几件事我觉得值得说一下。第一件是清理敏感信息。队名、学校、学号这些当然要去掉但更重要的是把硬编码的绝对路径、临时用的调试宏、写死的测试参数清理干净。我们当时有个宏把保护阈值临时改成了9.9A差点就这么放出去了检查的时候发现的。第二件是补文档。代码能跑和代码能被别人跑起来中间差着一份能读的README。README里至少要说清楚用什么工具链、怎么编译、硬件需要哪些模块、上电顺序是什么、第一次运行应该看到什么现象。我们那份README改了四稿最后是让一个没参与项目的同学照着走一遍流程他卡在哪我们就补哪。第三件是标明依赖和许可。用到的第三方库、开源的实时操作系统、上位机用的图形库都要写清楚版本和许可。这部分不是形式主义是让后面用的人不会踩法务上的坑。第四件是留下调试记录。我们把调参过程中的截图和数据都放进了docs目录包括那些失败的参数组合。这部分其实比最终代码更有价值因为别人能看到你是怎么一步步逼近答案的而不是只看到一个“正确答案”。我个人在实际操作中的体会是电赛这类题目到了最后拼的其实不是谁的技术更炫而是谁的基本功更扎实、谁的流程更规范、谁在压力下还能保持清醒。指标分解表、调试顺序、参数备份、边界测试这些东西听起来都不高级但它们决定了你能不能把已经会的东西稳定地发挥出来。那套板子现在还在实验室的柜子里偶尔有学弟学妹拿出来跑一遍看到波形还是那么干净心里挺踏实的。
返回列表