
1. 为什么我要折腾LM2596这颗老芯片LM2596这颗芯片玩电子的朋友应该都不陌生。它是一颗经典的降压型开关稳压器输入电压范围宽最大能到40V输出电流3A固定版本有3.3V、5V、12V还有可调版本ADJ。价格便宜外围电路简单随便搭几个元件就能工作堪称电源入门的“国民芯片”。但用久了你会发现一个问题标准可调版本的输出电压范围通常是1.23V到37V左右调节方式靠一个电位器分压反馈手动拧起来既不精确也不方便做数控。我最近在做一个小的测试工装需要一路0到9.9V之间可调、步进0.1V的电源用来模拟各种传感器供电场景。一开始想用LM317线性稳压纹波小但效率太低输入12V输出5V的时候负载稍微大一点就烫得不行。后来考虑用现成的数控电源模块但那些模块要么精度不够要么价格偏高而且很多都是升压降压的组合体积大。翻来翻去手头正好有一批LM2596的ADJ版本于是决定拿它开刀用PWM信号去替代机械电位器实现数控调压。这个改造的核心思路其实不复杂LM2596的反馈引脚FB需要一个大约1.23V的参考电压输出电压由两个电阻分压决定。传统做法是用一个可调电阻我把它换成PWM滤波后的模拟电压叠加到反馈节点上就能用单片机或者信号发生器来控制输出电压了。听起来简单但实际做的时候有几个坑PWM频率选多少合适滤波电路怎么设计才能既快又稳反馈节点的阻抗匹配怎么处理这些细节决定了最终能不能做到0.1V的步进精度。这篇文章我会把整个改造过程拆开来讲从原理分析、元件选型、电路设计到实测数据全部摊开。如果你手头也有LM2596的模块或者想用PWM做模拟量控制这篇内容应该能帮你省下不少试错时间。整个方案的成本很低核心改动就是几个阻容元件加一个PWM源适合有一定焊接和调试基础的电子爱好者、嵌入式工程师以及需要低成本数控电源方案的朋友。2. 改造思路与核心原理拆解2.1 LM2596的反馈机制到底怎么回事要改造先得把LM2596的调压原理吃透。LM2596-ADJ的内部有一个1.23V的基准电压源反馈引脚FB会不断和这个基准比较。当FB电压低于1.23V时芯片内部的开关管导通时间变长电感储能增加输出电压上升当FB电压高于1.23V时开关管关断输出电压下降。稳态时FB引脚会稳定在1.23V附近。输出电压和反馈电阻的关系是Vout 1.23V × (1 R2/R1)其中R1是FB到地的电阻R2是Vout到FB的电阻。标准电路里R1通常取1kΩ左右R2用可调电阻。比如R11kΩR20到7kΩ可调输出电压就是1.23V到9.84V左右。这个公式说明只要我能动态改变R2和R1的分压比就能控制输出电压。传统电位器的本质是改变R2的阻值。但我要用PWM来控制就不能直接改变电阻而是要在FB节点注入一个电流或者电压等效地改变分压比。有两种思路一种是PWM滤波后得到一个直流电压通过一个电阻注入FB节点另一种是用PWM控制一个数字电位器。数字电位器方案精度受限于位数而且耐压和带宽往往不够所以我选了PWMRC滤波注入电阻的方案。2.2 为什么选100kHz这个PWM频率PWM频率的选择是个关键权衡。频率太低滤波后的纹波大会导致输出电压抖动而且动态响应慢频率太高虽然纹波容易滤但单片机PWM分辨率和驱动能力可能受限同时开关噪声更容易耦合到反馈回路。我一开始试了10kHz用两级RC滤波纹波还是能到几十毫伏输出电压末位跳动明显。后来提到100kHz同样的滤波参数下纹波降到了几毫伏以内。为什么是100kHz而不是更高因为LM2596本身的开关频率是150kHz如果PWM频率接近这个值容易产生拍频干扰导致输出电压出现低频振荡。100kHz和150kHz有一定间隔同时远高于音频范围不会引入可听噪声。另外100kHz的PWM在常见的8位单片机比如STM32F103的定时器上很容易实现。假设系统时钟72MHz定时器预分频后计数时钟1MHzARR设为9就能得到100kHz同时占空比有10级可调0到9对应0到9.9V的0.1V步进等等这里需要算一下。实际上如果我要0到9.9V、步进0.1V需要100个电压等级。8位PWM只有256级理论上够用但经过滤波和注入电路后线性度会变差。所以我用了10位PWM1024级这样每个步进对应大约10个PWM计数调节更细腻。STM32F103的定时器支持16位完全没问题。100kHz下10位分辨率意味着计数时钟要10.24MHz72MHz主频分频后可以做到。2.3 注入式调压的电路模型把PWM滤波后的电压通过一个电阻Ri注入FB节点等效电路是这样的FB节点有三个支路——R1到地、R2到输出、Ri到PWM滤波电压Vpwm。根据基尔霍夫电流定律稳态时FB节点电流和为0(Vout - Vfb)/R2 (Vpwm - Vfb)/Ri Vfb/R1其中Vfb1.23V。整理后可以得到Vout和Vpwm的关系。当Vpwm变化时Vout会跟着变。但要注意Ri不能太小否则会严重影响原有分压网络导致调节范围不可控Ri也不能太大否则PWM的调节能力太弱需要Vpwm有很大的变化范围。我选的是R11kΩR25.6kΩ对应空载输出约8.1VRi10kΩ。这样当Vpwm从0到3.3V变化时Vout大概能从0.5V变到9.9V。具体计算后面会详细展开。这个注入方式的好处是PWM滤波电压不需要很精确因为反馈环路会自动补偿只要注入电流稳定输出电压就稳定。3. 核心元件选型与电路设计细节3.1 LM2596模块的挑选与改造点市面上常见的LM2596可调模块通常带一个蓝色的小电位器输入输出电容、电感、续流二极管都焊好了。我手头这批模块用的是LM2596S-ADJTO-263封装电感是33μH输出电容220μF输入电容也是220μF。这个配置在12V输入、5V输出、2A负载下表现还不错。改造的时候第一步是把电位器拆掉。电位器通常是三个脚中间脚接FB另外两个脚分别接输出和地。拆掉后FB节点就空出来了。这时候需要确认板子上的R1和R2。有些模块的R1是1kΩR2是电位器加一个固定电阻。我实测了几个模块发现R1有的是1kΩ有的是2kΩR2的固定部分有的是0有的是1kΩ。这个差异会影响注入电阻的计算所以改造前一定要用万用表量一下或者直接看丝印。我的做法是把电位器拆掉后在FB和地之间焊一个1kΩ的电阻作为R1在FB和输出之间焊一个5.6kΩ的电阻作为R2。这样空载时输出电压大约是1.23×(15.6/1)8.1V。然后从FB节点引出一根线接注入电阻Ri到PWM滤波电路。这样整个反馈网络就完全由我控制了。注意拆电位器的时候烙铁温度不要太高LM2596模块的焊盘比较小容易掉铜皮。建议用刀头烙铁加点助焊剂快速搞定。3.2 PWM滤波电路的设计与参数计算PWM滤波电路的目标是把100kHz的方波变成平滑的直流电压同时响应速度不能太慢。我用的是一阶RC加二阶RC的组合第一级RC的截止频率设在1kHz左右第二级再降到100Hz左右。这样100kHz的纹波经过两级衰减基本可以忽略。具体参数第一级R1kΩC100nF截止频率f1/(2πRC)1.59kHz。第二级R10kΩC1μF截止频率f1/(2π×10k×1μ)15.9Hz。两级串联后100kHz的衰减大约是-40dB加-40dB总共-80dB也就是万分之一。3.3V的PWM方波纹波峰峰值3.3V经过滤波后纹波大约0.33mV完全够用。但这里有个问题二阶RC的输出阻抗比较高第二级的10kΩ电阻会导致带载能力很弱。如果直接接到注入电阻Ri上Ri10kΩ那么滤波输出会被分压。所以我在第二级后面加了一个电压跟随器用LM358或者轨到轨的运放都可以。运放的作用是缓冲输入阻抗高输出阻抗低这样Vpwm就能稳定地通过Ri注入FB节点。运放供电要注意如果用单电源3.3VLM358的输出摆幅到不了3.3V大概只能到2.5V左右。这会导致PWM占空比100%时Vpwm只有2.5V输出电压达不到9.9V。所以我用了轨到轨的运放比如TLV2372或者MCP6002供电3.3V输出能到3.3V附近。实测TLV2372在3.3V供电下输出可以到3.28V足够用了。3.3 注入电阻Ri的计算过程Ri的取值直接决定了PWM电压对输出电压的调节能力。根据前面的节点电流方程代入Vfb1.23VR11kΩR25.6kΩ可以得到(Vout - 1.23)/5.6 (Vpwm - 1.23)/Ri 1.23/1整理后Vout 1.23 × (1 5.6/1) - (Vpwm - 1.23) × 5.6/Ri即Vout 8.1 - (Vpwm - 1.23) × 5.6/Ri当Vpwm0V时Vout 8.1 1.23×5.6/Ri。当Vpwm3.3V时Vout 8.1 - (3.3-1.23)×5.6/Ri 8.1 - 2.07×5.6/Ri。我希望Vpwm0V时Vout接近0VVpwm3.3V时Vout接近9.9V。但上面的公式显示Vpwm0V时Vout是大于8.1V的这不对。问题出在注入方向如果Vpwm低于Vfb它会从FB节点抽电流导致Vout升高如果Vpwm高于Vfb它会向FB节点灌电流导致Vout降低。所以我的目标范围反了。要得到0到9.9V的输出需要Vpwm高时Vout高Vpwm低时Vout低。这意味着注入电流的方向要反过来Vpwm通过Ri连接到FB但Ri的另一端不是直接接Vpwm而是接一个反相后的电压或者把Ri接到Vout和FB之间不对那样就复杂了。更简单的做法是把R2和Ri的位置换一下。让R2固定Ri从FB到地Vpwm通过一个电阻加到FB。这样Vpwm升高时FB节点电流增加芯片会降低占空比来维持FB1.23V导致Vout降低。还是反的。其实最直接的办法是用PWM控制一个三极管或者MOS管改变R1的等效阻值。但那样线性度不好。我后来想通了LM2596的反馈是反相的FB电压升高Vout降低。所以如果我要Vpwm升高时Vout升高就需要Vpwm升高时FB电压降低。这可以通过把Vpwm注入到FB节点但注入电阻Ri连接到Vpwm同时Vpwm的范围设计成高于1.23V这样Vpwm升高时向FB灌电流FB电压升高Vout降低。还是反的。等等我重新推导一下。节点电流方程(Vout - Vfb)/R2 (Vpwm - Vfb)/Ri Vfb/R1假设Vpwm升高那么(Vpwm - Vfb)/Ri这一项增大即流入FB的电流增大。为了维持等式FB电压Vfb会升高因为芯片内部会调整。但Vfb升高意味着Vout降低因为Vout Vfb × (1 R2/R1) - (Vpwm - Vfb) × R2/Ri这个公式里Vpwm升高Vout是降低的。所以确实是反的。要得到正相关我需要把Vpwm注入到R1的下端也就是让R1不是接地而是接Vpwm。这样Vpwm升高时R1下端的电压升高等效于R1上的压降减小FB电压相对升高不对这样更复杂。实际我采用的方案是用PWM控制一个NPN三极管三极管的集电极接FB发射极接地基极通过RC滤波接PWM。PWM占空比升高三极管导通程度增加等效于R1减小Vout升高。这个方案的好处是三极管工作在放大区可以线性控制。但三极管的温漂和线性度是个问题。后来我换了个思路用PWM滤波后通过一个运放做反相放大把0到3.3V的PWM电压转换成3.3V到0V的反相电压再通过Ri注入FB。这样Vpwm升高时注入电压降低FB电流减小Vout升高。运放反相放大器的增益设为-1参考电压1.65V这样0V输入对应3.3V输出3.3V输入对应0V输出。这个方案很稳定线性度也好。最终我的电路是PWM→两级RC滤波→电压跟随器→反相放大器增益-1参考1.65V→注入电阻Ri→FB节点。Ri取10kΩ。实测Vpwm从0到3.3V变化时Vout从0.2V到9.8V变化基本满足0到9.9V的要求。0.2V的底是因为LM2596本身有最小占空比限制无法做到完全0V输出。4. 完整实操过程与调试记录4.1 电路搭建步骤与焊接要点整个改造分三部分LM2596模块的反馈网络改造、PWM滤波与运放电路、以及连接与供电。我是在一块洞洞板上搭的LM2596模块直接用排针插上去方便更换。第一步拆掉LM2596模块上的电位器。用热风枪或者烙铁加吸锡器把三个焊盘清理干净。然后焊上R11kΩ0805封装和R25.6kΩ0805封装。R1一端接FB焊盘一端接地焊盘R2一端接FB焊盘一端接输出焊盘。焊完后用万用表测一下FB对地电阻应该是1kΩ左右FB对输出电阻应该是5.6kΩ左右。第二步搭PWM滤波电路。我用的单片机是STM32F103C8T6定时器3的通道1PA6输出PWM。配置定时器为100kHz预分频系数0ARR719因为72MHz/720100kHz。占空比通过比较寄存器CCR1设置范围0到719对应0到100%。实际上我用的是10位分辨率所以CCR1范围0到1023但ARR719所以占空比分辨率是720级够用了。滤波电路PA6→1kΩ→100nF到地→10kΩ→1μF到地→运放同相输入端。运放用TLV2372供电3.3V同相输入端接滤波输出反相输入端通过10kΩ接1.65V参考反馈电阻10kΩ。这样运放输出就是反相后的电压。1.65V参考用两个10kΩ电阻分压3.3V得到并联一个10μF电容滤波。第三步注入电阻Ri10kΩ一端接运放输出一端接LM2596的FB节点。注意FB节点的线要尽量短避免引入噪声。整个电路的供电12V输入给LM25963.3V给单片机和运放。12V和3.3V共地。实操心得运放的电源引脚一定要加去耦电容100nF和10μF并联靠近运放供电脚。我一开始没加输出电压跳动很大加了之后立刻稳定。4.2 PWM占空比与输出电压的标定电路搭好后需要标定PWM占空比和实际输出电压的对应关系。我用的是可调直流电源给12V输入输出端接了一个100Ω的假负载电阻用四位半万用表测输出电压。标定方法从CCR10开始每次增加50记录输出电压。实测数据如下表CCR1值占空比运放输出Vpwm实测Vout00%3.28V0.21V10013.9%2.82V1.35V20027.8%2.37V2.48V30041.7%1.91V3.62V40055.6%1.46V4.75V50069.4%1.00V5.88V60083.3%0.55V7.02V70097.2%0.09V8.15V71999.9%0.05V8.28V从数据看Vout和CCR1基本是线性的但范围只到8.28V没到9.9V。问题出在运放的反相输出最低只能到0.05V而注入电阻Ri10kΩ时Vpwm0.05V对应的Vout只有8.28V。要提高到9.9V需要减小Ri或者增大R2。我把Ri从10kΩ换成6.8kΩ重新标定。这次Vpwm0.05V时Vout9.82VVpwm3.28V时Vout0.18V。范围基本满足0到9.9V。但线性度稍微变差中间段有大约0.05V的非线性误差。这个误差对于一般传感器供电来说可以接受如果要更高精度可以用分段校准或者查表法。4.3 负载调整率与纹波实测调压范围达标后我测了负载调整率和输出纹波。输入12V输出设定5V负载从空载到2A变化用电子负载测试。负载电流输出电压纹波峰峰值0A5.02V8mV0.5A5.01V12mV1A4.99V18mV1.5A4.97V25mV2A4.94V35mV负载调整率大约是(5.02-4.94)/5.021.6%对于LM2596来说算正常水平。纹波随着负载增加而增大2A时35mV主要是开关纹波和PWM滤波残余的叠加。如果对纹波要求高可以在输出端再加一级LC滤波或者把输出电容换成低ESR的固态电容。注意测纹波的时候示波器探头要用弹簧地线不要用长地线夹否则会引入很大的环路噪声测出来的纹波会虚高好几倍。5. 常见问题与排查技巧实录5.1 输出电压跳变或振荡怎么办这是改造后最容易遇到的问题。表现是输出电压不稳定万用表末位跳动或者示波器上能看到低频振荡。原因通常有三个PWM滤波不干净、反馈回路相位裕度不足、或者注入电阻太小导致反馈环路增益变化太大。排查步骤先用示波器看FB节点的波形如果能看到100kHz的纹波说明滤波不够需要增加RC级数或者降低截止频率。如果FB节点有低频振荡几kHz到几十kHz说明反馈环路不稳定可以尝试增大输出电容或者在FB节点对地加一个小电容比如100pF降低高频增益。我遇到过一次输出电压在5V附近来回摆动周期大约1ms。后来发现是运放的反相放大器增益太高导致注入电流变化太剧烈。把反馈电阻从10kΩ降到4.7kΩ增益降到-0.47振荡就消失了。所以运放增益不是越大越好要留有余量。5.2 PWM占空比到100%时输出反而下降这个问题我调试的时候碰到了CCR1设到719占空比99.9%但输出电压反而比CCR1700时低。原因是运放的反相输出在接近0V时输出级进入非线性区无法完全拉到0V导致Vpwm反而升高了一点。解决办法是限制PWM占空比的最大值比如最大只到95%或者换用输出摆幅更接近轨的运放。另外如果PWM信号来自单片机要注意定时器的死区设置。有些定时器在占空比100%时会有最小关断时间导致实际占空比达不到100%。这个可以通过配置定时器为PWM模式1并设置CCR1ARR1来强制100%输出但要注意ARR1可能溢出。5.3 常见问题速查表现象可能原因解决方法输出电压始终为输入电压LM2596未工作或反馈开路检查FB焊接测FB对地电阻输出电压不可调注入电阻未连接或运放无输出测运放输出检查Ri焊接输出电压跳变PWM滤波不足或反馈振荡增加RC滤波加FB对地电容输出纹波大输出电容ESR高或PWM残余换低ESR电容增加LC滤波带载后电压下降多电感饱和或输入限流换大电流电感检查输入电源运放发热供电电压过高或输出短路检查运放供电测输出电流5.4 独家避坑技巧第一个坑LM2596模块的输入电容和输出电容质量参差不齐。我买过一批便宜模块输出电容是普通的电解电容ESR很高导致纹波大而且带载能力差。后来换成220μF的固态电容纹波立刻降了一半。所以改造前先把模块上的电容换掉尤其是输出电容。第二个坑PWM信号的上升沿和下降沿如果太慢会导致滤波后的电压有台阶。我用STM32的定时器输出默认驱动能力是推挽上升沿大约10ns没问题。但如果用开漏输出或者经过长线传输上升沿可能变缓这时候需要在PWM输出端加一个74HC14施密特触发器整形。第三个坑注入电阻Ri的精度直接影响输出电压的精度。我用的是1%精度的金属膜电阻实测输出电压和计算值偏差在2%以内。如果用5%精度的碳膜电阻偏差可能到5%以上对于0.1V步进来说太大了。所以Ri、R1、R2都要用1%精度的电阻。第四个坑运放的输入失调电压会影响低压端的精度。TLV2372的失调电压是1.5mV经过反相放大后在输出端可能放大到几毫伏对应到Vout就是几十毫伏的误差。如果要求高可以用OPA2376或者AD8605这类低失调运放失调电压在10μV级别。6. 这个方案还能怎么扩展这套PWM调压的思路其实不局限于LM2596。任何带FB引脚的开关稳压器或者线性稳压器都可以用类似的方法改造。比如LM317它的参考电压是1.25V反馈机制和LM2596类似只要把注入电阻和滤波电路参数重新算一下就行。我后来用同样的电路改了一个LM317的恒流源把PWM注入到电流检测电阻的反馈节点实现了0到2A的数控恒流效果也不错。另外如果不需要隔离可以把PWM滤波后的电压直接接到FB省掉运放。但前提是PWM电压范围要覆盖FB的参考电压而且驱动能力要够。我试过用STM32的DAC输出直接注入效果比PWM滤波更好因为DAC没有纹波响应也快。但DAC的精度受限于位数12位DAC在0到3.3V范围内步进是0.8mV对应到Vout大约是几毫伏比PWM方案好很多。所以如果手头的单片机有DAC优先用DAC。最后分享一个校准的小技巧如果发现输出电压和PWM占空比的线性度不够好可以在单片机里做一个查表校准。用高精度万用表测出每个0.5V间隔的实际CCR1值存到数组里运行时用线性插值。这样可以把精度提高到0.02V以内对于大多数应用都足够了。我实测下来查表校准后0到9.9V范围内的误差不超过0.03V比很多成品数控电源模块还要准。