跳至内容
RM2023超级电容模组

RM2023超级电容模组

⚠️ 此拓扑可以用于参考,不建议完全照抄。在制作此开源项目的时候,请确保您已经学过相关基础知识。

我对下一届的培训也是从基础开始,没有一开始就让他们着手制作此项目。

写在前面

本超级电容模块,电容组采用的是学长以前制作留下来的电容组,超级电容控制板的拓扑结构,以及代码框架均由学长的老版本重构而来,由于能力有限,本版本的超级电容模块仍有诸多不正确,不合理的地方,还请多多包涵。

这个版本的超级电容模块仅仅只只是能用的程度。在超级对抗赛中的表现为,血量优先的情况下,开启超级电容能拥有功率优先的性能,也就是超级电容模块差不多只提供了70W的功率。其中一部分原因是超级电容组久经沙场,大限将至,放电能力以及容量远不如额定值;还有一部分原因可能是超级电容控制板的原因,由于测试过程中,没有低压大功率(<15V,>100w)的电源,也不使用超级电容组作为测试电源(一是为了测试安全,二是减少超级电容组的循环,减少损耗)。

硬件电路

超级电容组

⚠️ 不要以此超级电容组的单体容量和串联数量作为参考,这个早期的作品并不合理。

超级电容组由AD进行绘制。超级电容组采用BW6101进行被动均衡充电,并且有一个用于整体过压保护的电路。

超级电容组原理图

超级电容控制板

早期学长的超级电容控制板也是由AD进行绘制,此版本经由我手,所以变成了Kicad。

主控部分电路

平平无奇的F334主控和MAX3051 CAN收发器。

主控原理图

辅助电路

24V降12V的栅极驱动供电使用RT7272,这是一个3A带限流保护的DCDC。由于选型的时候并不知道栅极驱动的电流、功耗如何计算,所以就照着栅极驱动的推拉电流找了一个。实际找个0.5A的就足够包括后级12V降5V的其他电路供电了。12降5V实际降到了4V,减少LDO的损耗。

⚠️ RY8310的R12和R14阻值反了,请自行调换(换文件太麻烦了,懒了)。

辅助电源

功率部分电路

超级电容控制板的主拓扑是一个半桥的“双向”DCDC,正向降压对电容充电,反向升压电容放电,这就是一个最简单的电容充放电路,并且控制方式也较为简单,缺点就是,电容组只能充到电池电压的大小。理想二极管,是因为看见好多接电机的模块什么的都说要接个二极管,所以就带上了,至于有什么影响, 不是很清楚。还有一些开关切换的电路,其中Q5是为了防止车子死亡的时候,电容组还在为底盘供电。

Q4和Q6目前来看是有点多余,后面是用不到这两个MOS的。 关于Q4和Q6,其实是为了让超级电容输出的时候,完全切断来自底盘的供电,因为当时还不知道如何处理电容和电池同时输出的情况,但是后面写出来了,就把Q4短路了。留着Q6是有设计上的一些问题,Q5的关断信号是通过硬件检测电池端口的电压,而在死掉之后,突然断电的情况下,Q5仍处于导通状态,电池端口的电压只会跌落到电容组电压(Q1体二极管)。可以通过关断Q6进而防止电容电压倒灌到电池端口,从而达到关断Q5的目的。

截至2024年4月6日,我已经遇到四个使用UCC27211(可能也有UCC27201)的超级电容控制板出问题了,其中两个表现为上管无法导通,自举电压不正常。这些问题出现在不同的学校,其中有从立创买的芯片,所以我认为这个芯片容易出问题,所以建议更换别的驱动。目前在使用NSD1624(跟UCC27211不兼容),但是经过计算,100Khz的开关频率并不需要4A推拉电流的驱动,太浪费了。像LM5109这样的栅极驱动就已经能满足100Khz的开关频率应用了。

⚠️ D8,D9的TVS方向反了,请自行修改。

功率部分电路

采样电路

超级电容模块电流检测的INA282(淘宝买的6块钱一片,当时立创好像二十多)性能不错,甚至觉得还有点多余,可以再考虑换差的,电池电流用的单向的INA195,9块钱一片,还可以换差点的。电压跟随器的话,没有用opa2333,用的是GS8552,还有一个是SGM321,感觉只要是单位增益稳定的就够用了,没用出什么区别。

运放接入STM32的ADC的话,最好经过一个RC滤波器,一是滤波,二是STM32的ADC是SAR-ADC,运放直连的话可能会造成电压不准。

采样电路

硬件电路就这么完了?没有公式计算分析?

是的,我做的时候也只是照葫芦画瓢,电感只会看电流选,电容,MOS更是啥都不会,电感选大点,电容猛堆,MOS就用一些常用的。

软件算法

⚠️ 代码这部分有一个问题,ADC采样不是采的开关周期中间的值,而是开着DMA一直以一个恒定的频率在采样,而且是进入控制中断环路的时候才会用到ADC的值,可能会造成影响。(后期测试的时候,带载纹波总是很大,怀疑跟这个有很大关系)。

INA282采集出来的电流跳变会非常大, 这个是正常现象,因为他处于开关电流不连续的地方,上管导通有电流,上官关断无电流。解决办法就是,使用定时器触发ADC采样,触发时机为上管导通时间的中间,这样能保证采集到的电流是平均值。

代码写的比较差(有很多测试用的代码没有删掉),请多包涵(我也不想动这个屎山了,能跑就行)。

代码大部分是判断各种状态,应该是还能看懂,非要讲的话,也就讲讲PID了(函数是在网上抄的,似乎也没啥好讲的)。当时我还不知道“状态机”这样的编程思维,现在也还没开始学,有时间再看看。

双环竞争PID

我这里充放电都定义了一个PID函数,电流和电压分别进行PID计算之后,进行竞争才会赋给CMR来更新PWM占空比。

充电双环竞争

放电双环竞争

关于为什么我把充放电PID都作为单独的函数来定义,因为充放电的电流方向是相反的(其实就只有这里有区别),然后我就在PID函数里面负负得正了。

充电电流PID

放电电流PID

我这个双环竞争,两个函数的区别也就只是取大取小的区别,这个就得好好讲讲了。

双环竞争算法

处于充电状态(也就是Buck)时,假设输入(电池)电压24V,输出(电容)电压12V,理论占空比为50%,如果电流超过相应的电流限制,那程序应当拉低输出电压,也就是降低占空比,所以此时就需要使用较小的PID输出值来作为CMP的值。

HRTIM中CMP/PER的值即为PWM占空比的值(我程序设置的是正占空比模式,且HRTIM_CHA1为正通道,HRTIM_CHA2为互补通道,故我文中所说的所有占空比均为HRTIM_CHA1的正占空比)。

处于放电状态(也就是Boost)时,假设输入(电容)电压12V,输出(底盘)电压24V,理论占空比为50%,如果电流超过相应的电流限制,那程序应该拉低输出电压,也就是降低占空比,那这不应该是跟上面的情况是一致的吗?

我们从Buck和Boost的占空比计算以及原理来看,《精通开关电源设计》附录中总结了这些公式:

Buck:Duty=Vo/VinDuty = V_o / V_{in}

Boost:Duty=Vo/(Vin+Vo)Duty = V_o / (V_{in} + V_o)

这里就出现差别了,两个的占空比计算公式不一样?

这就需要看到Buck和Boost如何从电路中计算推导出这个公式了。

Buck与Boost拓扑区别

上图是典型的Buck和Boost的拓扑,Duty是通过MOS导通与关断的时间来进行计算的。其实这里已经可以发现了,他们的MOS位置是不一样的,对应的"MOS的占空比"指的并不是同一个MOS的占空比。而放到这个超级电容控制板的拓扑来看,一个很正常的同步DCDC,但是正反两个方向分别对应同步Buck和同步Boost。

  • 工作于Buck状态时,MOS占空比的控制应该是以上管的占空比作为正占空比;
  • 而工作于Boost状态时,MOS占空比的控制应该是以下管的占空比作为正占空比;

在我的程序中,HRTIM_CHA1正通道对应控制上管的通断,HRTIM_CHA2互补通道对应控制下管的通断,所以我永远是以上管的正占空比作为控制对象。由于上下管占空比互补,所以:

处于放电状态(也就是Boost)时,假设输入(电容)电压12V,输出(底盘)电压24V,理论占空比为50%,如果电流超过相应的电流限制,那程序应该拉低输出电压,也就是降低占空比,那这不应该是跟上面的情况是一致的吗?

这段话中的占空比指的是下管的占空比,为了使输出电压降低而减小下管占空比时,上管占空比就会增大,故需要取较大的值赋值给CMP就可以达到降低输出电压的目的。

并联输出算法

这里的可以说是一个取巧的办法,只能说能用,但是不好用。目前是想到了别的方法来实现这个功能,但是暂时没时间验证。

这个方法是从一次测试中得到的启发:电池和数字电源并联向电子负载供电,由于电池和数字电源同时输出,并且电压不一致,所以我不知道表头显示的是什么电压。在电池满电的时候,电压大概是25V,调节数字电源的输出电压,接近25V的时候,电池那路的电流就开始下降,数字电源开始输出电流,数字电源的设定输出电压值在电池实际电压(电池大功率输出的时候电压会有所降低)附近的时候,他们两路的电流就跟电压有一定的比例关系(你问我怎么算?好像基尔霍夫定理啥的能算,不会!)。

然后就是根据电池的输出功率来调整超级电容的升压输出电压,超级电容开启升压输出时,电池输出功率在最外层的if进行调整,我这里是将电池输出功率限定在功率限制-10W左右。

并联输出算法

测试

测试仪器

  • 电子负载(负载电阻)
  • 程控电源(学生电源)
  • 示波器
  • 万用表

测试流程

  • 板子各电源电压正常;
  • 单片机可以正常运行;
  • 使单片机输出设定频率的互补PWM;
  • 以固定占空比(如50%)输入半桥驱动来使半桥工作,测量半桥输入输出电压关系是否约为1:2(会有误差);
  • 调节上下管Vgs驱动波形正常(一般来说,走线正常就不会出问题);

注意接地点,不要让探头爆炸。

  • 调节上下管导通死区时间(至少空载不能让管子发烫);
  • 开环带载测试,测试效率,进一步查看Vgs波形,死区时间;

以上为硬件测试,以下为软件测试。

  • 写ADC采样代码;
  • 给各个电压/电流采样点输入电压/电流,万用表测试运放输出是否在计算值误差内,ADC采样值是否正确。
  • 写PI控制代码,将电压作为反馈环路,尝试对PWM进行闭环控制,使其不震荡;
  • 对电压环进行负载测试(半载,满载),确保真的不震荡;

调试电压环的时候,电子负载设定恒流模式;调试电流环的时候,电子负载设定恒压模式。

  • 在反馈环路中加入电流反馈,一般使用电流内环,电压外环的反馈环路,调PI;
  • 进行恒流/恒压跳变测试,确保电压电流环之间切换不会有太大的波动;

这个恒压/恒流跳变测试我喜欢用恒阻模式来调试。

  • 写控制逻辑代码;
  • 对电容进行充放电测试。
  • 写通信代码;
  • 爆炸💥!

测试视频

此视频数据不完全正确,请勿以此为参考。