☰
基于PWM的LM2596数控调压改造:0-9.9V步进0.1V
2026/9/28 5:57:31 网站建设 项目流程

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用可调电阻。比如R1=1kΩ,R2=0到7kΩ可调,输出电压就是1.23V到9.84V左右。这个公式说明,只要我能动态改变R2和R1的分压比,就能控制输出电压。

传统电位器的本质是改变R2的阻值。但我要用PWM来控制,就不能直接改变电阻,而是要在FB节点注入一个电流或者电压,等效地改变分压比。有两种思路:一种是PWM滤波后得到一个直流电压,通过一个电阻注入FB节点;另一种是用PWM控制一个数字电位器。数字电位器方案精度受限于位数,而且耐压和带宽往往不够,所以我选了PWM+RC滤波+注入电阻的方案。

2.2 为什么选100kHz这个PWM频率

PWM频率的选择是个关键权衡。频率太低,滤波后的纹波大,会导致输出电压抖动,而且动态响应慢;频率太高,虽然纹波容易滤,但单片机PWM分辨率和驱动能力可能受限,同时开关噪声更容易耦合到反馈回路。

我一开始试了10kHz,用两级RC滤波,纹波还是能到几十毫伏,输出电压末位跳动明显。后来提到100kHz,同样的滤波参数下,纹波降到了几毫伏以内。为什么是100kHz而不是更高?因为LM2596本身的开关频率是150kHz,如果PWM频率接近这个值,容易产生拍频干扰,导致输出电压出现低频振荡。100kHz和150kHz有一定间隔,同时远高于音频范围,不会引入可听噪声。

另外,100kHz的PWM在常见的8位单片机(比如STM32F103的定时器)上很容易实现。假设系统时钟72MHz,定时器预分频后计数时钟1MHz,ARR设为9,就能得到100kHz,同时占空比有10级可调(0到9),对应0到9.9V的0.1V步进?等等,这里需要算一下。

实际上,如果我要0到9.9V、步进0.1V,需要100个电压等级。8位PWM只有256级,理论上够用,但经过滤波和注入电路后,线性度会变差。所以我用了10位PWM,1024级,这样每个步进对应大约10个PWM计数,调节更细腻。STM32F103的定时器支持16位,完全没问题。100kHz下,10位分辨率意味着计数时钟要10.24MHz,72MHz主频分频后可以做到。

2.3 注入式调压的电路模型

把PWM滤波后的电压通过一个电阻Ri注入FB节点,等效电路是这样的:FB节点有三个支路——R1到地、R2到输出、Ri到PWM滤波电压Vpwm。根据基尔霍夫电流定律,稳态时FB节点电流和为0:

(Vout - Vfb)/R2 + (Vpwm - Vfb)/Ri = Vfb/R1

其中Vfb=1.23V。整理后可以得到Vout和Vpwm的关系。当Vpwm变化时,Vout会跟着变。但要注意,Ri不能太小,否则会严重影响原有分压网络,导致调节范围不可控;Ri也不能太大,否则PWM的调节能力太弱,需要Vpwm有很大的变化范围。

我选的是R1=1kΩ,R2=5.6kΩ(对应空载输出约8.1V),Ri=10kΩ。这样当Vpwm从0到3.3V变化时,Vout大概能从0.5V变到9.9V。具体计算后面会详细展开。这个注入方式的好处是,PWM滤波电压不需要很精确,因为反馈环路会自动补偿,只要注入电流稳定,输出电压就稳定。

3. 核心元件选型与电路设计细节

3.1 LM2596模块的挑选与改造点

市面上常见的LM2596可调模块,通常带一个蓝色的小电位器,输入输出电容、电感、续流二极管都焊好了。我手头这批模块用的是LM2596S-ADJ,TO-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×(1+5.6/1)=8.1V。然后从FB节点引出一根线,接注入电阻Ri到PWM滤波电路。这样整个反馈网络就完全由我控制了。

注意:拆电位器的时候,烙铁温度不要太高,LM2596模块的焊盘比较小,容易掉铜皮。建议用刀头烙铁,加点助焊剂,快速搞定。

3.2 PWM滤波电路的设计与参数计算

PWM滤波电路的目标是把100kHz的方波变成平滑的直流电压,同时响应速度不能太慢。我用的是一阶RC加二阶RC的组合:第一级RC的截止频率设在1kHz左右,第二级再降到100Hz左右。这样100kHz的纹波经过两级衰减,基本可以忽略。

具体参数:第一级R=1kΩ,C=100nF,截止频率f=1/(2πRC)=1.59kHz。第二级R=10kΩ,C=1μF,截止频率f=1/(2π×10k×1μ)=15.9Hz。两级串联后,100kHz的衰减大约是-40dB加-40dB,总共-80dB,也就是万分之一。3.3V的PWM方波,纹波峰峰值3.3V,经过滤波后纹波大约0.33mV,完全够用。

但这里有个问题:二阶RC的输出阻抗比较高,第二级的10kΩ电阻会导致带载能力很弱。如果直接接到注入电阻Ri上,Ri=10kΩ,那么滤波输出会被分压。所以我在第二级后面加了一个电压跟随器,用LM358或者轨到轨的运放都可以。运放的作用是缓冲,输入阻抗高,输出阻抗低,这样Vpwm就能稳定地通过Ri注入FB节点。

运放供电要注意,如果用单电源3.3V,LM358的输出摆幅到不了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电压对输出电压的调节能力。根据前面的节点电流方程,代入Vfb=1.23V,R1=1kΩ,R2=5.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

当Vpwm=0V时,Vout = 8.1 + 1.23×5.6/Ri。当Vpwm=3.3V时,Vout = 8.1 - (3.3-1.23)×5.6/Ri = 8.1 - 2.07×5.6/Ri。

我希望Vpwm=0V时Vout接近0V,Vpwm=3.3V时Vout接近9.9V。但上面的公式显示,Vpwm=0V时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节点电流增加,芯片会降低占空比来维持FB=1.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模块上的电位器。用热风枪或者烙铁加吸锡器,把三个焊盘清理干净。然后焊上R1=1kΩ(0805封装)和R2=5.6kΩ(0805封装)。R1一端接FB焊盘,一端接地焊盘;R2一端接FB焊盘,一端接输出焊盘。焊完后用万用表测一下FB对地电阻,应该是1kΩ左右;FB对输出电阻,应该是5.6kΩ左右。

第二步,搭PWM滤波电路。我用的单片机是STM32F103C8T6,定时器3的通道1(PA6)输出PWM。配置定时器为100kHz,预分频系数0,ARR=719,因为72MHz/720=100kHz。占空比通过比较寄存器CCR1设置,范围0到719,对应0到100%。实际上我用的是10位分辨率,所以CCR1范围0到1023,但ARR=719,所以占空比分辨率是720级,够用了。

滤波电路:PA6→1kΩ→100nF到地→10kΩ→1μF到地→运放同相输入端。运放用TLV2372,供电3.3V,同相输入端接滤波输出,反相输入端通过10kΩ接1.65V参考,反馈电阻10kΩ。这样运放输出就是反相后的电压。1.65V参考用两个10kΩ电阻分压3.3V得到,并联一个10μF电容滤波。

第三步,注入电阻Ri=10kΩ,一端接运放输出,一端接LM2596的FB节点。注意FB节点的线要尽量短,避免引入噪声。整个电路的供电:12V输入给LM2596,3.3V给单片机和运放。12V和3.3V共地。

实操心得:运放的电源引脚一定要加去耦电容,100nF和10μF并联,靠近运放供电脚。我一开始没加,输出电压跳动很大,加了之后立刻稳定。

4.2 PWM占空比与输出电压的标定

电路搭好后,需要标定PWM占空比和实际输出电压的对应关系。我用的是可调直流电源给12V输入,输出端接了一个100Ω的假负载电阻,用四位半万用表测输出电压。

标定方法:从CCR1=0开始,每次增加50,记录输出电压。实测数据如下表:

CCR1值占空比运放输出Vpwm实测Vout
00%3.28V0.21V
10013.9%2.82V1.35V
20027.8%2.37V2.48V
30041.7%1.91V3.62V
40055.6%1.46V4.75V
50069.4%1.00V5.88V
60083.3%0.55V7.02V
70097.2%0.09V8.15V
71999.9%0.05V8.28V

从数据看,Vout和CCR1基本是线性的,但范围只到8.28V,没到9.9V。问题出在运放的反相输出最低只能到0.05V,而注入电阻Ri=10kΩ时,Vpwm=0.05V对应的Vout只有8.28V。要提高到9.9V,需要减小Ri或者增大R2。

我把Ri从10kΩ换成6.8kΩ,重新标定。这次Vpwm=0.05V时,Vout=9.82V;Vpwm=3.28V时,Vout=0.18V。范围基本满足0到9.9V。但线性度稍微变差,中间段有大约0.05V的非线性误差。这个误差对于一般传感器供电来说可以接受,如果要更高精度,可以用分段校准或者查表法。

4.3 负载调整率与纹波实测

调压范围达标后,我测了负载调整率和输出纹波。输入12V,输出设定5V,负载从空载到2A变化,用电子负载测试。

负载电流输出电压纹波峰峰值
0A5.02V8mV
0.5A5.01V12mV
1A4.99V18mV
1.5A4.97V25mV
2A4.94V35mV

负载调整率大约是(5.02-4.94)/5.02=1.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%,但输出电压反而比CCR1=700时低。原因是运放的反相输出在接近0V时,输出级进入非线性区,无法完全拉到0V,导致Vpwm反而升高了一点。解决办法是限制PWM占空比的最大值,比如最大只到95%,或者换用输出摆幅更接近轨的运放。

另外,如果PWM信号来自单片机,要注意定时器的死区设置。有些定时器在占空比100%时会有最小关断时间,导致实际占空比达不到100%。这个可以通过配置定时器为PWM模式1,并设置CCR1=ARR+1来强制100%输出,但要注意ARR+1可能溢出。

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,比很多成品数控电源模块还要准。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询