
1. 从零到一为什么我们需要一个“Power Supply V1.0”如果你玩过单片机、树莓派或者捣鼓过一些电子小制作那你一定对桌上那堆“黑砖头”不陌生——各种规格的开关电源适配器12V的、5V的、9V的线缆缠成一团电压还不一定准。更头疼的是当你需要一个可调的、干净的、能显示电流电压的电源时市面上的成品要么太贵要么功能太单一。这就是我决定动手做一个“Power Supply V1.0”的初衷一个集可调电压/电流、数字显示、过载保护于一体的桌面级线性稳压电源。这个“V1.0”的版本号本身就意味着它是一个起点一个验证核心功能的原型。它不追求极致的性能或花哨的外观而是聚焦于解决几个最实际的问题如何获得一个稳定可靠的直流电压源如何精确地设定和限制输出电流防止烧坏你心爱的开发板如何用最低的成本和可复现的步骤搭建一个属于你自己的实验电源这篇文章就是记录我从设计思路、元器件选型、电路搭建到最终调试测试的完整过程。无论你是电子爱好者、嵌入式开发者还是相关专业的学生都能从中找到可以直接“抄作业”的干货。2. 核心架构选型线性稳压 vs. 开关稳压我们选哪个决定做一个电源第一个灵魂拷问就是用线性稳压方案还是开关稳压方案这直接决定了电源的效率、纹波、复杂度和成本。市面上很多廉价可调电源模块用的是LM2596之类的开关稳压芯片效率高、发热小但输出纹波较大可能对敏感的模拟电路造成干扰。而我们的“Power Supply V1.0”定位是实验、调试用对噪声和纹波有较高要求因此我果断选择了线性稳压架构。注意线性稳压的原理是“多余的能量以热的形式耗散掉”。这意味着如果输入输出电压差很大且输出电流不小那么调整管通常是晶体管或稳压芯片会非常烫。这是线性电源最主要的缺点但换来的是极其干净、噪声极低的输出。基于这个选择核心稳压芯片我选用了经典的LM317。是的它很古老但极其经典、可靠、易用。LM317是一个三端可调正压稳压器只需要两个外接电阻就能设定输出电压公式Vout 1.25V * (1 R2/R1) Iadj * R2通常Iadj很小可忽略。更重要的是通过简单的改动它就能实现恒压CV和恒流CC的双重模式这正是我们需要的。整个电源的架构框图如下220V交流电经过变压器降压、整流桥整流、大电容滤波得到未经稳压的直流电比如24V。这个直流电送入以LM317为核心的可调稳压电路。输出电压和电流的设定通过多圈精密电位器进行。一个单片机比如Arduino或STM32配合电压/电流采样电路读取实际的输出值并驱动一个OLED或LCD屏幕进行显示。同时单片机程序会判断是否过流或过压并控制一个继电器或MOSFET来切断输出实现保护功能。3. 关键电路模块详解与元器件选型确定了架构我们来逐一拆解每个关键模块的设计细节和元器件选型理由。3.1 前级变压与整流滤波能量的源头前级的目标是把市电220V交流电变成平滑的直流电。这里有几个关键点变压器选择变压器的输出电压决定了你电源的最大输出范围。考虑到LM317需要有至少2-3V的压差Dropout Voltage才能正常工作同时为了留有余量我选择了一个输出为双18V交流AC 18V-0-18V的环形变压器。经过全波整流滤波后空载直流电压约为18V * √2 ≈ 25.5V。这意味著我的电源最大输出设定在约22V是安全的留出3.5V压差。变压器功率我选了120W这决定了电源的最大输出电流能力。粗略估算在最大输出20V时电流可达120W / 20V ≈ 6A但实际要受限于后续调整管和散热。整流桥与滤波电容整流桥的耐压和电流要留足余量。我选用KBPC5010耐压1000V电流50A远远过剩但好处是发热极小非常可靠。滤波电容的容量计算有经验公式C ≈ (I * t) / ΔV。其中I是最大输出电流假设5At是市电周期的一半10msΔV是允许的纹波电压比如1V。计算得 C ≈ (5 * 0.01) / 1 0.05F 50000uF。这是一个理论值。实际上我用了两个10000uF/50V的电解电容并联总容量20000uF并在每个电容上并联一个0.1uF的CBB电容来滤除高频噪声。容量并非越大越好过大的容量会导致上电瞬间冲击电流极大可能需要软启动电路。3.2 核心稳压与调压调流电路LM317的魔术这是整个电源的心脏。单颗LM317实现可调压很简单但要实现可调电流限制恒流模式需要一点小技巧。调压部分标准电路。在LM317的OUTPUT和ADJUST引脚之间连接电阻R1通常240Ω从ADJ引脚连接到地之间连接电位器R2。调节R2就能改变输出电压。我选用了一个10KΩ的多圈精密电位器作为R2这样可以非常精细地调节电压分辨率很高。调流恒流部分恒流源的原理是在负载回路中串联一个采样电阻R_sense检测其上的压降。LM317本身可以看作一个输出端和调整端之间维持1.25V压差的器件。我们可以利用这个特性。具体做法是在LM317的调整端ADJ和地之间接入一个由运放和电位器构成的恒流控制电路。但更经典、更简洁的方法是使用两颗LM317或者一颗LM317加一颗LM337负压稳压器来构成一个“悬浮”的恒流源。不过为了V1.0的简洁我采用了另一种常见方案在电源的输出负端串联一个低阻值的采样电阻例如0.1Ω/5W。这个电阻上的压降V_sense I_out * R_sense被送入一个运放如LM358组成的比较放大电路。运放的另一端接一个由电位器设定的参考电压。当V_sense超过参考电压时运放输出变化去拉低LM317调整端的电压从而限制输出电流实现恒流。实操心得采样电阻的选择是关键。阻值太大会造成不必要的压降和功耗太小则采样电压微弱容易受干扰。0.1Ω是一个折中的选择。在5A满负荷时压降为0.5V功耗为I²R 25 * 0.1 2.5W所以必须选用5W以上的功率电阻并且要有良好的散热。3.3 测量与控制单元单片机的眼睛和大脑为了让电源“智能化”显示和保护功能必不可少。我选择了最常见的Arduino Nano作为主控因为它生态丰富编程简单完全满足需求。电压采样直接使用Arduino的ADC引脚测量输出电压。由于Arduino的ADC参考电压为5V测量范围0-5V而我们的电源输出可能高达20V以上因此必须用电阻分压。例如采用一个10kΩ和一个33kΩ电阻串联分压比约为 10k / (10k33k) ≈ 0.23。这样20V电压分压后约为4.6V在ADC量程内。分压电阻要选用精度1%的金属膜电阻以保证测量准确性。电流采样测量之前提到的0.1Ω采样电阻两端的电压。这个电压很小0-0.5V需要先用运放如LM358做一个放大再送给Arduino的ADC。可以设计一个放大倍数为10倍的同相放大电路这样0.5V的满量程被放大到5V正好匹配ADC量程。显示部分我选用了一块0.96英寸的OLED屏幕I2C接口显示电压、电流、功率和模式CV/CC绰绰有余。I2C接线简单只需两根信号线。输出控制与保护在整流滤波后的直流总线上串联一个大功率的MOSFET如IRF3205作为电子开关。Arduino的一个IO口通过一个三极管驱动这个MOSFET的栅极。当单片机检测到过流电流超过设定值并持续一段时间或过热通过温度传感器如DS18B20检测散热器温度时就拉低IO口关闭MOSFET切断输出。同时屏幕上显示“OCP”过流保护或“OTP”过热保护告警。4. PCB设计、组装与“坑”位预警画原理图、设计PCB是整个项目从理论到实物的关键一步。我用的是KiCad这款免费开源软件。4.1 PCB布局的黄金法则对于功率电源PCB布局的好坏直接影响到稳定性、噪声甚至能否正常工作。有几个原则必须遵守大电流路径最短最粗从整流桥输出到滤波电容再到调整管LM317最后到输出端子的路径承载着数安培的电流。这条路径在PCB上必须用尽可能宽的走线我用了至少3mm宽并且避免锐角转弯。如果板子空间允许最好在顶层和底层都铺铜并通过大量过孔连接以减小阻抗和发热。地线设计模拟地采样电路、运放的地和功率地大电流地要分开布置最后在一点连接通常选择在滤波电容的负端。这可以防止大电流波动干扰敏感的模拟测量信号俗称“星型接地”或“单点接地”。退耦电容就近放置在LM317的输入、输出脚附近必须紧挨着放置一个0.1uF-1uF的陶瓷电容和一个10uF-100uF的电解电容用于滤除高频和低频噪声。这是稳定工作的基石。散热考虑LM317和采样电阻会产生大量热量。PCB上它们的焊盘要设计得足够大并且留有安装孔用于固定到外部的散热器上。散热器与芯片之间一定要涂导热硅脂并用绝缘垫片如果散热器需要接地则不用和云母片进行电气隔离。4.2 组装顺序与焊接技巧PCB到手后焊接顺序很重要。建议遵循“先矮后高先信号后功率”的原则先焊接电阻、瓷片电容、二极管等小元件。然后焊接IC座如果有、运放、稳压管等。再焊接电解电容、电位器。最后焊接最热门的家伙整流桥、LM317务必先装好绝缘垫片和散热器、大功率采样电阻、以及输入输出接线端子。焊接这些大件时烙铁温度要够高380°C左右并且焊锡要上足确保焊点饱满牢固。踩坑实录我第一次焊接时先焊好了LM317然后才想起来要装散热器结果发现散热器的安装孔被旁边的电容挡住了不得不拆下来重焊非常麻烦。所以务必在焊接大功率元件前先规划好散热器的位置和安装方式。4.3 调试上电“三部曲”组装完成最激动也最紧张的时刻就是首次上电。千万不要直接接220V遵循以下步骤目视与通断检查用放大镜检查有无虚焊、连锡。用万用表二极管档检查电源输入端正负极之间是否短路整流桥前以及输出端是否短路。低压上电测试这是保命和保板子的关键一步。找一个直流可调电源或者用另一个旧电源调到较低的电压比如12V接到你制作的电源板的直流输入端即整流桥输出后的位置跳过你的变压器和整流桥。这样即使有短路电流和破坏也有限。上电后测量LM317的输出电压调节调压电位器看电压是否变化。用万用表测量采样电阻两端电压粗略估算电流。带载测试与校准低压测试正常后可以接上真正的变压器了。上电后先空载用万用表测量输出电压并与OLED显示值对比。通常会有偏差这需要在Arduino代码里进行校准。找一个电子负载或者用大功率电阻逐渐增加负载电流观察电源是否能从恒压模式平滑切换到恒流模式输出电压开始下降以维持电流恒定。同时用手触摸LM317和采样电阻的散热器估算温度。5. 软件逻辑与功能实现硬件是躯体软件是灵魂。Arduino的程序主要负责三件事测量、计算、显示与控制。5.1 高精度测量与滤波Arduino的ADC是10位精度理论分辨率为5V/1024 ≈ 4.9mV。经过分压和放大后这个分辨率对应到实际电压和电流值。直接读取ADC值会跳动得很厉害必须进行软件滤波。我采用了最常用且有效的“滑动平均滤波法”。即维护一个数组存储最近N次的采样值每次计算时取这个数组的平均值。// 简化的滑动平均滤波示例 const int numReadings 10; int readings[numReadings]; // 存储ADC读数的数组 int readIndex 0; int total 0; int average 0; void setup() { // 初始化数组 for (int thisReading 0; thisReading numReadings; thisReading) { readings[thisReading] 0; } } int filteredADCRead(int pin) { total total - readings[readIndex]; // 减去最旧的读数 readings[readIndex] analogRead(pin); // 读取新值 total total readings[readIndex]; // 加上新值 readIndex (readIndex 1) % numReadings; // 循环索引 average total / numReadings; // 计算平均值 return average; }对于电压和电流分别用两个这样的滤波器显示值就稳定多了。5.2 校准算法由于电阻分压比、运放放大倍数不可能是完美的理论值所以必须校准。我采用了经典的“两点校准法”。在代码中定义两个校准系数偏移量offset和斜率scale。让电源空载输出电流为0调节电压到一个已知精确值V1用高位万用表测量记录此时ADC的读数A1。再调节电压到另一个精确值V2记录ADC读数A2。计算斜率 scale (V2 - V1) / (A2 - A1)计算偏移 offset V1 - (A1 * scale)实际电压 V_real ADC_read * scale offset电流的校准同理可以通过连接一个已知阻值的功率电阻测量实际电流来校准。这些校准系数可以保存在Arduino的EEPROM中这样掉电也不会丢失。5.3 保护逻辑与状态机电源的工作状态可以用一个简单的状态机来描述主要是**恒压CV和恒流CC**两种模式。初始化时为CV模式。程序循环中读取当前设定的电流限值I_set来自电流调节电位器的ADC值。读取实际输出电流I_out。如果 I_out I_set并持续一小段时间去抖则切换到CC模式。在CC模式下控制环路的目标是维持 I_out I_set此时电压会随着负载加重而下降。如果由于负载变化导致 I_out I_set则切换回CV模式。无论在哪种模式下只要检测到 I_out 超过设定的最大保护电流如 I_set 0.5A或者散热器温度超过安全阈值如80°C立即触发保护关闭输出MOSFET并在屏幕显示错误信息。6. 机箱装配、散热优化与最终测试当电路板调试完毕功能一切正常后最后一步就是给它一个“家”并解决散热这个终极问题。6.1 机箱与布局我选择了一个标准的铝合金仪表机箱前面板开孔安装电压/电流调节电位器、开关、输出端子香蕉插座和OLED屏幕。后面板安装电源输入插座、保险丝座和散热风扇。布局要点变压器这个最重的家伙放在机箱底部靠后的位置降低重心。主电路板竖直安装在机箱中间或一侧方便接线。散热器必须安装在机箱后部并且与外部空气流通的方向一致。我选用了一个大型的叉指散热器将LM317和采样电阻都固定在上面。散热风扇12V安装在机箱后部对着散热器吹形成强制风冷。风扇的电源可以从主变压器的另一个绕组整流稳压后获得也可以由Arduino的PWM信号控制实现温控调速当温度高时加快转速。6.2 散热计算与实测散热是线性电源设计的核心。以LM317为例其最大功耗 Pd (Vin - Vout) * Iout。假设最恶劣情况Vin25V Vout5V Iout3A则 Pd (25-5)*3 60W这巨大的热量必须被有效散掉。散热器热阻Rth的选择至关重要。LM317结到外壳的热阻Rth_jc约为5°C/W外壳到散热器涂硅脂的热阻Rth_cs约为0.5°C/W。假设环境温度Ta为30°C芯片最高结温Tj_max为125°C。那么允许的总热阻 Rth_total (Tj_max - Ta) / Pd (125-30)/60 ≈ 1.58°C/W。因此散热器到环境的热阻 Rth_sa Rth_total - Rth_jc - Rth_cs 1.58 - 5 - 0.5 -3.92°C/W。这已经是个负数了说明在这种极端条件下自然冷却甚至普通风冷都无法满足芯片会过热保护或烧毁。这就是线性电源的宿命高输入输出电压差大电流恐怖的发热。所以实际使用中必须避免长期在这种极端条件下工作。我的设计策略是通过散热风扇强制风冷并使用更大的散热器Rth_sa更低同时在实际面板上标注建议的工作区域例如输出电流大于2A时输入输出电压差不宜超过10V。实测中在15V输入输出5V/3A的条件下Pd30W散热器温度可以稳定在60°C左右属于可接受范围。6.3 最终性能测试清单装配完成后需要进行一系列测试来验证电源的性能和可靠性空载稳定性测试开机半小时测量输出电压的漂移应小于0.1%。负载调整率测试空载下设定电压为12.0V然后接上电子负载使电流从0A增加到3A观察输出电压的变化。变化值 ΔV 除以设定电压即为负载调整率。好的线性电源应优于0.1%。线性/负载瞬态响应测试用电子负载进行动态跳变测试例如电流在0.5A和2.5A之间以一定频率切换用示波器观察输出电压的过冲和恢复时间。这考验电源反馈环路的响应速度。纹波与噪声测试在额定负载下用示波器交流耦合档测量输出端的纹波电压峰峰值。线性电源的纹波应非常小通常小于1mVrms。我的实测结果在5V/2A输出时纹波约0.8mVp-p完全满足精密电路实验需求。保护功能测试故意短路输出电源应立即进入CC模式限制电流在设定值并持续一段时间后触发过流保护OCP切断输出。用热风枪加热温度传感器应能触发过热保护OTP。经过这一整套从设计、选型、制作到调试、测试的流程这台“Power Supply V1.0”已经不再是一堆散乱的元件而是一个可靠、实用的工具。它输出的每一伏特、每一安培都清晰可知、可控。更重要的是通过亲手打造它你对线性电源的每一个环节——从变压器的嗡鸣到LM317的温热从ADC采样的跳动到PID算法的稳定——都有了刻骨铭心的理解。这种理解是阅读任何数据手册和购买任何成品设备都无法替代的。它可能外观粗糙性能指标也比不上昂贵的商用设备但当你用它成功点亮第一个电路、调试第一个项目时那种成就感是无与伦比的。这就是DIY的魅力也是“V1.0”的意义它是一个完美的起点而你知道未来还有V2.0、V3.0可以加入数控、蓝牙通信、波形发生等更多功能这条路才刚刚开始。