每年毕业设计季,围绕“动力电池充电系统设计”这个题目的咨询量都会集中爆发。原因很简单:它不是单独的Matlab仿真,也不是单纯的Proteus电路搭建,而是要把充电控制策略、功率变换电路、采样保护逻辑,再加上英文文献、PPT、详细过程说明书这些材料全部串成一个能完整自洽的方案。我完整跟练过类似题目,从Simulink里的充电曲线到Proteus里跑起来的Buck主电路,再到说明书和PPT的整理,踩了一遍之后发现,这个题目的真正难点不在某一个环节,而在各个工具之间怎么配合。这篇就把整个设计链路摊开讲,适合正在做课设或毕设的同学参考,也欢迎已经做过类似项目的同行一起交流。
1. 从课题任务书到系统方案:先搞懂这个题目到底要验证什么
1.1 充电系统的核心需求:不只是把电充进去
很多人拿到题目第一反应是“搭个降压电路不就行了”,实际上充电系统设计要解决的问题比降压电路多得多。如果用最简单的方式给锂电池充电,电压一到满电值就停止,那么电池可能连80%容量都充不满,而且大电流直充对电池寿命的损伤很严重。动力电池充电系统设计的核心目标可以拆成四块:一是按锂电池特性输出合适的充电电压和电流,二是保证充电过程不发生过压、过流、过温,三是能观察和记录充电状态,四是整个系统的参数可调整、可验证。
我做的方案以单体锂离子电池为对象,标称电压3.7V,满电电压4.2V,容量2Ah。输入侧采用12V直流电源,目的是验证降压型充电拓扑。之所以不直接做整包电池,是因为单体电池能把充电策略的细节展示得更清楚,比如恒流转恒压的切换点、截止电流的判断,这些逻辑在小系统里更容易看清楚,扩展到多串电池组时只需要调整电压电流标定值和控制阈值。
1.2 设计指标怎么定才合理
设计指标是后续所有仿真的依据,前期不把指标定清楚,后面做Matlab和Proteus就会到处返工。我的指标参考了18650锂电池的常规充电规范,兼顾仿真平台的可演示性和课程设计的工作量。
| 参数名称 | 指标值 | 说明 |
|---|---|---|
| 输入电压 | DC 12V | 模拟车载或适配器输入 |
| 电池类型 | 锂离子单体 | 标称3.7V,满电4.2V,容量2Ah |
| 预充电电流 | 0.2A(0.1C) | 电池电压低于3.0V时进入 |
| 恒流充电电流 | 2A(1C) | 主充电阶段 |
| 恒压充电电压 | 4.2V | 限制电压 |
| 截止电流 | 0.2A | 恒压阶段电流降至0.1C后停止 |
| 过压保护阈值 | 4.25V | 超过后关闭PWM |
| 过流保护阈值 | 2.5A | 超过后关闭PWM |
| 过温保护阈值 | 45℃ | 由NTC温度采样判断 |
这里重点解释两个容易被忽略的指标。第一是预充电,当电池电压低于3.0V时,电池内部极化严重,直接用大电流充电容易造成负极析锂,所以要先用小电流把电压抬到安全区间。第二是截止电流,恒压阶段电流会随着SOC升高持续下降,如果一直按固定电压充下去,电池会长时间处于过充边缘,所以设定一个0.2A的电流门槛,达到后立即结束充电。
1.3 两级仿真的分工逻辑:Matlab和Proteus各干什么
这也是这个题目和普通“嵌入式系统设计”题目最大的区别。Matlab仿真处理的是控制算法层,它回答的问题是“充电策略对不对、参数稳不稳”;Proteus仿真处理的是硬件电路层,它回答的问题是“单片机程序能不能驱动真实模型电路、采样和保护能不能跑通”。两者不是二选一,而是前后验证关系。
| 验证层面 | Matlab仿真 | Proteus仿真 |
|---|---|---|
| 验证对象 | 控制策略、充电曲线、SOC估算、CC-CV切换逻辑 | Buck主电路、采样电路、PWM驱动、状态机程序 |
| 关注点 | 电流电压曲线是否平滑,是否按预充-恒流-恒压-截止推进 | 器件连接是否正确,程序是否能实时调整占空比 |
| 输出结果 | 电压-时间曲线、电流-时间曲线、SOC曲线 | LCD显示、保护动作、PWM波形、电路节点电压 |
| 修改成本 | 修改控制参数方便,适合调参 | 修改硬件接线较繁琐,适合固定方案后验证 |
我的整体思路是:在Matlab里把充电曲线调通,确定恒流环和恒压环的PID参数;再把同样的参数和状态切换逻辑移植到Proteus的单片机程序里,用电路仿真验证每个控制周期的实际效果。两个平台共用同一套充电阶段定义和控制目标,这样才能保证最终说明书中数据的一致性。
2. Matlab仿真层的设计重点:从充电曲线到控制算法验证
2.1 锂电池的四阶段充电过程:为什么必须这样切
锂电池充电不是简单的“恒压就能充满”,而是要根据电池当前状态动态切换工作模式。我在Simulink里搭建的模型严格采用四阶段流程。
第一阶段是预充电,当电池电压低于3.0V时,以0.2A恒定小电流充电,直到电压升到3.0V。第二阶段是恒流充电,以2A电流快速充电,此时电池电压从3.0V慢慢爬升到4.2V附近。第三阶段是恒压充电,电压钳在4.2V,电流从2A自然下降,当电流降到0.2A时判断充电完成。第四阶段是截止,PWM输出置零,LCD显示充满。
这个流程的核心逻辑在于“电流优先”和“电压限制”。恒流转恒压不能用简单比较器瞬间切换,否则两个反馈环会争夺控制权,造成电流电压振荡。常用做法是双环低选:恒流环PI的输出和恒压环PI的输出经过一个Min模块取较小值作为占空比给定。这样在电池电压没到4.2V之前,恒压环输出较大不起作用,恒流环主导;当电压逼近4.2V,恒压环输出开始小于恒流环输出,系统自然过渡到恒压模式。这个设计相比硬切换更平滑,也是我在项目里最推荐的做法。
2.2 Simulink模型框架:主电路、反馈、PWM生成
Simulink模型可以分为三个部分,我分别搭建并逐级联调。
主电路部分采用Simscape Electrical里的Buck变换器。直流电源设为12V,开关器件选择MOSFET,续流二极管选择快恢复二极管,电感和电容按下一节的计算结果填入。电池模块我常用Table-Based Battery模型,设置容量2Ah、内阻0.05Ω,初始SOC设为20%。这样能更直观地看到SOC随时间的变化,也便于验证安时积分逻辑。
控制部分由两个PI控制器组成。恒流环反馈量来自电流采样,给定值为2A;恒压环反馈量来自电池端电压,给定值为4.2V。两个PI的输出经过Min模块低选后送给PWM Generator。PWM频率设为20kHz,避免产生音频噪声,也方便后续硬件实现时电感和电容的体积可控。
仿真设置上,求解器使用可变步长,最大步长建议限制在1e-5秒以内,确保PWM开关波形被完整捕获。仿真时长设为6小时,实际上电池SOC从20%充到100%大约需要不到1小时,前半小时重点观察恒流段,后半段重点观察恒压和截止。
2.3 Buck主电路参数计算:不能只看拓扑,参数要有据可依
很多同学在Matlab里直接拖一个Buck电路,参数随手填,等转到Proteus时才发现纹波大得没法看。这里给出完整的参数计算过程,两个仿真平台可以直接共用。
开关频率取f=20kHz,输入电压Vin=12V,输出电压在恒流阶段约3.7~4.2V,按最恶劣情况取Vout=4.2V计算,占空比D=Vout/Vin=0.35。电感纹波电流一般取输出电流的20%,输出电流Io=2A,所以ΔIL=0.4A。电感值计算如下:
L=(Vin-Vout)×D/(f×ΔIL)=(12-4.2)×0.35/(20000×0.4)=0.00068H
取标称值680μH。输出电容按照电压纹波不超过10mV计算,C=ΔIL/(8×f×ΔVout)=0.4/(8×20000×0.01)=0.00025F,取330μF/25V电解电容。这里注意,仿真里电容值取大一点问题不大,但电感值如果过小,电流纹波会很大,影响恒流环反馈信号质量。
PID参数的整定顺序是先电流环后电压环。恒流环我初始给Kp=0.2、Ki=5,占空比限幅范围0~0.8,观察电流响应曲线的超调量。只要超调不超过10%,响应时间小于0.5秒就算合格。恒压环初始Kp=0.1、Ki=2,输出限幅0~0.6。因为恒压环只在接近满电时才介入,响应不需要太快,太快的积分容易在切换点产生过冲。
2.4 仿真结果怎么看:三条曲线和切换点
仿真跑完之后,需要同时观察电池端电压、充电电流和SOC三条曲线。一个健康的充电过程应该是这样的:初始阶段电压从3.0V左右缓慢上升,电流稳定在2A;当电压上升到4.2V,电流开始指数式下降,此时恒压环已经接管;当电流降到0.2A下方,充电结束,PWM占空比归零。SOC曲线整体呈近似线性上升,恒压阶段斜率明显变缓。
判断仿真是否正常的一个重要技巧是看切换点处的连续性。如果电流在切换到恒压模式的瞬间出现尖刺或者掉零,说明两个PI环切换逻辑有问题,需要检查Min模块的连接或者增加限幅。如果恒压阶段维持不住4.2V而是慢慢跌破,说明恒压环积分参数太小,把Ki适当加大再跑一次。
3. Proteus仿真层的设计重点:主电路、采样电路与程序状态机
3.1 Buck主电路与驱动方案:Proteus不是连上线就能跑
Proteus仿真最让新手头疼的是MOSFET驱动。很多同学直接拿单片机PWM引脚去接MOSFET栅极,结果仿真里电路完全不动。原因在于Buck电路中的开关管位于高端,源极电压随开关状态浮动,单片机输出的3.3V无法直接提供足够的栅源电压差。
我的做法是采用IR2110半桥驱动芯片。单片机输出20kHz的PWM信号给IR2110的HIN引脚,HO引脚输出驱动高端NMOS。IR2110高压侧需要自举电容,我取0.1μF快速恢复电容连接VB和VS,同时VS接MOSFET源极、电感输入端和续流二极管阴极的交点。这个配置在Proteus里是能正常仿真的。
主电路按经典Buck结构连接:12V电源正极接IRF540N漏极,源极接SW节点,SW节点通过680μH电感接电池正极,续流二极管MUR860阳极接地、阴极接SW节点,输出电容并联在电池两端。电池在Proteus里不能用一个固定的直流电压源代替,否则电压永远不变,充电过程看不到电流下降。我在Proteus里用受控电压源加内阻模拟电池端电压随充电电流和SOC的变化,具体做法是先放一个Behavioural Source,输出电压根据积分电流动态调整。
3.2 采样与保护电路:ADC量程和共地问题
采样电路直接决定了单片机能不能“看”到当前充电状态。电池电压采样用电阻分压,我选R1=20kΩ、R2=10kΩ,分压比1/3,电池电压4.2V时ADC引脚电压1.4V,适合3.3V参考电压。分压后的信号经过电压跟随器隔离,再送入STM32的ADC通道。
电流采样不能直接量,需要用采样电阻加仪表放大器。采样电阻放在电池负极的低端回路,阻值0.02Ω,2A电流时压降只有0.04V,通过仪表放大器放大50倍后得到2V信号。之所以放低端,是因为低端采样对共模干扰不敏感,单片机地线可以直接作为参考地。放大器的供电可以给+5V单电源,输出经过电阻分压限幅后进ADC,保证不超过3.3V。温度采样用10kΩ NTC热敏电阻和10kΩ普通电阻分压,单片机通过查表或近似公式计算温度。
保护逻辑完全依靠ADC采样值判断。过压阈值对应4.25V,过流阈值对应2.5A,过温阈值对应45℃。一旦任一条件触发,程序立即置PWM占空比为0,同时状态机进入故障状态,只有手动复位才能重新充电。这样比单纯靠比较器硬件保护更容易展示软件控制流程,也符合题目要求的可演示性。
3.3 单片机程序状态机:一个能直接移植到工程的框架
Proteus部分的核心是单片机内部的充电状态机。我用STM32F103系列的定时器产生20kHz PWM,ADC中断里读取电压电流温度,主循环执行状态迁移。程序框架如下:
typedef enum { PRECHARGE, CC_CHARGE, CV_CHARGE, DONE, FAULT } ChargeState; ChargeState state = PRECHARGE; float Kp_i = 0.2f, Ki_i = 5.0f; float Kp_v = 0.1f, Ki_v = 2.0f; float integral_value = 0.0f; while(1) { read_adc_all(&v_bat, &i_bat, &t_bat); if(v_bat > 4.25f || i_bat > 2.5f || t_bat > 45.0f) { state = FAULT; set_pwm_duty(0); continue; } switch(state) { case PRECHARGE: duty = pi_controller(Kp_i, Ki_i, &integral_value, 0.2f, i_bat, 0.0f, 0.4f); if(v_bat >= 3.0f) { state = CC_CHARGE; integral_value = 0.0f; } break; case CC_CHARGE: duty = pi_controller(Kp_i, Ki_i, &integral_value, 2.0f, i_bat, 0.0f, 0.8f); if(v_bat >= 4.2f) { state = CV_CHARGE; integral_value = 0.0f; } break; case CV_CHARGE: duty = pi_controller(Kp_v, Ki_v, &integral_value, 4.2f, v_bat, 0.0f, 0.6f); if(i_bat <= 0.2f && v_bat >= 4.0f) { state = DONE; set_pwm_duty(0); } break; case DONE: set_pwm_duty(0); break; case FAULT: set_pwm_duty(0); break; } set_pwm_duty(duty); lcd_show(v_bat, i_bat, state); delay_ms(100); }这个框架和Matlab里的双环低选不完全一样,它是用状态切换来实现的,因为单片机里同时维护两个PI会比较占资源,而且自动切换逻辑更容易让答辩老师看懂。PI控制器函数内部需要加抗积分饱和,积分项限制在上下限之间,否则占空比会长时间卡在极限值。
3.4 Proteus仿真里最容易踩的几个坑
第一个坑是MOSFET无法导通或发热严重。这通常不是MOSFET选型问题,而是IR2110的输入端没有给低电平使能或者自举电容太小。在Proteus里启动仿真后,先用示波器看HO引脚的波形,如果波形幅度不够,尝试把自举电容加大到0.47μF,并确认VCC和VDD供电正常。
第二个坑是ADC读数全为0或全为最大值。原因大多是运放输出到ADC引脚之间没有做限幅,信号超出参考电压导致仿真报错,或者分压电阻没共地。我的排查顺序:先量运放输出端,再量ADC引脚端,最后确认单片机程序里的通道配置。
第三个坑是电池电压模型导致充电电流一直不降。Proteus默认电池元件就是一个固定电动势源,无法模拟锂电池端电压随SOC变化的特性。这种情况下恒压阶段永远不会到来。建议用Behavioural Source实现端电压动态变化,或者在上位机里根据电流积分手动修正。
第四个坑是仿真速度极慢。PWM频率20kHz时,Proteus需要仿真足够多的周期才能看到整流效果,如果配合LCD刷新频率过高会更卡。我把LCD刷新周期改成100ms一次,把仿真时间步长适当放宽,速度和稳定性都能改善不少。
4. 设计说明书、英文文献和答辩PPT怎么准备得能拿出手
4.1 设计说明书的结构:按“故事线”而不是“功能列表”写
很多课设说明书写得像元件清单,第一章列电池介绍,第二章列Buck电路原理,第三章列单片机手册,全部是百科内容。答辩老师看一眼就知道是拼凑的。我的建议是按“提出问题-分析问题-设计验证-得出结论”的故事线来组织。
我的说明书章节顺序是:第1章课题背景与设计指标,第2章系统总体方案论证,第3章Matlab仿真建模与参数整定,第4章Proteus电路设计与程序实现,第5章结果分析与误差讨论,最后是总结和参考文献。关键是把“为什么选择Buck拓扑”和“为什么采用CC-CV策略”写成推理过程,而不是结论陈列。比如Buck拓扑的选择可以从输入输出电压差、效率、简单性三个维度对比线性电源和开关电源,再给出结论。
说明书里一定要包含的仿真素材包括:Simulink模型截图、充电电压电流曲线、SOC曲线、Proteus原理图、PWM波形、LCD运行状态截图。每张图要有标题、编号和简短结论,不能只贴图不解释。我在仿真时就把每次修改参数前后的曲线都单独截图保存,最后整理成参数对比表,这比只放最终结果更有说服力。
4.2 英文文献怎么找、怎么读、怎么引用
题目里既然要求英文文献,就不是让你下载一篇放在最后充数。我在做这个项目时检索的主题词是“lithium-ion battery charging control”“CC-CV charging strategy”“SOC estimation for lithium battery”以及“Buck converter design”。用这几个关键词组合,能找到大量IEEE和科学数据库的期刊论文。
我的建议是精读两部分内容。第一是锂电池充电策略部分的论述,尤其是CC-CV相较其他充电方式在循环寿命方面的对比数据,这部分可以直接支撑说明书里的策略选择。第二是SOC估算方法的对比,比如开路电压法、安时积分法、卡尔曼滤波法的适用范围,引用一篇说明自己为什么在仿真里选择安时积分法。不需要整篇翻译,只需要将能佐证设计的段落翻译并标注来源,形成“本文采用……,相关研究如文献[1]所述……”这样的连贯表述。
参考文献格式务必统一,我按GB/T 7714格式整理,注意作者名、期刊名、年份、卷号不能漏。标题里的“英文文献”在答辩时经常被追问,提前把三篇文献的核心观点各写一段摘要放在说明书附录里,现场被问到时能很快答出来。
4.3 PPT汇报的叙事线:从“我做了什么”到“我为什么这么做”
答辩PPT常见的错误是页数很多但逻辑断裂,每页之间没有承接。我拿这个题目试过一次,最终用的PPT主线是“电池为什么难充-我提出什么策略-我怎么验证策略-结果说明了什么”。封面页之后先用两三页讲锂电池充电的痛点,比如过充危险、低温充电折锂、恒流恒压的必要性,紧接着放系统总框图,让老师一眼看到Matlab和Proteus各自在整个方案中的位置。
硬件设计部分每页只放一个核心计算,比如电感公式、占空比推导、采样分压比,让老师能跟上思路。软件部分放状态机图加核心代码片段,代码不需要全部贴出来,贴状态切换关键几行就行。仿真结果部分是最有说服力的,我给了三页:一页Matlab充电曲线、一页Proteus运行截图、一页两个平台的数据对比。最后放一个“不足与改进”,比如Proteus中电池模型还是相对简化,后续可以引入更精细的电化学模型或支持通信接口的电池管理系统。
PPT上每一页字数控制在六行以内,详细内容全部放到演讲备注里。答辩现场不要复述PPT文字,而是重点讲“为什么在这个节点切换到恒压”“为什么电感取680μH”,这些设计决策远比背诵公式有价值。
如果你也在做或者准备做这个题目,我的建议是先把“充电控制策略”吃透,再去碰两个仿真平台和文档材料,因为后面的所有部分本质上都是在为策略服务。最后再提醒一点:Matlab里的参数、Proteus里的器件值、说明书里的计算表,这三个地方一定要保持一致,答辩时老师最喜欢抽查前后数据是否对得上。仿真遇到奇怪现象也别急着怀疑软件坏了,大概率还是驱动、采样或状态切换的问题,按“PWM波形-采样值-状态机”逐级排查,总能定位到根因。