资讯动态

基于51单片机的Boost升压斩波5-20V可调输出设计与Proteus仿真

发布时间:2026/10/27 19:03:48 来源:尧图企业网站定制
简介基于51单片机的升压斩波5-20VBoostProteus仿真设计资料包面向电子工程、嵌入式系统学习者适合需要完成直流升压电路课程设计或项目开发的人群内含完整的原理图、流程图、物料清单、仿真文件及源代码可实现5V至20V可调输出电压通过按钮设定电压LCD实时显示当前值与设定值并采用DA转换加压控PWM方式控制Boost电路采样输出电压后自动调整输出。压缩包内共44个文件包含C语言源文件、头文件、Hex烧录文件、Proteus仿真DSN、原理图预览PDF、电路图SchDoc、元件清单Excel及流程图图片等从代码到仿真到硬件清单一应俱全包体大小约392KB便于快速下载使用。已有1109人学习下载兼具教学参考与工程实用价值仿真高频率下会运行较慢且出现警告属正常现象电压较高时误差约1V阅读文档即可提前规避。整份资源对深入理解Boost电路原理、闭环电压调整和单片机人机交互设计都有直接帮助。1. 这个课题到底在做什么51单片机、Boost 升压与 5-20V 可调输出的关系把 5V 升到 20V看起来只是换个电容的事但要做成「输出电压可调、带载不掉压、有完整 Proteus 仿真和源码」的课设或毕设题就不得不面对 Boost 斩波电路的本质用 PWM 控制电感的储能与释放。基于 51 单片机的升压斩波 5-20V 项目核心工作是把单片机当成 PWM 发生器和闭环控制器配合 Boost 升压拓扑、电压采样网络最终在 Proteus 里跑通整套逻辑再整理出原理图、流程图、物料清单、仿真图和源代码。适合正在做课程设计、毕业设计或者想快速验证一套可调升压电源控制逻辑的嵌入式方向学生。这套方案里最容易让人误判的一点是Proteus 仿真跑通并不等于实物能上电。仿真能证明你的占空比计算、闭环逻辑、ADC 采样链路是对的但电感是否饱和、MOS 管栅极驱动是否到位、二极管开关速度够不够仿真都不会替你发现。这也是下文要把参数计算、器件选型和调试坑分开讲的原因。2. Boost 电路原理与参数计算围绕 5-20V 的占空比公式、电感与开关频率选取2.1 Boost 拓扑为什么适合 5-20V而不是用 charge pump 或反激Boost 升压斩波电路的基本结构是电感串联在输入端MOS 管在电感之后对地开关二极管和输出电容组成整流滤波。MOS 管导通时电源给电感充磁电感电流线性上升此时负载由输出电容供电MOS 管关断时电感电流不能突变续流路径是二极管到输出电容和负载此时输出电压等于输入电压叠加电感的反电动势。输出电压和输入电压的关系式是Vout Vin / (1 - D)D 是占空比。把这个公式变形就能算出目标电压对应的占空比D 1 - Vin / Vout5V 输入要升到 20V理想占空比 D 1 - 5/20 0.75。要升到 15VD 0.667。这说明占空比的变化范围要覆盖大约 0.7 左右到接近 0 的区间PWM 分辨率至少要能表达 2% 以内的占空比变化否则电压会一跳一跳的。选择 Boost 而不是 charge pump 的原因也很直接charge pump 的带载能力差输出电流超过几十毫安电压就垮掉而课设通常希望输出 0.5A 左右给后续负载供电反激则需要变压器绕制麻烦、仿真模型复杂对 51 单片机方案来说属于过度设计。Boost 拓扑结构简单、元件少、计算式直观是最适合这个题目的升压路线。2.2 关键参数计算与器件选型表电感量、MOS、二极管、输出电容开关频率的选择是第一道坎。常见的课设方案用 10kHz 或 20kHz原因是 51 单片机定时器中断模拟 PWM 时频率太高中断处理不过来。若用 12MHz 晶振标准 51 一个机器周期 1us20kHz 的 PWM 周期是 50us留给中断处理的时间只有 50 个机器周期C 语言写的中断服务程序加上现场保护和占空比比较逻辑很容易超时。所以我建议按 10kHz 做设计中断周期 100us时间宽裕得多代价是电感量要相应加大。电感量按纹波电流公式估算L Vin × D / (f × ΔIL)取 f 10kHzVin 5VD 0.75最大输出电流按 0.5A 计算取纹波电流 ΔIL 0.5A代入后L 5 × 0.75 / (10000 × 0.5) 0.00075H 750uH实际取标称值 1mH留出余量。如果坚持用 20kHz同样条件下算出来是 375uH取标称值 470uH 也可以。把这两档参数记牢后面写定时器初值、换仿真参数时都用得上。器件参数要求推荐型号参数依据电感1mH / 0.8A 以上工字电感或功率电感纹波电流 0.5A留 1.6 倍余量MOS 管Vds ≥ 40VVgs(th) ≤ 4VIRF540N / IRF3205最大输出 20V 二极管压降耐压留两倍二极管耐压 ≥ 40V开关速度快1N5819 / SS24普通整流管 1N4007 恢复时间太长必须用肖特基输出电容100uF~470uF 电解并联 0.1uF 瓷片电解电容 CBB抑制输出电压纹波电解电容负责低频瓷片负责高频采样电阻30kΩ 10kΩ 分压精密电阻20V 输出时分压到 5V适配 ADC 满量程MOS 管的选型这里埋着一个坑IRF540N 的 Vgs(th) 是 2~4V51 单片机引脚直接输出高电平只有约 4.5V扣除拉电流压降刚好擦着边。Proteus 仿真里模型是理想驱动看不出问题实物就可能在重载时 MOS 管不完全导通、发热严重。常见做法是加一级三极管推挽驱动把栅极电压拉到接近 VCC下文第 4 章会讲。输出电容的取值也要说明白。升压电路在 MOS 管导通期间完全靠电容维持输出电压电容太小电压跌落明显。按输出纹波要求估算100uF 到 470uF 是常见范围Proteus 仿真中电解电容的 ESR 模型不明显实物上 ESR 压降会成为纹波的主要来源因此实际板上必须在电解电容旁边并一个 0.1uF 瓷片电容吸收高频纹波。2.3 开环验证代码先让 PWM 波能稳定输出再谈闭环在还没有写 ADC 采样和 PID 之前第一步是让单片机输出一个占空比固定的 PWM用 Proteus 虚拟示波器确认波形正常。这个阶段的目标很单纯排除定时器配置错误、引脚接错、晶振频率不匹配这三类低级问题。常见的做法是用定时器 0 产生 10kHz 中断中断服务程序里对计数变量递增和占空比比较后翻转输出引脚。#include reg52.h #define PWM_PERIOD 100 // 10kHz: 100次中断为一个PWM周期 #define PWM_DUTY 75 // 占空比75%对应5V升20V的初始值 sbit PWM_OUT P1^0; unsigned int pwm_cnt 0; void Timer0_Init(void) { // 12MHz晶振12T模式定时器0每100us中断一次 TH0 0x9C; // 65536 - 100us / 1us 64536 0xFC18 TL0 0x18; TMOD 0xF0; TMOD | 0x01; // 定时器0方式116位手动重装 ET0 1; EA 1; TR0 1; } void Timer0_ISR(void) interrupt 1 { TH0 0x9C; TL0 0x18; pwm_cnt; if (pwm_cnt PWM_DUTY) { PWM_OUT 1; // 电感储能阶段 } else { PWM_OUT 0; // 电感释放阶段 } if (pwm_cnt PWM_PERIOD) { pwm_cnt 0; } } void main(void) { Timer0_Init(); while (1); }代码里的 PWM_PERIOD 取 100每 100 次中断构成一个 PWM 周期10kHz × 100us 1ms周期正确。PWM_DUTY 取 75 对应 75% 占空比。这两个参数是联动关系如果改了 PWM_PERIODDUTY 必须按比例重新算否则真实占空比会变。注意这里 PWM 引脚空闲时的电平状态PWM_OUT 默认输出 0占空比小于 100% 时都能正常出波。如果想输出低电平有效把 if 判断反过来即可。完成这个代码后在 Proteus 里接上虚拟示波器应该看到频率约 10kHz、高电平时间 75us 的方波这才能进入下一步闭环控制。3. 51 单片机产生可调 PWM定时器模拟方案与闭环控制流程3.1 用定时器中断模拟 10kHz PWM 的代码框架上一章的代码是固定占空比现在要把 PWM_DUTY 改成全局变量这样 PID 计算代码能实时修改它。实际项目里减法计数比加法计数更直观定义一个 PWM 周期计数器每个周期开始先输出高电平计数到当前占空比阈值后拉低。这种写法的好处是占空比变量不必在每个中断里做边界判断漏掉一次更新也不会产生异常波形。#include reg52.h #define PWM_PERIOD 100 #define PWM_MAX 90 // 占空比上限90%避免电感持续磁饱和 sbit PWM_OUT P1^0; volatile unsigned char pwm_duty 20; // 当前占空比0~100之间变化 volatile unsigned char pwm_cnt 0; void Timer0_ISR(void) interrupt 1 { TH0 0x9C; TL0 0x18; if (pwm_cnt pwm_duty) { PWM_OUT 1; } else { PWM_OUT 0; } pwm_cnt; if (pwm_cnt PWM_PERIOD) { pwm_cnt 0; } }这里必须用 volatile 修饰 pwm_duty否则 C51 编译器可能把它优化进寄存器导致主循环改值不生效。pwm_duty 的初值给 20 是为了安全第一次上电占空比从小往大调输出电压缓慢爬升避免 5V 输入直接按 75% 占空比冲击输出电容。上限 PWM_MAX 设为 90 同样是为了安全占空比超过 90% 后 Boost 电路工作在临界状态电感电流失控风险急剧增加而且 5V 升 20V 的理论占空比 75%90% 上限足够覆盖整个调压范围。3.2 ADC 采样与增量式 PID让 5-20V 输出随设定值走AT89C52 内部没有 ADC 模块这是 51 单片机做闭环控制必须解决的现实问题。常见的解决方案有两种一是换用带 ADC 的 STC 系列单片机12MHz 晶振下单片机型号依然是 51 内核程序不用大改二是在 Proteus 里外挂 ADC0832双通道 8 位串行 ADC正好一路测输出电压采样值一路测电位器设定值。课设和毕设用 ADC0832 更多因为 Proteus 元件库里直接有模型原理图画出来也直观。ADC0832 的控制时序是典型的 SPI 兼容模式拉低片选 CS时钟上升沿把通道选择位写入然后下降沿逐位读出数据。下面给出读单通道的函数。sbit ADC_CS P2^0; sbit ADC_CLK P2^1; sbit ADC_DI P2^2; sbit ADC_DO P2^2; // ADC0832的DI和DO共用一根引脚 unsigned char adc_read(unsigned char channel) { unsigned char i, dat 0; unsigned char ch channel ? 0x01 : 0x00; ADC_CS 0; ADC_CLK 0; ADC_DI 1; // 起始位 ADC_CLK 1; ADC_CLK 0; ADC_DI ch; // 通道选择0CH01CH1 ADC_CLK 1; ADC_CLK 0; ADC_DI 0; // SGL/DIFF位单端输入模式 ADC_CLK 1; ADC_CLK 0; ADC_DI 1; // 释放数据线后续转为读取 for (i 0; i 8; i) { ADC_CLK 1; dat 1; if (ADC_DO) dat | 0x01; ADC_CLK 0; } ADC_CS 1; return dat; }读取函数里最关键的是时序顺序不能乱起始位、通道位、单端模式位各占一个时钟周期之后才是 8 个数据读出周期。很多同学第一次用 ADC0832 时输出数据不对都是因为少送了单端模式位或者通道选择位顺序反了。调用时 adc_read(0) 读 CH0接输出电压分压后的采样值adc_read(1) 接设定电位器。8 位分辨率对应 5V 满量程每个码值约 19.5mV反映到 20V 输出端约 78mV 步进作为课设精度足够。3.3 闭环控制逻辑从占空比初值到稳压收敛闭环控制的流程分四步ADC 采样设定值和反馈值、计算误差、增量式 PID 更新占空比、限制占空比范围。流程图里要表达的就是这个循环。注意采样周期和 PWM 周期的关系PWM 是 10kHz采样周期不必那么快10ms 采一次就够了否则 PID 调节太快容易和 PWM 开关互相干扰。ADC 采样值还需要做滑动平均滤波连续采 8 次取平均滤掉开关噪声。#define Kp 15 #define Ki 3 int error_now, error_last; int delta_pwm; unsigned int set_value, fb_value, tmp_value; void pid_control(void) { error_now (int)set_value - (int)fb_value; delta_pwm Kp * (error_now - error_last) Ki * error_now; error_last error_now; if (delta_pwm 5) delta_pwm 5; if (delta_pwm -5) delta_pwm -5; if ((int)pwm_duty delta_pwm PWM_MAX) { pwm_duty PWM_MAX; } else if ((int)pwm_duty delta_pwm 10) { pwm_duty 10; } else { pwm_duty delta_pwm; } } void main(void) { Timer0_Init(); while (1) { set_value adc_read(1); tmp_value 0; for (unsigned char i 0; i 8; i) { tmp_value adc_read(0); } fb_value tmp_value 3; pid_control(); // 等待约10ms后进入下一轮采样 for (unsigned int j 0; j 5000; j); } }增量式 PID 的整型写法里Kp15、Ki3 不是凭空来的。误差的单位是 ADC 码值最大约 255Kp 乘上误差变化量后得到占空比增量。Kp 太大会导致占空比剧烈抖动输出电压在目标值附近来回冲Ki 太大则收敛慢且容易超调。从 15 和 3 开始调观察输出电压波形如果衰减振荡就同时减小两个系数如果响应太慢就适当增大 Kp。delta_pwm 限幅在 ±5 是抗积分饱和的手段防止占空比在电压误差大时猛跳这在 51 这种计算能力有限的平台上比完整抗饱和逻辑更实用。pwm_duty 的上下限设置也有讲究下限 10 是为了防止占空比过小时 Boost 输出电压低于输入电压上限 90 是保证电感不会因为占空比接近 1 而磁饱和。4. 在 Proteus 里把原理图、仿真图和波形一次跑通4.1 元件选型与 Proteus 元件名对照表Proteus 仿真和实物最大的差异是元件模型。Proteus 的 AT89C52 模型可以直接加载 Keil 生成的 HEX 文件双击单片机在 Program File 里指定路径即可。电感元件在 Proteus 里的默认模型没有饱和特性这意味着仿真中电感电流可以无限大而不会发热仿真波形看起来一切正常实物上同样的参数可能 5 秒就冒烟。元件对照表按电源、主功率、控制、显示四类整理照着画原理图不会乱。功能模块Proteus 元件名关键参数设置单片机AT89C52双击加载 HEX 文件晶振设为 12MHz功率 MOSIRF540NVgs(th) 默认 2~4V仿真用默认即可二极管1N5819肖特基二极管模型正向压降约 0.2V电感INDUCTOR双击设置 Inductance 为 1mR 设 0.1输出电容CAP-ELEC容量 220uF电压额定 25V采样电阻RES30k、10k 各一个分压比 4:1ADCADC0832接 AT89C52 的 P2 口设定电位器POT-HG电阻值 10k调节产生设定电压示波器OSCILLOSCOPE观察 PWM 输出和输出电压纹波4.2 Proteus 仿真搭建步骤与示波器观察点搭建顺序建议从左到右先放单片机最小系统再放 Boost 主回路最后接采样和 ADC。主回路接线是 Boost 电路最容易画错的地方正确的是电源正极接电感一端电感另一端接 MOS 管漏极和二极管阳极二极管阴极接输出电容正极和负载MOS 管源极接地输出电容负极接地。51 单片机的 PWM 引脚不能直接驱动 MOS 管栅极Proteus 仿真也需要在中间加一级三极管推挽常见做法是用一个 NPN 和一个 PNP 组成图腾柱PWM 信号同时接两个三极管基极NPN 的发射极接 PNP 的发射极作为输出两个集电极分别接 VCC 和 GND。三极管型号选 2N2222 和 2N2907Proteus 元件库里有现成的。接好之后给单片机加载 HEX点击左下角运行先看 P1.0 引脚的波形确认频率和占空比再看输出电容正极对地的电压万用表模式显示约 20V。示波器观察输出电压纹波时把通道 A 接输出端通道 B 接 PWM 引脚时间轴调到 1ms/格会发现输出波形稳定但带有锯齿状纹波这是正常的因为储能电容在 MOS 导通期间放电电压略有下降等到 MOS 管关断时又被电感电流补回去。仿真过程中改占空比可以用电位器旋转 POT-HG 改变 CH1 的设定值观察输出端电压跟随变化。如果输出电压和设定值相差较大先检查 ADC 两个通道的输入电压是否在 0~5V 范围内20V 输出经过 30k/10k 分压后应该正好是 5V。如果 ADC 数值不变大概率是 adc_read 时序里通道选择位顺序写错了。Proteus 仿真的优势在这里体现得淋漓尽致所有节点电压都能用探针直接测量不需要猜。4.3 仿真通过之后交付文档里值得写清楚的东西仿真通过后原理图、仿真图、源代码这三样安装文档直接截图保存即可但流程图和物料清单需要额外花精力。流程图建议按上一章的闭环控制逻辑画四个模块初始化、ADC 采样、PID 计算、PWM 输出更新用箭头连起来在 ADC 采样模块标注 10ms 周期延时在 PID 模块标注占空比限幅范围。物料清单要和生产成本对应起来写清楚每个元件的型号、参数、数量、参考单价电阻电容按整盘价格摊算MOS 管和电感单独列这张表既是答辩时老师必看的内容也是后续转实物采购的唯一依据。提示Proteus 仿真里跑通的是控制逻辑原理图里要画的栅极驱动三极管推挽电路不能因为仿真能跑就省略。答辩时老师最常问的就是「为什么这里加两个三极管」答不上来会很尴尬。常见回答是51 单片机引脚拉电流只有几百微安推挽电路提供瞬态充放电电流保证 MOS 管栅极电容能快速翻转。5. Boost 调试中的 5 个翻车现场现象、原因与排查顺序5.1 输出电压卡死在输入电压附近纹波还不小现象D 占空比已经设置到 70%输出电压却只有 5V 多一点也就是和输入电压基本相同示波器看到输出端有锯齿波但幅度很小。原因MOS 管根本没有开关动作或者开关频率异常。先查 PWM 引脚有没有波形用示波器探 P1.0如果 PWM 正常查栅极驱动三极管的供电和接线尤其是 PNP 管的集电极有没有接 VCC。另一个常见原因是单片机没有正确加载 HEX 文件程序根本没跑起来。解决顺序先确认 PWM 方波存在再确认 MOS 管栅极波形是方波而不是被拉平的直线最后查功率回路的接线。血泪经验是Proteus 里虚接的现象很少一旦出现先停下来重新检查每个节点的网络标号而不是反复改占空比参数。5.2 闭环之后电压来回抖甚至出现周期性的「呼吸」现象现象开环时输出稳定加上 PID 闭环后电压在目标值上下缓慢摆动摆动周期大约几百毫秒。原因PID 参数不匹配或者采样周期和 PWM 周期之间发生了低频耦合。这里的根源主要是 Kp 过大占空比每次调节幅度太猛输出电压好不容易靠近目标值又被反向修正过头。解决方法是把 Kp 减小一半Ki 暂时设为 0观察电压是否还在抖。如果 Ki 是零时不抖了说明积分项引入过大的相位滞后如果还在抖检查 ADC 采样是否用滑动平均滤波单个毛刺样本会直接干扰 PID 计算。另外注意 pid_control 函数里 delta_pwm 的限幅±5 这个值在 10 位占空比宽度里约占半级如果限幅放宽到 ±20系统大概率会振荡。5.3 仿真时 MOS 管波形正常输出电压却上不去现象示波器看 MOS 管栅极有漂亮方波源极接地漏极波形也是方波可输出电压就是比理论值低不少。原因电感参数不对。Proteus 的 INDUCTOR 元件默认电感量可能是 1uH 而不是 1mH。双击电感查看 Inductance 值这是最容易被忽略的参数。1uH 在 10kHz 开关频率下感抗只有 0.0628Ω电感根本存不住能量Boost 变成了一条纯二极管导通回路。解决把电感量改到 1mH仿真速度会变慢一点但波形立刻就正常了。电感量改完之后还要检查电感的串联电阻 R默认 0.1Ω 合理设置成 0 反而会让仿真电流大到失真。5.4 换了个元件库的 MOS 管波形直接断崖现象原理图里的 IRF540N 没动手抖删掉重新放置了一个同型号结果输出电压从 20V 掉到 12V。原因Proteus 元件库里有多个封装或模型变体重新放置后可能默认参数不同比如 Vgs(th) 从 2V 变成 4V51 单片机的驱动电平就推不动 MOS 管了。解决右键 MOS 管查看属性里的 Model Parameters把 Vto 参数改回 2V 左右或者直接删掉换成统一型号。这个坑在 Proteus 8.17 等新版本里尤其常见因为新版本默认加载的模型库和旧版不一样老工程文件打开后元件参数会悄悄变化。所以方案文档里一定要写明每个元件的完整参数设置不能只写型号。5.5 实物上电电感吱吱叫仿真却一切正常现象照抄仿真参数做了实物板子一上电电感就发出高频叫声输出带载能力明显不足。原因开关频率 10kHz 正好落在人耳最敏感的听觉范围电感磁芯在 PWM 激励下产生机械振动是正常物理现象但说明参数选得不合适常见解决方向有提高开关频率到 20kHz 以上逃出音频范围或换用工字电感和灌封电感降低振动幅度。更严重的情况是电感饱和IRF540N 导通时电感电流线性上升如果电感量偏小或负载过重电流超过磁芯饱和点电感量骤降续流阶段电压就撑不起来。解决方法是重新按输出功率计算电感量或增加电感电流额定值。这也是仿真永远给不了的信息仿真电感没有饱和曲线电流标到 10A 波形依然完美实物电感 1A 就冒烟。6. 快速验证这套方案值不值得做五个电压点的实测与调参习惯判断这套升压斩波方案是否真的可靠不能只看 Proteus 仿真波形要按五个输出点实测闭环性能。以 5V 输入、设定输出分别为 5V、10V、15V、20V 的电压点做一组快速验证记录每个点的静态误差和动态响应。需要一个可调电子负载或功率电阻一个万用表示波器看纹波。设定输出电压理论占空比实测允许误差满载输出电流判定标准5V0%±0.2V0.5A占空比接近下限此时实际是二极管直通10V50%±0.3V0.5A占空比在中间区间闭环最容易稳定15V66.7%±0.4V0.5A电感电流连续模式工作20V75%±0.5V0.5A最大升压比关注 MOS 管温升每个电压点先空载调电位器让电压稳定再突加 0.5A 负载记录输出电压跌落幅度和恢复时间。恢复时间在 100ms 以内、跌落不超过 5%说明 PID 参数和输出电容配合得当。如果恢复时间过长优先增大 Kp如果跌落过大优先增大输出电容而不是调 PID。我的个人经验是拿到这个方案第一件事不是改代码而是把乘法计算全部换成整数运算把 PID 系数量化成整数51 的浮点库很慢10ms 采样周期能跑但会觉得拖沓性能余量全被吃掉了。另一个习惯是每个参数改完都做一个记录表占空比初值、Kp、Ki、电感量、开关频率写清楚不然一天调下来就忘了哪个组合是最优的。最后补充一个细节问题排查时先用示波器同时看 MOS 管栅极波形和输出电压波形确认两者关联后再动手改代码不要「盲调」否则经常会把已经正确的参数改坏。希望这些经验能帮你少走些弯路也希望这套 51 单片机的升压斩波方案能成为你理解功率电子和闭环控制的起点。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑