十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

基于51单片机的太阳能充电器设计与MPPT实现

基于51单片机的太阳能充电器设计与MPPT实现 简介一份面向电子、嵌入式方向本科学生与初学者的51单片机太阳能充电器毕业设计资料适用于课程设计、毕业设计也可作为光伏充电控制系统开发的入门参考。压缩包内为单个doc格式文档整体约1.99MB按毕业设计论文结构组织覆盖绪论、系统总体方案、硬件设计、软件编程与调试、结论等章节。已有531人学习下载。文档以邵阳学院本科毕业设计为背景具体涉及太阳能电池板选型、LM7805稳压电路、充电主电路、信号采集处理电路以及基于C语言的智能充电策略与程序调试思路并给出三阶段充电、温度补偿和过充保护等关键内容可帮助读者从方案对比到软硬件实现获得完整可参考的设计流程对完成同类课题或理解单片机在光伏充电中的实际应用有直接帮助。1. 项目整体框架与设计思路1.1 为什么用51单片机做太阳能充电器直接说结论如果是做产品没人会用51去做太阳能充电器市面上成熟方案是CN3765、LT3652这类专用充电IC或者STM32加MPPT算法。但如果你是电子专业学生做课程设计、毕业设计或者想彻底搞懂充电管理原理的电子爱好者51单片机反而是一个特别合适的切入点。原因有三点。第一51单片机资料多、上手快STC89C52的价格大概两三块钱烧录器用CH340串口就能搞定不像STM32还要折腾下载器。第二51的GPIO、定时器、串口资源足够覆盖充电器需要的所有功能PWM输出、ADC采样、LCD显示、按键输入。第三也是最重要的一点用51意味着你被迫手动实现所有逻辑比如PWM占空比调节、电压电流闭环控制、电池充放电状态切换这些东西用专用IC时被封装在芯片内部你用51做一遍就等于把充电管理这块硬骨头啃了一遍对后续做电源方向帮助非常大。一个典型的51太阳能充电器核心任务是把太阳能板的输出电压转换成适合蓄电池的充电电压同时实现恒压、恒流、保护等功能。太阳能板输出不稳定晴天中午可能18V阴天只有10V直接接电池轻则充不满重则过充损坏电池。单片机的角色就是监督者——实时采集电压电流根据电池状态调节降压电路的PWM占空比再顺带把状态显示到LCD上。1.2 系统整体架构与充电拓扑选择整个系统可以分为六大模块太阳能板输入、BUCK降压主电路、电压电流采样、单片机控制核心、LCD显示与人机交互、保护电路。主电路拓扑我选BUCK降压没有用LDO也没有用boost。原因是太阳能板的标称电压一般是18V36片电池片串联而常见蓄电池是12V输入高于输出BUCK是效率最高的选择。LDO在高压差大电流下效率惨不忍睹boost则根本用不上。BUCK电路的效率做到85%以上很轻松这对太阳能这种能量有限的场景来说很重要。控制策略上我不建议用纯硬件PWM控制器比如TL494配合反馈环来做虽然也能工作但就失去了单片机设计这个核心。正确的做法是单片机输出PWM信号驱动MOS管通过调整占空比控制充电电流和电压形成软件闭环。这样整个设计的核心控制逻辑都在代码里答辩时也更容易讲清楚。1.3 功能模块规划与选型我做的第一版功能规划是这样的充电对象12V铅酸蓄电池也可以用6V电池通过参数调整适配太阳能板参数18V/20W开路电压21V左右短路电流1.2A左右充电策略先恒流快充电池电压到达14.4V后转恒压电流降到一定值后进入浮充显示功能LCD1602液晶显示当前太阳能板电压、充电电流、电池电压、充电状态保护功能防反接、防过充、防倒灌晚上防止电池电流倒流回太阳能板扩展功能预留按键接口可以手动设置充电截止电压芯片选择上如果你用STC89C52它没有内置ADC需要外接ADC0809或者用PCF8591这类I2C接口的ADC芯片。我更推荐直接换STC12C5A60S2或者STC15W408AS这两款都是51内核但内置10位ADC和硬件PWM能省掉一堆外围电路。STC12C5A60S2跟89C52引脚基本兼容程序改动也不大成本同样控制在五块钱以内。下面所有内容我都会以STC12系列为基础来讲因为真的没有必要抱着89C52不放。2. 核心硬件电路设计与参数计算2.1 太阳能板输入电路防倒灌是第一个坑太阳能板在光线充足时是电源到了晚上或者被遮挡时它就是一个负载如果这时候电池的电通过BUCK电路的续流路径倒灌回去能量就白白浪费了甚至可能损坏太阳能板。防倒灌最简单粗暴的方案是在太阳能板正极串联一个二极管但肖特基二极管有零点三到零点四伏的压降20W板子1A电流时就要损失零点几瓦本来太阳能效率就低再这么一折腾更心疼了。我用的方案是P沟道MOS管做理想二极管把PMOS的源极接太阳能板正极漏极接BUCK输入端栅极经过一个电阻接地再通过一个稳压管保护栅源电压。当太阳能板电压高于电池电压时MOS管的体二极管先导通随后Vgs变负管子完全导通压降只有几十毫伏。太阳能板电压低于电池电压时Vgs接近零MOS管关断切断倒灌路径。这个电路成本比专用理想二极管芯片便宜效果也够用。输入端的TVS管和滤波电容不能省。太阳能板在空载时电压会飘尤其是突然断开负载时感性负载会产生尖峰TVS管SMBJ24A可以把电压钳位在安全范围。输入端并联一个470uF电解电容加一个0.1uF陶瓷电容用于吸收高频噪声。2.2 BUCK降压电路电感、续流二极管、MOS管怎么选BUCK电路是充电器的功率核心。输入18V太阳能板输出12V电池最大充电电流按1A设计。核心参数计算如下占空比D Vout / Vin 12V / 18V ≈ 0.67开关频率我选20kHz这个频率是51单片机用定时器模拟PWM时比较合适的折中——频率太高单片机中断负担太重频率太低电感会大而且有 audible noise。电感量按电流纹波不超过最大电流的30%计算L (Vin - Vout) × D / (f × ΔI) (18 - 12) × 0.67 / (20000 × 0.3) ≈ 670uH我实际用了680uH/2A的功率电感实测纹波在可接受范围内。如果想让纹波更小可以把频率提到40kHz不过注意MOS管开关损耗会增加。续流二极管不能用普通1N4007开关频率20kHz下它的反向恢复时间太长会严重发热。要用肖特基二极管我选了SS343A/40V正向压降只有0.4V左右反向恢复时间可以忽略。MOS管我用的IRF540N耐压100V、内阻44mΩ裕量足够。储能电容在输出端放两个470uF电解并联等效ESR更低动态响应更好。注意BUCK电路的电感不能选得过大否则负载突变时响应慢容易导致输出电压过冲。2.3 采样电路分压电阻和运放放大单片机ADC的输入范围是0到5V而太阳能板电压最高能到21V电池电压最高15V左右必须先分压。分压电路我这样设计太阳能板电压检测R140kR210k分压比是5:121V输入时ADC引脚得到4.2V留有余量。电池电压检测R320kR410k分压比3:115V输入时ADC得到5V刚好满量程。串联的电阻精度用1%的金属膜电阻普通5%的碳膜电阻误差太大会导致充电截止电压偏移几百毫伏对铅酸电池来说这是不可接受的。分压后的信号必须加一个0.1uF电容到地做滤波再去ADC引脚否则开关电源的噪声会严重影响采样精度。电流采样我用了一个0.05欧姆的毫欧电阻串联在电池负极端。1A电流时压降是50mV这个信号太小单片机直接采误差很大需要放大。我用LM358搭建了一个同相放大电路放大倍数设为20倍50mV变成1V正好在ADC量程内。LM358虽然便宜但失调电压比较大最大7mV换算成电流误差有7mA左右对充电控制来说可以接受。如果想更精确可以换OP07或者用专用的INA180电流检测芯片后者不需要负电源且自带固定增益电路更简洁。2.4 PCB布局与布线要点高频开关电源的PCB布局直接影响系统稳定性。我画第一版的时候踩过不少坑总结几个关键点第一功率回路要小。BUCK电路的功率回路是MOS管→电感→输出电容→续流二极管→MOS管这个环路包含高频开关电流面积必须尽量小否则会产生严重的电磁干扰。第二采样线要远离开关节点。电压采样和电流采样信号属于小信号走线要避开SW节点MOS管源极与电感连接处否则采样值会被开关噪声污染导致ADC读数跳变。第三MOS管的散热焊盘要足够大。IRF540N在TO-220封装下如果不加散热器持续1A电流时温度能到60度以上。PCB铜箔尽量多铺能够通过铜箔散热。条件允许的话装一个小铝散热片效果立竿见影。第四LCD1602的排针附近放一个10uF电解电容液晶背光电流瞬间变化时电压跌落会导致显示闪烁这个电容能稳定供电。3. 软件架构与核心控制算法3.1 主程序架构调度器设计充电器软件实时性要求不高不需要上RTOS但也不能把所有事情堆在主循环里乱跑。我的主循环用了一个简单的时间片轮询结构用定时器0产生1ms的时基维护几个标志位1ms标志用于PWM占空比微调快速响应10ms标志用于电压电流采样100ms标志用于MPPT调节、LCD显示刷新500ms标志用于按键扫描消抖主循环就是检查这些标志位然后执行对应的处理函数。这样结构清晰后续加功能不会牵一发动全身。关键代码如下void main(void) { SystemInit(); while(1) { if(flag_1ms) { PWM_SmoothAdjust(); } if(flag_10ms) { ADC_Sample(); } if(flag_100ms) { MPPT_Update(); OLED_Display(); } if(flag_500ms) { Key_Scan(); } } }3.2 PWM波形产生定时器中断方案STC12C5A60S2内部有PCA模块可以直接产生PWM不需要占用定时器中断这是它比89C52方便的地方。配置PWM的代码如下// 初始化PCA PWM输出到P1.0引脚频率20kHz void PWM_Init(void) { CCON 0x00; CMOD 0x02; // 时钟源选择定时器0溢出PWM频率由定时器0决定 CL 0x00; CH 0x00; CCAPM0 0x42; // PWM模式 PCA_PWM0 0x00; // 8位PWM CR 1; // 启动PCA计数器 } void PWM_SetDuty(unsigned char duty) { CCAP0H duty; CCAP0L duty; }占空比调节范围是0到255对应0%到100%。初始化时占空比设为0防止上电时输出直接冲击电池。如果你用的是89C52没有PCA模块也可以用定时器中断翻转IO口模拟PWM但要注意20kHz对应周期50us1%分辨率就是0.5us51单片机跑12MHz晶振时一条指令要1us这个精度很难保证。所以再次强调用STC12系列省心太多。3.3 MPPT扰动观察法的51实现太阳能电池的输出特性是不同光照下存在唯一的最大功率点。MPPT最大功率点跟踪就是让系统始终工作在最大功率点附近。专业MPPT控制器用复杂的算法但在51上最实用的是扰动观察法。扰动观察法原理特别简单每隔一段时间给占空比加一个小的扰动比如加2采样当前功率。如果功率比上一次大说明扰动方向正确继续往这个方向扰动。如果功率反而下降了说明方向错了往反方向扰动。这个算法实现只要几十行代码效果虽然不如增量电导法但对于教学演示和实际充电场景已经足够了。void MPPT_Update(void) { unsigned int power_now, power_last; power_now (unsigned int)bat_voltage * charge_current / 100; // 计算当前功率假设电压单位0.1V电流单位10mA if(power_now power_last) { // 功率增加继续原方向 if(direction UP) PWM_SetDuty(PWM_Duty STEP); else PWM_SetDuty(PWM_Duty - STEP); } else { // 功率下降反转方向 if(direction UP) PWM_SetDuty(PWM_Duty - STEP); else PWM_SetDuty(PWM_Duty STEP); } power_last power_now; }几个关键的工程细节。第一扰动步长STEP我取3对应约1.2%的占空比变化步长太大会导致最大功率点附近振荡幅度大步长太小响应速度慢。第二必须让系统稳定后再采样我是每次调整完占空比后延时100ms再采样否则采样到的是系统还没稳定时的值。第三光照突变时功率比较会出错我加入了一个简单的判定如果功率变化超过50%认为是外部光照突变而不是自身扰动引起的直接按新功率重新开始追踪。3.4 充电状态机与三段式充电策略铅酸电池的充电要分阶段进行我用状态机实现共四个状态涓流充电、恒流充电、恒压充电、浮充。电池电压低于10.8V进入涓流充电以0.1C电流约0.2A充电防止大电流冲击亏电电池电池电压达到10.8V转入恒流充电以0.5C电流约1A充电电池电压达到14.4V转入恒压充电维持14.4V电压电流自然下降电流降到0.05C约0.1A认为电池充满进入浮充电压降到13.5V维持状态切换代码用switch-case实现每个状态下都有对应的时间超时保护防止异常情况下死循环。恒压状态下实际上是一个软件PID控制目标电压14.4VPID输出调节PWM占空比让电压稳定在目标值。4. 实物调试与常见问题排查4.1 实测数据记录我在室外阳光下用20W太阳能板做了几组实测记录如下时间天气太阳能板电压V充电电流A电池电压V充电状态10:00晴18.20.8512.6恒流11:30晴19.51.0213.2恒流13:00多云15.80.5613.8恒流14:30多云16.70.3114.3恒压17:00晴转阴12.40.1214.4恒压从数据可以看到MPPT在光照稳定时能保持系统工作在最大功率点附近多云天气下太阳能板电压波动大MPPT持续调整占空比追踪最大功率点。充电快满时系统从恒流转到恒压电流逐渐下降这就是三段式充电的正常表现。4.2 常见问题与排查方法第一PWM占空比加到一定值后电流不再增加。这个我遇到过一次查了很久发现是BUCK电感饱和了。我一开始用的色环电感额定电流只有300mA1A充电电流时磁芯饱和感值急剧下降根本没法储能。换成680uH/2A的功率电感后问题解决。检查BUCK电路是否正常工作可以用示波器看SW节点的波形正常应该是一个方波。第二ADC采样值跳变很大。原因是采样线和功率回路靠太近了开关噪声耦合进来。解决办法是把采样线远离电感同时软件上做滑动滤波连续采8次去掉最大值最小值后取平均效果立竿见影。第三LCD1602乱码。排除接线问题后检查是复位时序问题。51单片机IO口上电默认是高电平而LCD1602的E引脚是上升沿触发如果上电瞬间E引脚上有毛刺会让LCD进入错误状态。解决办法是在初始化函数中先拉低E引脚延时50ms再执行标准初始化时序同时确保单片机上电后延时至少50ms再初始化LCD。第四电池充满了但充电器还在大电流充电。这个通常是恒压阶段电压采样不准导致的。检查分压电阻如果你的分压电阻用5%精度实际分压比可能偏差3%以上14.4V目标值实际可能变成14.8V或者14.0V。换1%精度的电阻并且用万用表实测校准。4.3 效率测试与优化方向用功率计实测整个系统18V输入1A时输出12V0.85A效率约84%。损耗主要来自MOS管导通损耗、电感铜损、肖特基二极管压降损耗。如果想提升效率可以把肖特基二极管换成同步整流MOS管需要额外驱动电路效率可以做到90%以上但复杂度明显上升。5. 个人经验与扩展建议这个项目做完后我对电源管理的理解比看十本书都深刻。以前用充电IC时只觉得接上去就行现在看到一块太阳能充电板下意识就会去算它的拓扑、开关频率、电感参数。这就是自己做底层实现带来的收获。如果你想在这个基础上扩展可以直接从三个方向入手。一个是把铅酸电池换成锂电池充电策略改成恒流恒压两段式4.2V截止代码层面只需要改一下状态机和目标电压。另一个是加入蓝牙模块用手机APP实时查看充电状态和数据曲线这就把嵌入式跟物联网串起来了。还有一个方向是把扰动观察法升级为增量电导法后者在光照变化剧烈的环境下MPPT精度更高但代码复杂度和对ADC采样精度的要求也会上一个档次。最后说一个经验之谈做这类电源项目软件调试时间其实不到总时间的三分之一大部分时间都花在硬件排错上。建议焊接完毕后先用万用表把所有供电点都测一遍再上电确认没有短路再接太阳能板第一次上电最好用限流电源供电防止烧东西。拿着示波器一点一点排查效率比盲猜要高得多。本文还有配套的精品资源点击获取
返回列表