1. 项目概述:从模拟旋钮到数字按键的电源进化
大概四十年前,我还是个十几岁的少年,照着当时一本叫《Elektuur》(现在叫《Elektor》)的荷兰电子杂志,捣鼓出了我人生中第一台双路线性电源。那台电源用两个电位器,一个调电压,一个调电流,陪我度过了无数个折腾电路的日夜。但岁月不饶人,电位器这东西,用久了难免接触不良,导致输出电压飘忽不定,调个电压跟开盲盒似的,实在让人头疼。这些年,我的主业和爱好都转向了嵌入式软件开发,尤其喜欢用PIC单片机和JAL语言。看着角落里这台老伙计,我萌生了一个想法:为什么不把这两个老旧的模拟电位器,换成由单片机控制的数字系统呢?于是,这个“数字控制线性电源”的项目就诞生了。
简单来说,这个项目就是给一台经典的、基于LM723的线性电源装上一个“数字大脑”。核心目标是用PIC微控制器(MCU)和其内置的数模转换器(DAC),完全取代传统的机械电位器,实现电压的数字化设定、存储和调用。最终实现的电源,输出电压范围在2.4V到18V之间,最大电流2A,并且增加了输出电压异常保护功能。它非常适合电子爱好者、学生或者需要一台稳定、可精确设定电压的桌面电源的工程师,无论是给单片机开发板供电,还是测试一些小功率电路,都非常顺手。
2. 核心设计思路与方案演进
这个项目并非一蹴而就,它经历了两个主要版本的迭代,这恰恰反映了嵌入式开发中常见的“设计-验证-优化”过程。理解这个演进过程,比直接看最终方案更有价值。
2.1 初始方案(Rev 0):数字电位器方案
最初的思路最直接:用数字电位器(Digital Potentiometer)模拟机械电位器的功能。我选择了PIC16F1823作为主控,搭配一颗X9C103(10kΩ,100步进)数字电位器。
为什么这么选?
- 路径依赖与最小改动:原电路的核心是LM723,其输出电压由参考电压(Vref)和外部电阻分压网络决定。用数字电位器直接替换原来的调压电位器,对原有模拟电路的改动最小,理论上最稳妥。
- 接口简单:X9C103采用简单的三线串行接口(片选CS、增减信号U/D、脉冲INC),与MCU的GPIO连接非常方便,编程控制也直观——发送脉冲信号就能移动滑片位置。
- 功能实现:通过6个按键(开关、升压、降压、3个预设)来控制数字电位器的阻值,进而改变LM723同相输入端的电压,实现输出电压的调节。预设值存储在PIC的EEPROM中。
这个方案的潜在问题:虽然想法很好,但数字电位器有个固有缺陷:它是开环的。MCU可以发送指令让它移动到某个位置,但无法读取它当前的实际位置。在系统上电或从预设恢复时,MCU只能“相信”自己发送过的指令,而无法确认电位器滑片是否真的精准到位。在实际测试中,偶尔会出现恢复的电压值与之前存储的值有微小偏差的情况,虽然不影响一般使用,但对于追求精确和稳定的电源来说,这是个心病。
2.2 优化方案(Rev 2):MCU内置DAC方案
为了解决开环控制的问题,我决定放弃数字电位器,转而利用PIC单片机自身更强大的外设。
方案升级的核心逻辑:
- 从开环到闭环感知:数字电位器方案只解决了“数字设定”,但无法“数字感知”输出电压。要增加保护功能(如过压、欠压关断),必须能测量实际输出电压。这需要用到模数转换器(ADC)。
- 从间接控制到直接控制:既然已经用了ADC来测量,何不更进一步,直接用MCU产生一个模拟控制电压给LM723呢?这样,控制回路完全数字化,精度和可靠性更高。
- 芯片选型升级:PIC16F1823只有5位DAC,分辨率太低(32级),电压调节步进会很大(约0.5V),不实用。因此,我换成了PIC16F1765,它集成了一个10位DAC,分辨率达到1024级,对于0-18V的范围(实际控制电压范围更小),步进可以做到非常精细(约0.02V),完全满足需求。同时,PIC16F1765的ADC模块性能也足够用于电压监测。
Rev 2方案的最终形态:
- 主控:PIC16F1765。
- 核心控制:利用其10位DAC输出一个0-Vref的模拟电压,直接连接到LM723的误差放大器同相输入端(原电位器滑片位置)。
- 电压监测:利用其ADC,通过电阻分压网络采样电源的实际输出电压。
- 保护逻辑:软件持续比较ADC采样值(实际电压)与DAC设定值(目标电压)。如果实际电压持续偏离目标值超过一定阈值(如0.2V),则判定为异常(可能负载短路或调整管击穿),MCU会立即关闭LM723的输出使能,实现保护。
- 存储介质:PIC16F1765没有独立EEPROM,但可以使用其高耐久闪存(High Endurance Flash)来存储预设电压值和保护功能开关状态。
这个方案的优雅之处在于,它用一颗MCU的两个主要模拟外设(DAC和ADC),构建了一个完整的“数字设定-模拟执行-数字反馈”的闭环控制系统,不仅实现了数字化控制,还附加了智能保护功能,系统的整体鲁棒性大大增强。
注意:从Rev 0到Rev 2的硬件改动其实很小,主要是芯片替换和移除/增加少量外围元件。这体现了在已有PCB上“小改大升级”的工程思维,降低了硬件迭代成本。
3. 硬件电路深度解析与关键器件选型
一套稳定的电源,硬件基础是关键。下面我们拆解Rev 2版本的电路,看看每个部分是如何工作的。
3.1 功率变换与调整主回路
这是电源的“肌肉”,负责能量转换和最终输出。
- 变压器:输入220V/110V交流,输出双18V AC(中心抽头可选),容量建议≥40VA(18V2A1.2≈43.2VA)。我当年用了环型变压器,效率高、漏磁小,但成本也高。对于这个项目,优质的E型变压器完全足够。
- 整流滤波:采用B80C3300/5000这类3A以上的桥堆进行全波整流,得到脉动直流电。然后经过一个4700μF/40V的电解电容进行滤波。这个电容的取值很关键,它决定了电源的纹波系数。计算公式可以简化为:C ≈ I_load / (2 * f * V_ripple)。其中I_load是最大负载电流(2A),f是整流后的脉动频率(100Hz),V_ripple是允许的最大纹波电压(比如设定为0.5V)。计算下来约需20000μF,但这是理论最小极值。实际上,由于LM723及其后续调整管的存在,电源的纹波抑制能力很强,4700μF在实践中对于2A负载已经能提供非常平滑的直流。
- 调整管与电流采样:主调整管使用经典的2N3055,这是一颗NPN功率三极管,需要安装在足够大的散热器上。其基极电流由LM723的输出驱动管提供。电流采样电阻**R9(0.33Ω/5W)**串联在输出负端与地之间。当输出电流I_out流过时,会产生压降V_sense = I_out * 0.33Ω。这个电压被送到LM723的电流检测引脚。当V_sense超过LM723内部设定的阈值(约0.65V)时,即I_out > 0.65V / 0.33Ω ≈ 2A,芯片会启动限流保护,降低输出电压以维持电流恒定。这就是2A限流的由来。
3.2 电压基准与误差放大核心(LM723)
LM723是这套方案的“心脏”,一颗历经时间考验的线性稳压IC。
- 内部基准:它自带一个温度补偿的7.15V精密基准源,精度和温漂性能都不错,为整个系统提供了稳定的电压参考。
- 工作模式:在本电路中,它工作于“串联稳压器”模式。其内部误差放大器的同相输入端(Pin 5)接收来自MCU DAC的控制电压(V_control)。反相输入端(Pin 4)通过电阻分压网络(R12, R13)连接到电源输出端(V_out),这是电压反馈。
- 稳压原理:误差放大器会不断比较V_control和反馈电压V_feedback。如果V_out由于负载变化而降低,导致V_feedback < V_control,误差放大器输出就会升高,驱动2N3055导通更深,使V_out回升,直到V_feedback再次等于V_control,达到动态平衡。输出电压V_out与V_control的关系由反馈电阻决定:V_out = V_control * (1 + R12/R13)。通过精心选择R12和R13的比值,可以将DAC的输出电压范围(例如0-3.3V)映射到我们需要的2.4V-18V输出范围。
- 关断功能:LM723的V+引脚(Pin 12)通过一个晶体管T1(BC547)连接到主电源。当MCU需要关闭输出时,只需拉低T1基极,T1截止,LM723失电,输出电压立即变为0。这是一个安全且有效的软关断方式。
3.3 数字控制核心(PIC16F1765)及其外围电路
这是项目的“大脑”。
- MCU供电:由主变压器次级绕组经整流滤波后,先通过一个78L18稳压到18V,再通过一个78L05稳压到5V,为PIC和所有数字电路供电。将78L15换成78L18是为了降低前级稳压器的压差和功耗。
- DAC输出电路:PIC16F1765的DAC模块输出(通常与某个RA引脚复用)直接连接到LM723的Pin 5。为了滤除可能的高频噪声,可以在DAC输出端对地接一个100nF的陶瓷电容。DAC的参考电压(Vref)通常选择稳定的内部带隙基准或外部基准,这里使用内部基准即可,确保其输出稳定。
- ADC采样电路:电源输出电压(V_out)经过一个高精度电阻分压网络(例如,将18V分压到MCU的ADC量程内,如0-3.3V),连接到PIC的某个ADC输入通道。分压电阻的精度和温度系数会影响测量准确性,建议使用1%精度的金属膜电阻。同样,ADC输入端也需要加一个100nF电容滤波。
- 按键输入电路:6个按键一端接地,另一端通过4.7kΩ上拉电阻连接到PIC的GPIO。按键未按下时,GPIO被上拉到高电平(5V);按下时,变为低电平。这种“低电平有效”的设计是数字电路的常见做法。软件上需要做去抖处理。
- 指示与扩展:可以预留一个GPIO驱动LED,用于指示电源开关状态或故障报警。
实操心得:PCB布局的“分”与“合”在这个项目中,大功率部件(2N3055、4700μF电容)和主控板是分离的。这是线性电源PCB布局的黄金法则:热源、大电流路径必须与敏感的模拟/数字电路物理隔离。2N3055及其散热器会产生大量热量,如果放在主控板旁边,热量会导致电解电容寿命缩短,并可能引起电阻阻值漂移、芯片参数变化。将功率部分单独放置或远离,并用粗导线连接,能极大提升系统的长期稳定性。我的PCB上只集成了LM723、MCU、小信号电阻电容等,发热小,干扰也小。
4. 软件设计与关键逻辑实现
硬件搭好了台,软件才是让电源“智能”起来的灵魂。整个软件的核心是一个状态机,循环处理按键扫描、电压控制、电压监测和存储管理。
4.1 主程序流程与状态管理
软件上电后,首先进行初始化:
- IO与模块初始化:配置DAC、ADC、按键GPIO(带上拉输入)、控制输出GPIO等。
- 安全启动:确保控制LM723关断的晶体管T1的基极为高电平(通过上拉电阻),使LM723处于断电状态,输出为0。这是一个重要的安全设计,防止MCU在启动过程中IO口状态不确定导致电源意外输出高电压。
- 加载配置:从高耐久闪存中读取上次保存的预设电压值、以及电压保护功能的开关状态。
- 进入主循环:
- 按键扫描与处理:周期性扫描6个按键,识别短按、长按等不同事件。
- 电压控制任务:根据当前设定值,更新DAC输出。
- 电压监测与保护任务:读取ADC,计算实际电压,与设定值比较,判断是否触发保护。
- 存储管理任务:监测设定值是否改变,启动延时存储定时器。
4.2 按键功能逻辑详解
按键处理是用户交互的核心,需要做到响应灵敏且逻辑清晰。
- 开关机键(Toggle):短按。软件内部维护一个
output_enabled标志。按下时,翻转该标志。若为true,则DAC输出上次设定的电压值;若为false,则DAC输出0V(或一个使LM723关闭的值),并控制关断晶体管T1。注意:这里的“关机”是软件关断输出,整机电源依然接通,MCU仍在工作,可以快速唤醒。 - 升压/降压键:短按一次,电压步进增加/减少一个单位(例如10mV)。长按处理:当检测到按键持续按下超过500ms,则启动自动连续增减功能,每隔100ms自动步进一次,直到按键释放。这个功能在需要大范围调压时非常方便。
- 预设键(3个):
- 短按(<2秒):读取模式。从闪存中读取对应编号存储的电压值,并立即将DAC设定为该值,实现一键调用。
- 长按(≥2秒):存储模式。将当前设定的电压值,写入闪存中对应编号的位置。长按期间最好有LED闪烁提示,增强用户体验。
4.3 DAC输出与电压映射算法
这是数字控制精度的关键。PIC16F1765的DAC是10位,输出范围是0到参考电压Vdac_ref(例如内部基准2.048V或3.3V AVdd)。
我们需要建立一个从DAC数字码值(DAC_CODE,0-1023)到电源输出电压(V_out,2.4V-18V)的映射关系。
首先,需要根据LM723的外围电阻(R12, R13)确定其同相输入端电压(V_control)与输出电压(V_out)的线性关系:V_out = G * V_control + V_offset。其中G是增益(约等于1 + R12/R13),V_offset是当V_control为0时的最小输出电压(由LM723内部电路决定,可实测得到,约为2.4V)。
然后,建立DAC_CODE与V_control的关系:V_control = (DAC_CODE / 1024) * Vdac_ref。
因此,综合公式为:V_out = G * (DAC_CODE / 1024) * Vdac_ref + V_offset。
在软件中,我们通常反着计算:给定一个目标电压V_target,求所需的DAC_CODE。DAC_CODE = ( (V_target - V_offset) / G ) * (1024 / Vdac_ref )。
将这个浮点计算的结果四舍五入取整,就得到了要写入DAC寄存器的值。为了提高实时性,可以事先计算出一个电压-代码对应表(查找表LUT)存储在MCU内存中,这样每次调整电压时只需查表,避免了实时浮点运算,特别适合8位单片机。
4.4 ADC采样与电压保护机制
保护功能是Rev 2版本的亮点。ADC持续对电源输出电压进行采样。
- 采样与滤波:单次ADC采样值噪声较大。通常采用连续采样多次(如16次)然后取平均的软件滤波方式,得到稳定的
ADC_avg值。 - 电压换算:根据ADC参考电压(Vref_adc)和分压比,将
ADC_avg换算成实际电压V_actual。 - 保护判断:比较
V_actual与当前设定的V_target。- 过压保护:如果
V_actual > V_target + V_threshold_high(例如0.2V),且持续数个周期(防误触发),则判定为过压故障。可能原因:调整管击穿短路。 - 欠压/短路保护:如果
V_actual < V_target - V_threshold_low(例如0.5V,因为带载时会有压降),且持续数个周期,则判定为欠压或输出短路。
- 过压保护:如果
- 保护动作:一旦触发保护,立即将
output_enabled标志置为false,DAC输出归零,并拉低关断晶体管T1的控制脚,彻底关闭LM723。同时,可以点亮故障指示灯。保护状态需要手动(如按开关机键复位)或断电后才能解除。
4.5 数据存储与高耐久闪存操作
PIC16F1765没有EEPROM,但提供了高耐久闪存(HEF)用于存储数据。与EEPROM相比,HEF的擦写次数(通常1万到10万次)可能少一些,但用于存储不常更改的预设值完全足够。
关键操作策略:
- 避免频繁写入:不要在每次按键按下后立即存储。我的做法是,当检测到电压设定值发生变化时,启动一个2秒的定时器。如果在这2秒内没有新的按键事件,则认为用户设定完毕,再将最终值写入闪存。这极大地减少了写入次数。
- 数据校验:在存储的数据结构中,可以包含一个校验和(如CRC8或求和取反)。每次读取后先校验,校验失败则使用默认值,防止数据损坏导致系统异常。
- 存储内容:至少需要存储3个预设电压值(每个2字节)、电压保护功能的使能状态(1字节)以及校验和(1字节)。
5. 组装、调试与实测问题排查
硬件焊接和软件烧录完成后,真正的挑战才刚刚开始。下面分享从组装到调通整个过程中,可能遇到的坑和解决方法。
5.1 安全第一:上电前的静态检查
在连接变压器之前,必须完成以下检查:
- 目视检查:检查所有元件焊接是否牢固,有无虚焊、连锡。特别是二极管、电解电容、稳压芯片的方向是否正确。
- 电源短路测试:使用万用表二极管档或电阻档,测量78L05的5V输出端对地电阻。在未上电、未插MCU的情况下,正反向测量应无明显短路(电阻不应接近0欧姆)。同样检查DAC输出端、ADC采样输入端对地、对Vcc有无短路。
- 关键点电压预判:计算或测量LM723的V+(Pin 12)对地、Vref(Pin 6)对地,在正常工作时应该分别有大约输入电压(如20V+)和7.15V。可以先不接主变压器,用可调直流电源给整流桥输出端(即4700μF电容两端)供一个较低的直流电压(如12V)进行初步测试。
5.2 分模块上电调试
不要一次性全部上电,采用“从前级到后级”的模块化调试。
- 辅助电源测试:先不接主控MCU。接通交流电,测量78L18输出应为18V左右,78L05输出应为稳定的5.0V。这是整个数字部分的生命线,必须首先确保正常。
- 基准与关断电路测试:插入MCU但先不烧录程序,或者烧录一个将所有IO设为输入、DAC输出0的程序。测量LM723的Vref(Pin 6)是否有~7.15V。测量关断晶体管T1(BC547)的集电极(接LM723 V+)电压,此时由于MCU未主动控制,上拉电阻应使其为高电平,LM723的V+引脚应无电压(或极低),证明关断电路有效。
- DAC控制测试:烧录一个简单的测试程序,让DAC输出一个固定的中间值(如对应1.0V)。用万用表测量DAC输出引脚电压,是否与预期相符。同时测量LM723的Pin 5电压,应与DAC输出电压一致(考虑连线压降)。
- 输出电压初步测试:保持DAC输出一个固定值。在电源输出端接一个功率较大的假负载电阻(如10Ω/10W),这是非常重要的一步!空载调试线性电源有时会不稳定。缓慢接通主电源,测量电源输出端电压。调节DAC输出值,观察输出电压是否随之线性变化。此时先不测试ADC和保护功能。
5.3 ADC校准与保护功能验证
这是精度和可靠性的关键。
- ADC校准:使用一台精度较高的数字万用表作为基准。让电源输出几个关键电压点,例如3.3V, 5.0V, 9.0V, 12.0V, 15.0V。在软件中读取这些点对应的ADC原始值。通过线性拟合(两点法即可:
V_actual = k * ADC_RAW + b),计算出精确的分压系数k和零点偏移b。将这个校准参数固化到程序中或存储在闪存。 - 过压保护测试:设定一个较低电压(如5.0V)。在输出端,用一个可调电源(设置为稍高于5.2V)正接正、负接负地“灌入”电压,模拟调整管击穿导致输出电压升高的情况。观察MCU是否能在短时间内(如100ms内)检测到并关闭输出。
- 短路/欠压保护测试:设定一个电压(如5.0V),输出端接上负载。然后用一根导线瞬间短接输出正负端(动作要快,短接时间不要超过1秒)。观察输出电压是否立即被拉低至接近0V,并且MCU触发保护、锁定关闭状态。同时观察电流采样电阻R9和调整管2N3055的温升,确保在短暂的短路过程中没有过热损坏。
5.4 常见故障与排查速查表
| 故障现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 无任何输出,指示灯不亮 | 1. 保险丝熔断 2. 变压器初级断路 3. 整流桥损坏 4. 辅助电源(78L05)无输出 | 1. 检查保险丝通断。 2. 断电测变压器初级电阻。 3. 测整流桥四个二极管单向导电性。 4. 测78L05输入输出端电压。 |
| 有辅助5V,但主输出始终为0 | 1. LM723关断电路一直有效 2. LM723损坏 3. DAC输出为0或接线错误 | 1. 测T1晶体管基极电压,MCU应输出高电平使其导通。 2. 检查LM723 V+引脚是否有输入电压(>9.5V)。 3. 测DAC输出引脚电压,检查连接到LM723 Pin5的线路。 |
| 输出电压不可调或范围不对 | 1. DAC输出范围/精度问题 2. LM723外围电阻R12/R13计算错误 3. 反馈网络断路 | 1. 用万用表测DAC引脚,看其是否随按键变化且范围正确(0-Vdac_ref)。 2. 复核R12, R13阻值,计算理论增益。 3. 检查从输出端到LM723 Pin 4的反馈通路。 |
| 输出电压跳动、不稳定 | 1. 输出滤波电容失效或容量不足 2. 基准源(LM723 Vref)不稳定 3. DAC参考电压(Vdac_ref)纹波大 4. 软件ADC采样滤波不足 | 1. 并联一个大电容(如1000μF)在输出端,看是否改善。 2. 用示波器观察LM723 Pin 6的7.15V基准,看是否有噪声。 3. 检查MCU的AVdd引脚退耦电容(100nF+10μF)是否紧靠引脚。 4. 增加软件ADC采样次数和均值滤波窗口。 |
| 带载后电压下跌严重 | 1. 调整管2N3055驱动不足或β值过低 2. 电流采样电阻R9阻值偏大 3. 变压器功率不足或内阻大 4. 主滤波电容(4700μF)容量不足或失效 | 1. 检查驱动2N3055基极的前级晶体管(BD137)及其偏置电阻。 2. 满载时测量R9两端压降,计算电流是否确实达到2A。 3. 测量满载时整流桥后的直流电压,对比空载是否下跌过多。 4. 用示波器观察满载时主滤波电容上的纹波是否过大。 |
| 按键操作不灵或错乱 | 1. 按键硬件接触不良 2. 软件去抖算法有问题 3. GPIO上拉电阻未启用或损坏 4. MCU主频设置不当,程序跑飞 | 1. 用万用表通断档测试每个按键。 2. 检查按键扫描周期和去抖延时(通常10-20ms)。 3. 测量按键未按下时,GPIO引脚电压是否为稳定的5V(高电平)。 4. 检查配置位,确认系统时钟源和频率设置正确。 |
5.5 性能优化与扩展思考
当基本功能都调通后,还可以考虑一些优化和扩展:
- 输出纹波测量与改善:用示波器交流耦合档,测量满载2A输出时的纹波电压。如果纹波偏大(如>5mV),可以在输出端并联一个低ESR的固态电容(如100μF)和一个0.1μF的陶瓷电容,组成高频滤波网络。
- 数字电流表与恒流模式:利用PIC剩余的ADC通道,采样电流采样电阻R9两端的电压,可以实时计算并显示输出电流。更进一步,可以软件实现恒流(CC)模式:将ADC采样的电流值与一个设定值比较,通过PID算法动态调整DAC输出(电压),使电流恒定。这就升级成了可调压、可调流的实验电源。
- 通信接口:为PIC增加UART或I2C接口,可以通过电脑串口助手或上位机软件远程控制电源输出电压、读取电压电流值,实现自动化测试。
- 更友好的UI:增加一个LCD或OLED屏幕,实时显示设定电压、实际电压、输出电流、工作模式(CV/CC)等信息,用户体验会提升一个档次。
这个项目最让我满意的,不是最终那台稳定的电源,而是整个从问题定义、方案迭代到动手实现的过程。它完美地诠释了如何用现代的、数字化的思维去改造和升级一个经典的模拟设备。PIC16F1765这样一颗小小的单片机,其内置的DAC和ADC,就像一座桥梁,连接了数字世界的精确控制与模拟世界的物理信号。当你按下按键,看到电压值稳稳地跳变到预设的数字,并且知道背后有一套程序在默默守护,防止任何过压意外时,那种一切尽在掌控的感觉,正是嵌入式开发的乐趣所在。