ARTICLE DETAIL

资讯详情

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

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

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要用AT89C52LCD1602要用LM016L。只要引脚兼容、指令集一致仿真结果就有参考价值。电路角色实物型号Proteus搜索关键词注意事项单片机STC89C52AT89C52引脚兼容KEIL里器件也选AT89C52DACDAC0832DAC0808同为电流输出型外接运放转电压运放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 // 输出分压比 (R1R2)/R2 // 实际输出电压 Vout N * 10.0 / 255 * 1.2 // 编码N200时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脚GNDLM358的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仿真与程序资料才算完整。本文还有配套的精品资源点击获取
返回列表