news 2026/9/15 16:57:41

Proteus仿真数控直流稳压电源:从元件选型到闭环调试全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Proteus仿真数控直流稳压电源:从元件选型到闭环调试全流程

简介:一份面向电子、嵌入式初学者的数控直流稳压电源Proteus仿真与程序资料包,围绕数字控制电压稳定与调节的核心思路,完整覆盖原理图设计、单片机选型、电压采样、D/A输出及显示交互等环节,尤其适合课程设计、毕业设计或实验室电源项目快速入门与二次开发。压缩包共27个文件,主体包含Proteus仿真工程(DSN/LYT)、Keil工程源码(C/A51/uv2)、编译链接产物(hex/obj/lst)以及多份CADCAM工艺文件与使用说明,整体仅109KB,轻量便于下载。目前已有109人学习使用。包内不仅提供可运行的稳压电源仿真模型与控制程序源码,还收录了启动代码、文本源程序及烧录文件,配合详细说明txt,可对照梳理电压设定、闭环调节、过压/欠压/过流保护等关键逻辑,让硬件设计与软件编程同步验证。

1. 把数控直流稳压电源的调压逻辑在Proteus里先跑一遍

“数控直流稳压电源”这个标题的关键词不是稳压电源,而是“数控”。数控意味着输出电压不再靠手工旋转电位器,而是由单片机计算目标电压,经过DAC或PWM把数字量变成模拟参考信号,再靠误差放大器和调整管完成功率输出,最终用反馈把实际输出电压锁定在设定值附近。Proteus仿真是在实物焊接之前,把按键输入、LCD显示、DAC转换、运放与功率管的闭环链路完整验证一次。面向的读者很明确:做课程设计的电子专业学生、需要快速验证电源控制算法的硬件工程师,以及希望把仿真工程整理成完整交付资料的人。这篇按选型、画图、写程序、验证的顺序展开,全部能在proteus 8 professional中复现。

2. 数控直流稳压电源的架构拆解与仿真元件选型

2.1 一条被反复验证的设计主线:MCU加DAC加串联调整管

任何数控直流稳压电源都分成数字控制、参考生成、功率输出三个部分。数字控制是单片机,负责按键采集、LCD显示和电压设定值计算;参考生成把数字量映射成模拟电压;功率输出用误差放大器加调整管实现。三部分连成一个环路,输出电压经过分压电阻采样回误差放大器的反相端,与DAC送出的参考电压比较,环路稳定后输出电压就等于DAC参考电压乘以反馈分压比。

在Proteus里,数字和模拟部分的仿真时间尺度不同。单片机的指令周期是微秒级,运放和调整管是连续时间模型,两者的衔接点就在DAC输出端。数字量写入DAC后,DAC输出的模拟电流需要经过运放才能到达调整管基极,如果直接用单片机IO口驱动,仿真可能不报错,但电压值会与计算值偏差很大。原因是单片机IO口驱动能力有限,而运放输入端的偏置电流又会叠加到DAC输出上,改变了参考电平。

常见的做法是把DAC输出先经过一级电压跟随器,再送给误差放大器。电压跟随器输入阻抗极高,可以隔离后级对DAC的负载效应。我一般会加这一个缓冲级,哪怕多占一个运放单元,调试时间能少很多。

2.2 Proteus里选元件:库名称与实物型号的对应关系

在“proteus元件库”里搜索元件,不能完全按实物型号直接找。Proteus的模型库按仿真模型组织,很多型号需要用兼容型号代替,例如STC89C52要用AT89C52,LCD1602要用LM016L。只要引脚兼容、指令集一致,仿真结果就有参考价值。

电路角色实物型号Proteus搜索关键词注意事项
单片机STC89C52AT89C52引脚兼容,KEIL里器件也选AT89C52
DACDAC0832DAC0808同为电流输出型,外接运放转电压
运放LM358LM358单电源供电时输出最低约0.7V
调整管TIP41CTIP41CNPN型,注意C/E极性不要接反
LCDLCD1602LM016L驱动时序一致,16脚接口
基准源TL431TL431给DAC提供稳定的2.5V参考电压

选型时最容易混的是ADC0808与DAC0808,两个元件名字只差一个字母,引脚数相同,但一个是模数转换器一个是数模转换器。按下“A”键在元件目录里定位时,要注意元件框上的功能描述,把DAC接到单片机的P0口,把ADC接到带比较器的输入通道,接反了程序再对也出不了正确电压。

2.3 电压/电流指标的确定:先看输入,再定输出范围

做仿真之前先定几个数字:输出电压0到12V连续可调,步进0.1V,最大输出电流500mA。这些数值不高,对课程设计和通用仪器用途完全够用,也处于8位DAC和单运放容易实现的区间。

输入电压要选15V而不是12V,这是很多人第一次仿真做出电压偏低的原因。调整管存在饱和压降,误差放大器输出到基极之间还有一个0.7V的PN结压降,12V输入给12V输出几乎没留任何余量。改成15V后,即使调整管压降2V左右,输出仍能稳定在12V附近。这个取舍在原理图阶段就要定下来,后面再改电源电压,所有运放工作点都要重算。

步进0.1V对8位DAC来说很容易。12V范围分成120个步进,8位DAC有255个编码,每个步进对应约2.1个编码值,换算用整数运算就能完成,不需要浮点,程序里也不会出现累积误差超过一步的问题。

2.4 先做开环验证,再接入单片机程序

直接在原理图上连接MCU、DAC、运放和调整管,然后运行仿真,很多情况下输出电压根本对不上设定值。这未必是程序错,而是模拟链路的参数没有对齐。为了隔离问题,我习惯先做开环验证:给DAC一个固定编码,看功率级输出电压是否和理论值一致。

// 开环验证时固定DAC编码,方便对比电压表读数 // 编码30对应理论输出电压: // 30 * 10.0V / 255 * 1.2 = 1.41V #define FIXED_DAC_CODE 30 void dac_openloop_test(void) { P0 = FIXED_DAC_CODE; // 写死DAC输入 DAC_ILE = 0; // 输入锁存使能 DAC_CS = 0; DAC_WR = 0; DAC_WR = 1; // 产生写信号上升沿 DAC_CS = 1; DAC_ILE = 1; }

在Proteus的虚拟电压表上,如果读出值与理论值1.4V基本吻合,说明模拟链路正常。如果偏差超过0.2V,依次检查DAC参考电压、运放电源电压和反馈分压电阻的阻值。确认这部分没问题后再接入按键和显示程序,故障排查起来容易得多。

3. 在Proteus里搭一套可仿真的数控直流稳压电源原理图

3.1 最小系统:AT89C52复位电路、晶振与电源分配

先从Proteus元件库中取出AT89C52、12MHz晶振、两个22pF电容、一个10kΩ电阻和一个10μF电容。复位电路采用上电自动复位:RST引脚经10kΩ下拉到地,经10μF电容接VCC。晶振两个引脚各接22pF电容到地,双击晶振元件把频率改为12M。单片机的31脚EA要接高电平,否则程序从外部ROM读取,仿真中表现为LCD无任何反应。

电源网络在原理图里分成三组标注:5V数字电源供单片机、LCD和按键上拉;15V模拟电源供运放和调整管;如果误差放大器需要负电源,再加一路-5V。Proteus中的电源符号不会自动和芯片电源引脚连通,必须用导线把每个芯片的VCC和GND引到对应的网络标号上。

这里容易忽略的是LM358的正负电源引脚。在仿真模型里如果不接电源,运放输出处于高阻状态,输出电压会跟着负载漂动。建议在原理图中放三处电压探针,分别标记为V_DIG、V_ANA、V_NEG,调试时直接点探针就能读数,不用每次挂电压表。

提示:AT89C52的EA脚悬空时,部分版本仿真模型默认读取外部ROM,程序不执行但晶振波形正常,这是排查“最小系统没跑起来”要优先检查的项目。

3.2 用DAC0808还是PWM滤波:两种参考电压生成方式对比

参考电压生成是数控电源中最值得提前选型的环节。DAC0808是并行输入的电流输出型DAC,精度高,建立速度快;PWM加RC滤波只需一根IO,原理简单,但纹波和响应时间都不如DAC。

对比项DAC0808PWM加RC滤波
IO占用8个数据IO加3个控制IO1个IO
输出精度8位,误差小于±1LSB受RC精度和占空比影响
建立时间约100ns毫秒级
纹波水平低,取决于参考电压与PWM频率和RC时间常数有关
仿真调试难度连线多但数据稳定连线少,滤波器参数要试

从资料完整性角度讲,DAC0808方案更规范,输出电压不容易被负载拉偏。如果你的工程里已有一份dac.c驱动文件,就按DAC0808搭建;如果只想快速验证控制逻辑,先用PWM加RC滤波,后面再替换成DAC。两种方案在Proteus中都不会仿真报错,但PWM方案在输出低电压时占空比小,RC滤波后的纹波相对比例更大,这一点用示波器能直接看出来。

3.3 放大器与调整管相位:把8位编码换算成实际电压

DAC0808输出的是电流,需要外接运放转成电压。一种常用接法是运放反相端接DAC电流输出,反馈电阻取5kΩ,同相端接地,此时DAC全量程输出电流2mA,经过I-V转换后得到0到10V参考电压。这一级输出的电压再送误差放大器同相端。

// 换算参数:8位DAC满量程255 #define DAC_VREF 10.0 // DAC满量程对应10V参考电压 #define DIV_RATIO 1.2 // 输出分压比 (R1+R2)/R2 // 实际输出电压 Vout = N * 10.0 / 255 * 1.2 // 编码N=200时,Vout约等于9.41V,可在虚拟电压表上验证

调整管接法是误差放大器输出经1kΩ限流电阻接TIP41C基极,TIP41C集电极接15V电源,发射极输出到负载,负载另一端接地。反馈点从发射极引回,通过两个电阻分压后接到误差放大器反相端。放大倍数的设置就是DIV_RATIO对应的1.2倍,这样10V参考能放大到12V满量程输出。

相位和极性是整个原理图最容易出错的地方。如果误把分压网络接到同相端,环路变成正反馈,仿真中调整管会直接饱和,输出跳到接近15V。用虚拟电压表测量一个固定DAC编码,如果输出不是设计值而是电源电压,先交换运放两个输入端的接法,不要先改代码。

3.4 在仿真器上必须调整的几个默认参数

Proteus的仿真参数并不默认适合电源电路,有三项每次都要改。第一项是仿真步长,在System菜单的Set Simulation Options里把步长从默认的50ns改到1μs,否则整个模拟环路的仿真时间会被拉得很长,按键交互反应很慢。第二项是电容的初始电压,在元件属性里把Initial Voltage设为0,避免上电瞬间电容充放电造成运放工作点偏移。第三项是示波器时基,数控电源启动过程在几十毫秒内,把Time/Div设在50ms到200ms之间,可以看到参考电压逐级建立的过程。

虚拟示波器的通道设置也要提前做好。如果只关心直流输出,用DC耦合,探头放到调整管发射极测试点;如果要观察纹波,用AC耦合滤掉直流分量,灵敏度调到50mV每格。把DAC输出、误差放大器输出、最终输出三个通道同时抓取,哪个节点拉低了电压一目了然。

4. 程序资料怎么对应仿真图:按键、显示与DAC/ADC闭环

4.1 程序的分文件组织:main、key、lcd、dac、adc

“程序资料”意味着交付的是一个工程而不是单个源码文件。我习惯按功能把Keil工程拆成五个文件:main.c负责主循环调度,key.c做按键扫描消抖,lcd.c驱动1602显示,dac.c处理DAC编码换算与写入时序,adc.c负责读取输出电压做校准。这样的结构在Proteus仿真时完全适用,Keil分段编译后生成同一个hex文件加载到AT89C52,仿真器只认hex,不关心源码怎么组织。

分段的好处是排查问题快。比如只保留main和dac,跑一段开环测试,就能判断是按键问题还是DAC问题;显示不正常时单独测lcd初始化函数,避免所有模块混在一起互相干扰。每次重新编译后,把hex文件路径指向工程Output目录即可。

4.2 电压设置的查表与换算:从目标电压到DAC编码

设定电压到DAC编码的换算是程序里的核心逻辑。以0到12V、步进0.1V为例,设定值用整数保存,范围0到120,显示时把整数除10得到整数部分,取余得到小数部分。DAC编码的换算用整数乘法实现,51核不带FPU,浮点运算是浪费。

// dac.c 电压编码换算函数 // 输入vol_01v:以0.1V为单位的设定电压,0~120 // 返回值:写入DAC0808的8位编码 unsigned char dac_vol_to_code(unsigned char vol_01v) { unsigned int enc; // 编码 = vol_01v * 0.1 / (10.0/255*1.2) // = vol_01v * 2.125 // 简化成整数:vol_01v * 213 / 100 enc = ((unsigned int)vol_01v * 213u) / 100u; return (unsigned char)enc; } void dac_update(unsigned char dac_code) { P0 = dac_code; // 数据总线 DAC_ILE = 0; // 使能输入锁存 DAC_CS = 0; DAC_WR = 0; // 写信号拉低 DAC_WR = 1; // 上升沿锁存数据 DAC_CS = 1; DAC_ILE = 1; }

这里把浮点和除法都换成整数运算。乘数213和除数100来源于换算公式的定点化,误差在千分之一以内,对8位DAC来说足够。需要注意unsigned int的参与,因为vol_01v * 213在最大设定值120时会得到25560,超过单字节范围,必须先转成16位再除。

按键扫描放在主循环里,检测到按键按下后延时10ms消除抖动,再判断是加键还是减键,随后更新vol_01v并限制在0到120之间。每一次键值变化都调用dac_update刷新输出,用户就能在电压表上看到逐档跳变。

4.3 用ADC反馈读当前输出电压,做简易校准

DAC输出属于开环控制,受元件精度影响,如果希望显示值和实际值严格一致,需要加ADC采样做闭环校准。ADC0809读取输出分压点的电压后,通过比例关系反推出实际输出电压。

// adc.c 读取ADC0809通道0 sbit ADC_ALE = P2^5; // 地址锁存 sbit ADC_START = P2^6; // 启动转换 sbit ADC_EOC = P2^7; // 转换结束信号 unsigned char adc_read(unsigned char channel) { P1 = channel; // 选择模拟通道 ADC_ALE = 1; ADC_ALE = 0; // 锁存通道地址 ADC_START = 1; // 启动转换 ADC_START = 0; while (ADC_EOC == 1); // 等待EOC变低,转换完成 return P1; // 读取结果 }

ADC0809的读取时序有两个易错点:通道地址要在ALE下降沿前稳定,P1口既用来输出通道号又用来读结果,所以启动转换后不要再往P1写数据,否则读回的值不是当前通道结果。仿真中如果EOC一直为高,程序会卡在while循环里,此时检查P2.7和ADC_EOC引脚是否确实连在一起,再确认ADC0809的仿真模型是否选对。

利用ADC结果做校准的方法是:每100个主循环读一次输出电压,与设定值比较,如果固定偏差0.2V,就在dac_vol_to_code的返回值上增加一个修正量。对Proteus仿真来说这不是必须的,但一旦要把仿真资料转成实物,这段闭环程序可以直接复用。

4.4 Proteus与Keil联调:加载hex文件和调试流程

在Keil里编译完成后,打开Proteus原理图,右键AT89C52,在Edit Component对话框的Program File栏选择生成的hex文件。Crystal Frequency改为12MHz,点击运行。如果LCD无显示,按照最小系统、晶振、复位、电源的顺序排查,不要一上来改程序。

错误现象常见原因处理方式
仿真运行但程序无反应hex路径含中文或空格换成英文路径重选
修改源码后行为不变固件未重新加载右键芯片重新选hex
电压跳变不稳定晶振频率不一致统一改为12MHz
程序卡死在循环里ADC EOC信号未连接检查P2.7连线

联调时一个容易忽略的细节:Keil修改代码后重新编译,Proteus不会自动重载hex。要停止仿真后重新选择一次hex文件,或者直接用Debug菜单里的固件加载功能。如果需要单步调试,Proteus的Debug选项可以配合Keil做源码级跟踪,但仿真速度会慢很多,适合定位按键逻辑这类分支问题,不适合看完整的开关机过程。

5. 仿真跑通后的下一步:负载调整率、纹波与实物移植的验证清单

5.1 用虚拟仪表观察负载调整率与纹波

验证数控直流稳压电源的关键指标,在Proteus的Virtual Instruments面板里找到DC Voltmeter和Oscilloscope。DC Voltmeter并联在输出端,可变电阻从1kΩ拖到100Ω,记录电压表读数。负载调整率用空载电压减满载电压,再除以满载电压乘以100%,合格值一般不超过0.5%。如果超过,优先检查反馈分压电阻的精度和误差放大器的增益设置。

观察纹波时用AC耦合,Time/Div调到50us到100us,灵敏度50mV每格。如果看到幅值较大的锯齿波,说明RC滤波时间常数不够,增大滤波电容容值再看是否收敛。这里的规律是:输出设定电压越低,PWM方式产生的纹波比例越大,DAC方式基本不受影响。

5.2 仿真里不报错不代表实物能上电:四级检查

仿真通过之后,要把虚拟环境和真实器件的差异过一遍。

  • 第一级,电源引脚检查:Proteus中部分芯片电源引脚隐式连接,真实电路里要逐一核对AT89C52的40脚VCC和20脚GND,LM358的8脚和4脚;
  • 第二级,调整管功耗:TIP41C在仿真中不会烧,实物工作在12V、500mA时管子功耗接近6W,必须加散热片;
  • 第三级,电阻精度:仿真电阻可以随意取值,实物5%精度的电阻会明显偏离计算值,反馈分压电阻至少用1%金属膜电阻;
  • 第四级,DAC锁存时序:DAC0808与实物DAC0832的控制引脚定义不完全相同,程序里P2口的控制脚要对照实际芯片手册调整。

5.3 交付资料归档时建议包含的文件

一套能直接交付的“程序资料”,文件组织参考下表。仿真工程、源码工程、说明文档三者缺一不可,说明文档是整个压缩包里最容易被忽视却最有价值的部分。

文件或目录内容说明
dcp_sim.pdsprjProteus仿真工程包含原理图和虚拟仪表设置
keil/Keil工程目录含.c/.h和hex,去掉临时文件
readme.md接线与参数说明电压范围、步进值、换算公式
datasheet/芯片手册每片主要器件的PDF归档

最后把Proteus原理图中用到的电源电压、晶振频率、DAC参考电压三个参数记录到readme的开头。任何人重新打开这个工程,按这三项恢复环境就能跑起来,不需要反复试错。做到这一步,一套数控直流稳压电源的Proteus仿真与程序资料才算完整。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 16:55:15

如何从源码编译 JuiceFS Python SDK 得到可用的 whl 包

如何从源码编译 JuiceFS Python SDK 得到可用的 whl 包 【免费下载链接】juicefs JuiceFS is a distributed POSIX file system built on top of Redis and S3. 项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs JuiceFS Python SDK 适用于无法使用 FUSE 挂载…

作者头像 李华
网站建设 2026/9/15 16:53:08

多项式回归实战指南:从PolynomialFeatures到过拟合规避

1. 从线性到曲线的第一步:为什么需要多项式回归很多人在用 sklearn 做完线性回归之后会有一个共同的感觉:明明训练集和测试集的分都还可以,但把拟合结果画出来一看,总觉得哪里不对劲。最常见的情况是,数据明显呈弯曲趋…

作者头像 李华
网站建设 2026/9/15 16:53:07

Loop 快捷键冲突排查指南:从定位、改绑到长期维护的完整清单

Loop 快捷键冲突排查指南:从定位、改绑到长期维护的完整清单 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 用 Loop 做 Mac 窗口管理时,快捷键按了没反应、触发了不相干的窗口动…

作者头像 李华
网站建设 2026/9/15 16:53:05

基于React的通用视频播放器插件设计:HLS流接入与工程实践

1. 项目背景与整体方案设计做前端的这么多年,我一直对视频播放这块又爱又恨。爱的是它带来的交互感和信息密度,恨的是兼容性、流协议、播放体验这些坑,随便踩一个都能让人排查半天。这次要说的项目,是我在自己维护的前端工程体系里…

作者头像 李华
网站建设 2026/9/15 16:51:49

Arm C2集群与AI原生GPU深度解析:AI推理性能提升70%背后的架构演进

Arm这次官宣,朋友圈直接炸了。全新C2 CPU集群,AI性能暴增70%,紧跟其后还有一款号称“AI原生”的GPU——组合拳一出,几乎所有做服务器、做边缘AI、做端侧推理的群都在刷屏。说实话,这两年Arm在服务器市场已经不再是“能…

作者头像 李华