前言
25赛季,我们队伍复刻的超级电容控制板(下文简称超电)无法正常使用,现象为电容组无法正常充电,严重影响机器人的场上表现。于是26赛季,我们队伍急需一套稳定性好,性能优良的超电,并且集合25赛季新增、在26赛季增强的无线充电模块。综上,主播带头复刻港科25年超电开源方案。
很遗憾的是,往届负责超电模块的学长并没有传下什么相关技术文档,以及物料也在搬家的过程中遗失。并且主包的硬件理论知识薄弱。毫不夸张的说,主包约等于从0开始复刻超电,这对主包以及队伍都是个不小的挑战。
需要注意的是,超电开源报告里面对软件部分介绍甚少,但想调成功超电需要从软硬件结合解决问题,所以熟悉超电代码部分也是不可或缺的一部分,如果软件基础薄弱的话,请恶补软件知识并学会使用AI工具(学会使用AI熟悉代码对初学者来说是非常便捷的一种方式)。
前提知识科普
电容
我们在小学二年级就学到,电容在充电初始瞬间(两端电压为 0 时)电流最大,近似呈现导通状态,此时主要由等效串联电阻 (ESR) 限制电流;随着充电进行,电容电压逐渐升高,电流迅速减小。用万用表蜂鸣器档测量有大电容滤波的电路时,会出现短暂的蜂鸣声(类似短路现象),这是万用表对电容充电的瞬态过程,属于正常现象
对于电容来说有公式
不难看出电容两端电压其实是由输入电流决定的,上文又提及电容的导通内阻非常小,所以使用稳压源给超级电容充电的现象应该是恒流变压,也就是电压随着输入恒定电流而上升,且上升速率跟输入电流大小有关。补充说明,之所以出现恒流充电,是因为设定了稳压源的输出电流上限,使其进入了恒流工作模式。
电感
电感的核心特性是通直流、阻交流,电流不能突变,本质是楞次定律的体现:电感会产生感应电动势阻碍电流的变化。这一特性是超级电容 Buck/Boost 充放电电路能够正常工作的基础。
在超级电容的 Buck 降压充电电路中,电感是核心储能元件:
开关管导通时,电感储存能量,同时给电容充电
开关管关断时,电感通过续流二极管释放能量,维持充电电流连续
电感量选型不当会导致电流断续,充电效率骤降;电流超过饱和电流时,电感量会急剧下降,失去储能作用,甚至烧毁开关管和电容
PID环路
PID有位置式PID与增量式PID,超电中采用的即为增量式 PID。PID 即对目标值与实际值之差 (称为误差) 进行比例 (P)、积分 (I)、微分 (D) 运算,将运算结果线性组合后输出控制量,通过闭环反馈不断减小误差,最终使实际值稳定跟踪目标值的经典控制算法。是超级电容恒流恒压充电的核心控制逻辑。
电控成员速成部分
作为电控成员,了解超电原理并非必要,需要知道的是超电的构成,超电如何接线,超电通信协议以及蜂鸣器报错现象。如果时间紧急,请阅读超电组成部分和软件部分中的常见问题,特别是蜂鸣器报错对应表,以防后续调试时候误判导致超电损坏或耽误调试进度。当然,时间充足的情况下可以整体阅读代码,可以了解裸机情况下常用的中断处理思路,也可以了解如何将C和C++缝合到一起。
如果发现情况紧急还请联系超电负责人员,让超电负责人员到场检修;文末也会提供超电开源代码(仅供阅读,请勿自行烧录代码,每个超电都有自己对应的采样参数!)
超电接线
请注意超电是有超级电容管理模块连接的,具体接线方式超级电容管理模块说明书里面有提及。需要注意的是有一个4pin插头仅供裁判调试使用,默认禁用。
超电通信协议
超电通信协议
上文是超电的收发通信协议,那么对应控制板的通信协议应该反过来,请注意上文有两版接收结构体,对应的ID也不同。
超电原理讲解:
超电的作用即为动态存储能量,在底盘功率有总限制的情况下,存储小功率场景时的多余能量,补充大功率场景时的所需额外能量。
从超电的功能定位不难看出,其核心功能就是动态切换超级电容的充放电。在RM比赛场景下,裁判系统端,也就是电源输入部分的电压常为24V左右,26赛季制作规范提及超级电容最大电压为28.8V、总能量不得超过2200J。
前提知识科普已经说明电容能量与电压是成正比的,也就是给电容充电过程中电压会上升。所以,控制板需要面对以下两个情况:
电容电压低于裁判端电压
电容电压高于裁判端电压
所以,需要设计BUCK、BOOST、BUCK-BOOST(VA>VB)、BUCK-BOOST(VA<VB)四种模式动态应对上述两个情况。综上,集成上述二者电路集成为四开关Buck-Boost拓扑,在不同模式下控制四个mos管的开关实现升/降压,对电容进行充放电。
关于如何控制电容进行充放电后续会进行详细说明。
功率极部分
可以看出,四开关Buck-Boost拓扑中间部分为电感,上下桥均由mos管构成。左右两侧电容起到高低频滤波作用。需注意,该电路各个元器件参数计算均在港科技术报告里面讲明,这里为技术原理大致讲解,故不赘述。
tips:当初主包抱着文档头铁生啃,也不看港科24年开源文档讲解,结果就是主包看了跟没看一样,幸亏当时gemini老师还是不厌其烦的教导主包,最后主包看懂哩。
上述电路图各元器件与网络标签以下面思维导图形式讲解
想必聪明的读者观看了上面的思维导图,肯定能发现下面几个问题:
既然是要动态切换四开关Buck-Boost拓扑模式,软件要怎么知晓裁判系统电压与电容组电压呢?
软件怎么知晓底盘现在所需功率是否超过当前底盘的最大功率?
如果电容充满了是怎么停止充电的?直接力大砖飞充不进就表明充完了吗
四个mos管是怎么驱动的?是直接通过芯片的定时器引脚驱动吗?
为什么在调试过程中,mos管的发烫会高于其他元件呢?聪明的读者肯定能预言到未来调试的场景,对吧=)
电流/电压采样电路部分
硬件部分
关于问题1、2和3,以下电路可以作为回答
上图为采样电路部分,左边三角形形状的芯片为INA240 电流感应放大器,通过计算两个输入引脚的微小压差来得出当前电路上经过的电流。
仔细观察的你肯定能发现,功率极部分上面的六个网络标签与它们之间夹着的2mR电阻与该芯片一起构成电流采样电路。使用2mR阻值的电阻也很好理解,因该电阻串联在电路上,阻值不能太大,否则会分走大部分电压,同时发热也会严重。
右边的即为基础分压电路,由于上述电压最大值可能到达30V,远超于芯片引脚5V最大耐压,故使用分压电路进行分压。
软件部分
不难发现,软件核心参数即为各个模块的电流/电压,所以后续软件调试肯定要围绕着这几个参数,代码运行有bug也需要先从上述核心参数找起。
栅极驱动部分
回答4、5问题,聪明的读者肯定知道,stm32的供电电压为3.3V,所以引脚输出的最高电压肯定是3.3V,但是想找到一个Vgs低于3.0V的mos管非常困难,且芯片的电流能力不能满足上述工况。为解决芯片驱动能力不足的问题,我们需要了解栅极驱动芯片
https://lxirdjvhnx2.feishu.cn/wiki/Su2Kwe01RiJVRrklNodcoQD1nfh?from=from_copylink
知道栅极驱动芯片作为芯片的“打手”后,芯片只需要输入PWM波,栅极驱动芯片就会放大该信号用于驱动mos管的开关,以实现BUCK、BOOST、BUCK-BOOST(VA>VB)、BUCK-BOOST(VA<VB)四种模式的切换。
同时,需要知道的是,mos管在不断开关过程中是会造成功率损耗的,该损耗会以热能形式消耗,故在调试过程中会发现mos管的发热情况高于其他元器件,且该情况的原因被称为米勒平台,下面为视频详细介绍,在此不多赘述。
【MOS管发热的隐藏元凶!一个视频讲清楚米勒平台。】 https://www.bilibili.com/video/BV1Rj2LBSEq4/?share_source=copy_web&vd_source=55a0cfabb507a7b72ce628971d62c632
峰值电流控制部分
硬件部分(大概?)
终于写到这部分哩,该控制为港科25超电相比于往届开源超电最为特殊的地方,也是主包刚开始看最头晕的地方。
可以讲明,该控制最为核心的地方为下面三个部分:
STM32G4 片内 DAC,用于将采样得到的模拟量转换为信号量
模拟比较器,比较信号量与软件对寄存器设定的值,当前者大于后者时切换输出电平
HRTIM 中的SR锁存器,接收比较器电平,切换输出电平,从而达到控制mos管开关
欸,聪明的读者发现哩,上文栅极驱动电路中讲出,mos管的开关是由栅极驱动芯片驱动的,而栅极驱动芯片接收到的是芯片提供的PWM波,这个PWM不是软件输出的PWM吗?
这里对芯片生成PWM波的途径进行大致区分:
主包刚开始学习定时器时,生成PWM波的途径为:软件设定定时器的自动重装载值(ARR)和比较寄存器(CCR)的值 -- 定时器中的计数器(CNT)会自动计数 -- 通过比较CNT与CCR反转电平 -- 生成PWM波
但在超电中,由软件采样得到电感参数,再处理设定CCR值,再进行控制的环路无法满足硬件瞬时切换的需求。因此,在峰值电流控制下,采用另外一种PWM生成方式。
而在峰值电流控制模式下,利用了STM32G474 DAC的锯齿波生成模式,将软件计算出的目标电感电流转换成带斜坡的参考电压,送给模拟比较器 -- 比较器比较实际电感电流(INA240芯片放大得到)vs DAC 参考阈值,发送比较结果,即高低电平转换给SR锁存器 -- 完成输出PWM波的生成;且该模式下软件设定的占空比仅在特殊事件触发后,强制覆盖输出PWM的占空比,起到保护作用。
生成的PWM再经过上文讲到的栅极驱动芯片放大信号,实现驱动四个mos管的开关,成功实现BUCK、BOOST模式下的mos管控制。
不难发现,峰值电流控制模式下,核心参数即是目标电感电流。根据上文采样电流得到的AB侧电流电压参数与读取裁判系统可以得到的当前底盘功率限制,我们可以得到以下参数
底盘当前所需功率
电容剩余能量
当前底盘功率限制
根据当前功率限制于底盘当前功率的差值,软件可以计算出当前是需要给电容充电还是放电。
软件部分
当然,这么一笔带过超电中的多环竞争,肯定会对读者的理解带来一定的困难,接下来就讲解软件中的多环竞争,梳理出目标电感电流(软件为iLTarget,下文简称为iL)的整体逻辑。
超电软件中使用的是增量式PID,并且在软件中采用多环竞争模式,裁判系统功率环的核心为增量式 PID,其输入为 “裁判系统目标功率/底盘电流” 与 “当前裁判系统端电流”,输出为增量式的电感电流。
实则就是分别计算四个环路的输出,默认采用功率环的输出,当触发电容电压保护、初始上电缓启动保护或者充放电电流过流保护时就采用其他环路的输出。
经过竞争后得到最后设定的iL,然后便是上文提到的将iL赋值给模拟比较器的寄存器中。完成基于峰值电流控制的超级电容充放电整体流程。
原理补充部分:
现在我们讲清楚了超电充放电的整体软硬件运行流程,但肯定好学的读者会发现,我们并没有讲清楚四种模式之间是怎么切换的,以及它们与电容充放电之间有什么关联。
首先先讲清楚四种模式的作用:
BUCK -- DCDC中非常常见的降压,通过控制四开关拓扑的左侧上下桥的mos管的开关,控制电感电流,以实现有效电压值下降的作用。
BOOST -- 同理,控制右侧上下桥的mos管的开关,控制电感电流,实现有效电压值上升的作用。
BUCK-BOOST(VA>VB) -- A侧电压稍高于B侧电压,此时左右了两侧mos管均不断开关,且周期相位相错 180°。B侧上管打开时,使用 B 侧电流对 A 侧半桥进行峰值电流模式控制,同时 B 侧保持固定占空比。 起到有效电压值轻微下降的作用。
BUCK-BOOST(VA<VB) -- 同理,B侧电压稍高于A侧电压,且A侧保持固定占空比,对B侧半桥进行峰值电流模式控制,起到有效电压值轻微下降的作用。
而在高中学习电容时我们就知道,电容两端电压低于电源电压时会充电,电容两端电压高于电源电压时会放电。BUCK模式下非常适合电源给电容充电,此时需要超电放电补充功率看似不可行,但需要知道的是,正向的BUCK相对于反向即为BOOST,此时打开左下管,关闭左上管,电容会给电感充电;再关闭左下mos管,打开左上管,因电感电流不能突变,电流会经过A侧,实现类似于反向升压的流程,完成电容放电。同理BOOST模式下也可以对电容进行充电。
综上,已经讲完超电原理部分的全部哩=),当然,软件部分肯定不只是这些。例如看门狗的配置、CAN外设配置与协议通信都没有提及。但我相信这对聪明的读者来说肯定不在话下。
超电的组成和作用
组成:
超电(总称)由两部分组成,分别是超级电容组和功率控制板。
功率控制板:25年港科方案中将功率控制板分为上下板,上板主要负责采样,通信和信号控制(下文均简称为上板);下板主要负责用于给超级电容组充电的BUCK-BOOST模块和无线充电BUCK模块,属于大功率部分(下文均称为下板)。(这种将功率部分和信号部分分开的设计思路在实际应用中非常常见,希望能认真学习)
超级电容组: 超级电容组顾名思义,有超级电容和超级电容载板。超级电容载板主要由超级电容保护电路和超级电容组成。BW6132芯片在泄放的时候有很小的蜂鸣器响声,且我们测试后发泄放电路上的led灯在泄放过程亮不起来,怀疑是驱动电流不够。
作用:
由于在rm比赛中所有地面单位底盘均有功率限制。超级电容此时充当能量存储装置,在特定功率限制下,把功率需求小的场景下的功率充至超级电容里面,在功率需求大的场景将超级电容里面的能量释放出来。如果直接将超级电容并联至电源上将非常危险,且效率极低。所以需要功率控制板控制超级电容进行充放电。
软件部分
环境配置部分:
需要提前申明的是,在rm比赛中,或者是实际工程中,有很多队伍使用的是clion或者是vscode为载体的一套开源工具链。港科使用的也是这套,对环境配置来说这套工具链相比keil更为复杂,但配好环境后对调试来说更为方便,所以准备环节的繁琐步骤也是很有必要的。
环境配置部分请参考文末湖大跃🦌战队编写的md文档,主包当初也是跟着这个教程配置环境(痛苦回忆)。如果正常成功配置后vscode应该可以build(编译), download-xx(烧录,这里的xx是根据使用的仿真器型号来的), debug(调试)。(这部分请认真仔细搞定,不要偷懒!)
这个文档里面还有很多其他工具使用说明,而且都非常有用,请认真仔细阅读。
此外,主包在这里单独提出makefile文件作用,大致就是告诉编译器工程文件路径以便让编译器进行编译(详细说明在上述文档里面也有)。在超电代码中,有C和C++两部分的编译器申明,所以可以在代码中同时使用C和C++(这个方法主包也没试过,不过看起来挺好用的样子)
代码大体运行流程:
补充:PID可以理解为通过比较输入输出之差来计算下一次输出,也就是输出的AB两侧占空比跟采样得到的AB侧电流电压有关,关于PID详细介绍可以自行去B站上搜索,具体原理图中也有讲述。所以能解释为什么下文VA采样能影响VB电压。
软件常见问题
错误类型 | 声音模式 | 听觉描述 | 恢复方式 |
超级寄了(可能是哪里烧了,请联系超电负责成员) | 5高1低 | "嘀·嘀·嘀·嘀·嘀······嘟————" | 不可恢复 |
裁判系统端或底盘端短路 | 4高1低 | "嘀·嘀·嘀·嘀······嘟————" | 可通过发消息恢复 |
电容端或无线充电端短路 | 4高2低 | "嘀·嘀·嘀·嘀······嘟————嘟————" | 可通过发消息恢复 |
过流保护A | 3高1低 | "嘀·嘀·嘀······嘟————" | 可过段时间自动恢复 |
过流保护B | 3高2低 | "嘀·嘀·嘀······嘟————嘟————" | 可过段时间自动恢复 |
过流保护R | 3高3低 | "嘀·嘀·嘀······嘟————嘟————嘟————" | 可过段时间自动恢复 |
过压保护A | 3高1短低 | "嘀·嘀·嘀······嘟—" | 可过段时间自动恢复 |
过压保护B | 3高2短低 | "嘀·嘀·嘀······嘟— ······嘟—" | 可过段时间自动恢复 |
低电量警告 | 高低交替 | 警告 |
硬件部分
调试思路:
凡是带MCU的控制板,出问题的调试思路都大差不差,可以分为三个板块:
第一个板块:电源,这个部分需要检测供电口正负极是否短路,稳压二极管是否被击穿,以及各个降压模块是否降压正常,如果降压失败就检查是不是降压芯片焊反了,电阻是不是虚焊。
第二个板块:芯片,首先检测芯片引脚是否连锡。如果没有给芯片供电烧录代码,检查代码是否正常运行。如果不可以,检查芯片引脚是否虚焊,检查外部晶振是否正常起振。如果都是正常的则跳到下一个部分
第三个板块:信号,基于代码正常运行的前提,如果出现例如采样有问题,can通信失败的情况,检查各个模块是否正常工作,电压采样有问题就检查分压电阻有没有焊好、采样电压是否真的传到分压电阻这部分。can通信失败就检查can收发芯片是否焊反,供电是否正常
因超电的结构分为上下板,所以主包查找硬件问题的思路是“从下往上”,也就是先找下板的问题,再找上板的问题。例如采样有问题,就先找下板的采样电阻是否出问题了,再找排针排母是否虚焊,再找滤波电容电阻是不是虚焊,再检查电流放大芯片是不是出问题,再检查MCU引脚是不是虚焊。这套流程走完问题也能找到了。
元器件选型:
请注意,港科在做超电迭代的时候元器件选型很多都是有什么用什么,例如贴片排针、防浪涌二极管,像这种非核心元器件可以自行更改。像主包就是偷懒没焊上板上面的LED。
超级电容组载板:载板上面的超级电容保护芯片在嘉立创上面搜索不到,所以我们在淘宝上面选择一家销量较高的店铺购买,测试后也能正常运行。采样电阻正常购买即可。超级电容是在港科推荐的CDA电容代理商那里购买的,联系方式可以从超电负责成员那里获取,也可以直接找港科超级电容组开源作者要(当然还是优先麻烦自家老登)
下板:栅极驱动芯片可以使用UCC27201A,也可以使用平替SLM27211,后者比前者便宜很多,且经过测试后并没有很明显的区别。后者可以去淘宝优信电子店铺购买。采样电阻也是正常购买即可。mos管也是在优信电子购买,不过发现mos管在嘉立创还是优信价格都差不过(都嘎嘎贵).一次性保险丝是从淘宝购买。请注意贴片排针和直插排母都是2mm间距的,不要买错了!。电感是在淘宝上面买的,好像是随便选的一个。
上板:stm32g4芯片依旧淘宝,发现嘉立创比淘宝贵了一倍(之前还在嘉立创上面买的,漏!),电流放大芯片优信电子在优信电子买的两批疑似有差异,可能放大参数差异,导致后买的芯片校准效果没有前面买的效果好。
更新:优信电子前后两批次电流放大芯片精度有所差异,后批次精度更低。具体现象为软件采样校准参数与港科开源参数有着数量级上的差异。
PCB打板:
PCB打板需要Gerber文件,钻孔文件,将二者放到一个压缩包后上传至打板界面(嘉立创,华秋,捷多邦都是这样)3D渲染后可以观察焊盘,走线和板框外壳是否有问题,确认无误后即可打板。
功率控制板是在捷多邦进行的打板,用的是新用户的免费打板卷。因队伍拉到华秋的赞助,有一千块钱的免费打板额度,所以后续改为在华秋电子打板(给的太多了,没办法)。而超级电容载板是在嘉立创上面进行的打板(之前硬件群里白嫖嘉立创免费卷的方法失效哩)
超电注意事项
上文多次提及,超级电容需要进行大功率充放电,而大功率又意味着发热严重,所以超级电容组需要额外注意散热问题。经三十分钟不断充放电测试后发现,超电部分发热异常,原因为电感参数不符,导致功耗损失高于港科技术报告测试数据。但后续想改参数发现电感涨价幅度过高,故暂未更改。
经测试后发现超级电容在完全放电后会自行在大气中充电,保持3.3V左右的电压,所以在日常调试过程中请注意不要触电。
文末杂谈
如果阅读主包多篇文档的读者可以发现,主包几乎会在每篇文档最后写下杂谈(希望有人能看到吧=)。主包之所以写这么多文档,就是因为当初我入队的时候队内没有技术文档传承下来,还记得暑假刘工跟我一起学机器人运动学,学的还没我快嘻嘻,遇到问题都是厚脸皮去群里问或者去问ai,走了很多很多弯路。复刻超电的经历几乎是我大学比赛生涯的缩影,没有学长指导,遇到问题先是自己摸索,没办法了就厚着脸皮去问网友,说实话压力真的蛮大的。一路走来实属不易,主包笨笨的,也很倒霉,接手的比赛都是从零开始,时间紧任务重,有时候也会躲在角落偷偷哭=(,也会羡慕那些打出成绩的强队,会想着明天就跑路不干了。但是啊,哭完主包依旧会拿起烙铁焊线,会去B站上看教学视频,会继续去群里骚扰群友。说实话,要是告诉刚进大学的我,如果选择打比赛要坐这么久的牢,主包肯定会转头回宿舍打游戏。但神奇的是,我居然扛过来了。既然笨笨的绿豆饼都能扛过来,我相信技术力越来越高的读者,你们肯定也能克服数不胜数的困难,走向下一个篇章=)
服了CSDN上不能插入文档,附件文件失效哩
https://lxirdjvhnx2.feishu.cn/wiki/S2kLw1fHQifQWMk60tHcVHTpn2z#share-TohtdzhLpoe31KxJgiuct3wfnGh
https://lxirdjvhnx2.feishu.cn/wiki/S2kLw1fHQifQWMk60tHcVHTpn2z#share-Uwn7dMz9io6aZcxk6KFc2jK5nYb
https://lxirdjvhnx2.feishu.cn/wiki/S2kLw1fHQifQWMk60tHcVHTpn2z#share-XS8LdoncuoSxKWxLmfCc9eMvnCh