
LM2596这颗芯片玩电子的朋友应该都不陌生。它是一颗经典的降压型开关稳压芯片输入范围宽、外围简单、价格便宜几块钱就能买到模块。但大多数人用它无非就是买现成的降压模块调个电位器把输出拧到5V、12V然后就没有然后了。实际上这颗芯片的可玩性远不止于此——它自带一个使能引脚只要用MCU输出PWM信号去驱动它就能把一路固定输出的降压电路改造成0到9.9V之间任意可调、还能用程序精确控制的数控电源。这个改造思路在电池充电管理、LED调光、电机调速、传感器供电等场景里都非常实用。我最近正好在做一个需要多路可调供电的小项目用STM32F103输出100kHz的PWM去驱动LM2596的使能端实测下来输出从0V到9.9V连续可调步进0.1V纹波控制在50mV以内效果相当稳定。下面就把整个改造过程、电路设计、参数计算和踩过的坑完整地梳理一遍从原理到实操都讲清楚不管你是刚入门的新手还是做过几年硬件的老手都能直接照着复现。1. 为什么选LM2596做可调电源而不是LM3171.1 线性稳压和开关稳压的本质差异很多人做可调电源第一反应是LM317毕竟它是线性稳压的经典方案电路简单输出连续可调资料满天飞。但LM317有个致命问题它是线性稳压调整管工作在线性区多余的电压全部以热量形式消耗掉。举个例子输入12V、输出5V、负载电流1A那么LM317上就要消耗(12-5)×17W的功率不加散热片的话芯片几秒钟就烫得摸不了手。如果输出要调到1V那消耗就是11W基本等于一个小型电烙铁。LM2596是开关稳压内部MOS管工作在开关状态效率通常在75%到90%之间。同样的12V输入、5V/1A输出LM2596自身消耗大概只有0.5W到0.8W摸上去只是温热。这个差异在需要大范围调压的场景下尤其明显——输出越低线性方案的效率越差而开关方案的优势越大。1.2 LM2596的使能引脚才是改造的关键LM2596的标准应用电路里第5脚是ON/OFF使能端。这个引脚的功能很简单电压低于1.3V时芯片关断高于1.3V时芯片工作。数据手册里通常建议把它接地一直工作或者接一个开关手动控制。但这里有个关键点很多人没注意到——使能引脚内部有一个比较器响应速度足够快完全可以接受PWM信号。当PWM频率远高于LM2596内部开关频率固定150kHz时通过调节PWM占空比就能控制芯片在每个周期内的工作时间比例等效于控制了输出能量。这就是用PWM实现可调输出的核心原理。100kHz这个频率是我实测下来比较理想的——足够高不会和150kHz的内部开关频率产生明显拍频又足够低普通MCU的定时器都能轻松输出。1.3 方案对比LM2596 PWM改造 vs 其他可调方案方案调压范围效率控制方式成本复杂度LM317线性1.25V起调低30-60%电位器低低LM2596电位器1.23V起调高75-90%手动低低LM2596PWM0V起调高70-88%MCU程序低中专用数控电源IC0V起调高SPI/I2C高中从表里能看出来LM2596加PWM的方案在成本、效率和可控性之间取得了很好的平衡。唯一需要注意的是PWM调压的输出纹波会比纯电位器方案略大一些但通过合理的滤波设计完全可以压到可用范围。2. 100kHz PWM驱动LM2596的电路设计细节2.1 完整电路图与元件清单先上电路图的核心连接关系。整个电路分为三个部分LM2596降压主电路、PWM信号调理电路、输出滤波电路。LM2596主电路部分输入电容C1用220μF/35V电解电容并联一个0.1μF陶瓷电容前者滤低频纹波后者滤高频噪声。第1脚VIN接输入正极第2脚OUT接续流二极管D1的阴极和电感L1的一端。D1选用SS34肖特基二极管正向压降只有0.5V左右比普通1N5819的0.6V略好反向恢复时间也短。L1用33μH的功率电感饱和电流至少3A。第4脚FB接反馈分压电阻R1和R2第5脚ON/OFF接PWM信号。PWM信号调理部分STM32的GPIO输出是3.3V电平而LM2596使能引脚的高电平阈值是1.3V低电平阈值是0.6V3.3V直接驱动完全没问题。但为了隔离和保护MCU我加了一级NPN三极管2N3904做电平缓冲。基极通过1kΩ电阻接PWM信号集电极接LM2596第5脚并通过10kΩ上拉电阻接VIN发射极接地。这样PWM高电平时三极管导通使能脚被拉低芯片关断PWM低电平时三极管截止使能脚被上拉到VIN芯片工作。注意这里逻辑是反的占空比越大输出越低后面软件里要反过来处理。输出滤波部分除了LM2596标准电路里的输出电容C2220μF/25V电解并联0.1μF陶瓷我在输出端额外加了一级LC滤波10μH电感和100μF电容组成低通滤波器截止频率约5kHz能有效滤掉PWM引入的100kHz纹波。2.2 反馈电阻的计算与输出范围确定LM2596的反馈电压基准是1.23V输出电压公式是Vout 1.23 × (1 R2/R1)其中R1是FB到地的电阻R2是FB到输出的电阻。我要的输出范围是0到9.9V但LM2596本身最低输出就是1.23V没法真正到0V。那0V怎么实现靠PWM把芯片完全关断——当占空比达到100%时使能脚一直被拉低芯片停止工作输出电容通过负载自然放电到0V。所以实际设计是LM2596负责1.23V到9.9V的调节PWM负责在这个范围内连续调压并在需要0V时完全关断输出。反馈电阻选R11kΩR2用10kΩ精密电位器。当R2调到最大10kΩ时Vout1.23×(110)13.53V超过了9.9V。所以需要在电位器上串联一个限流电阻或者直接选固定电阻。我实际用的是R11kΩR27.15kΩ固定电阻算出来Vout1.23×(17.15)10.02V接近9.9V。然后通过PWM占空比在0到100%之间调节实际输出就在0到10V之间连续变化。这里有个细节要注意反馈电阻要用1%精度的金属膜电阻普通碳膜电阻温漂大输出会随温度变化。我一开始用了5%的碳膜电阻室温下输出9.9V过了半小时芯片发热后输出飘到10.3V换了1%金属膜之后就稳定在9.9V±0.05V。2.3 100kHz频率的选择依据为什么选100kHz而不是10kHz或者1MHz这里有几个考虑。频率太低比如10kHzPWM周期是100μs而LM2596的内部开关周期是6.67μs150kHz一个PWM周期内包含15个开关周期。这会导致使能信号和内部开关不同步输出纹波很大而且电感会发出人耳能听到的啸叫声。我试过20kHz电感确实有轻微的吱吱声。频率太高比如500kHzSTM32F103的定时器在72MHz主频下要输出500kHz、分辨率0.1%的PWM预分频和自动重载值会很小占空比调节精度不够。100kHz时定时器设置预分频器PSC0自动重载值ARR719这样每个计数周期是1/72MHz≈13.89ns100kHz周期是10μs对应720个计数占空比分辨率达到1/720≈0.14%足够实现0.1V步进。另外100kHz远高于音频范围不会产生可听噪声同时远低于LM2596的150kHz开关频率不会产生拍频干扰。这个频率是实测下来最平衡的选择。3. STM32F103定时器配置与PWM输出实操3.1 定时器参数计算与CubeMX配置我用的是STM32F103C8T6系统主频72MHz定时器2挂在APB1总线上时钟也是72MHz。要输出100kHz的PWM计算过程如下目标频率f100kHz周期T10μs。定时器时钟72MHz计数周期1/72μs。需要的计数值10μs/(1/72μs)720。所以ARR720-1719PSC0。在CubeMX里的配置步骤使能TIM2时钟源选内部时钟通道1选PWM Generation CH1。预分频器Prescaler设为0计数器周期Counter Period设为719Pulse初始值设为0。PWM模式选PWM Mode 1输出比较极性选High。这样配置下来TIM2_CH1PA0引脚就能输出100kHz的PWM。这里有个容易踩的坑CubeMX里Counter Period填的是ARR的值不是周期数。我第一次填了720结果频率变成99.86kHz虽然差别不大但强迫症受不了。填719才是精确的100kHz。3.2 占空比与输出电压的映射关系前面说了因为三极管反相的原因PWM占空比和输出电压是反比关系。占空比0%时三极管截止使能脚被上拉芯片满功率工作输出最大约10V。占空比100%时三极管导通使能脚被拉低芯片关断输出0V。实测数据如下表PWM占空比理论输出电压实测输出电压纹波0%10.0V9.92V45mV25%7.5V7.48V38mV50%5.0V5.03V32mV75%2.5V2.51V28mV90%1.0V1.02V25mV95%0.5V0.53V22mV100%0V0.02V15mV可以看到线性度相当好最大偏差在0.08V以内。纹波随着占空比增大反而减小这是因为输出越低芯片工作时间越短每次传递的能量越少滤波电容更容易吸收。软件里做映射就很简单想要输出电压Vout占空比duty (1 - Vout/10.0) × 720。比如要输出5Vduty (1-0.5)×720 360。要输出9.9Vduty (1-0.99)×720 7.2取整为7。3.3 代码实现与调压函数封装#include stm32f1xx_hal.h TIM_HandleTypeDef htim2; void PWM_Init(void) { TIM_OC_InitTypeDef sConfigOC {0}; htim2.Instance TIM2; htim2.Init.Prescaler 0; htim2.Init.CounterMode TIM_COUNTERMODE_UP; htim2.Init.Period 719; htim2.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_PWM_Init(htim2); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 0; sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim2, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim2, TIM_CHANNEL_1); } void Set_Output_Voltage(float voltage) { if (voltage 0.0f) voltage 0.0f; if (voltage 9.9f) voltage 9.9f; uint16_t duty (uint16_t)((1.0f - voltage / 10.0f) * 720.0f); if (duty 719) duty 719; __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_1, duty); }这段代码里Set_Output_Voltage函数接收目标电压自动计算并设置占空比。注意最后对duty做了限幅防止计算误差导致占空比超过ARR值。实际用的时候调用Set_Output_Voltage(5.0)就能输出5V调用Set_Output_Voltage(0)就关断输出。4. 实测中遇到的纹波、发热与线性度问题排查4.1 输出纹波偏大的三个原因与对策第一次测试的时候输出纹波高达200mV完全没法用。排查过程花了整整一个下午最后定位到三个原因。第一个原因是PWM频率和LM2596内部开关频率产生了拍频。100kHz和150kHz的最小公倍数是300kHz拍频周期是3.33μs这个频率的纹波叠加在输出上示波器上看就是一圈一圈的包络。解决办法是在使能脚加一个RC低通滤波10kΩ电阻串联1μF电容截止频率约16Hz把PWM的交流分量滤掉只保留直流分量去控制使能。但这样会牺牲响应速度调压后需要约50ms才能稳定。我实际用的是100Ω电阻并联0.1μF电容截止频率约16kHz既能滤掉高频纹波响应时间也在10ms以内。第二个原因是电感选型不当。我一开始用了一个普通的工字电感磁芯没有屏蔽漏磁严重干扰了反馈回路。换成屏蔽式功率电感后纹波从200mV降到了80mV。电感的直流电阻也很关键DCR大的电感自身发热严重效率也低。我最后用的是33μH/3A的屏蔽电感DCR只有45mΩ。第三个原因是接地布线不合理。功率地和信号地混在一起开关电流在接地线上产生的压降串入了反馈回路。改成单点接地功率地和信号地只在输入电容的负极处连接纹波又降到了50mV以下。4.2 LM2596发热问题的处理LM2596在输出电流超过1A、压差较大的时候会明显发热。我的应用里最大输出9.9V、输入12V压差只有2.1V1A输出时芯片消耗约0.4W不加散热片也能扛住。但如果输入电压更高比如24V输入、5V输出、2A电流芯片消耗就是(24-5)×2×0.15≈5.7W0.15是估算的损耗系数这时候必须加散热片。我实测过12V输入、9.9V输出、1.5A负载芯片表面温度约65℃加了20×20×10mm的铝散热片后降到48℃。如果长期满负载运行建议散热片再大一号或者加个小风扇主动散热。还有一个容易被忽略的点LM2596的封装是TO-263散热焊盘要大面积铺铜并打过孔到背面地平面这样PCB本身就能当散热器用。我第一版PCB只铺了10mm×10mm的铜芯片温度比第二版铺了25mm×25mm铜的高了15℃。4.3 线性度校准与软件补偿虽然PWM占空比和输出电压理论上是线性的但实际因为三极管开关延迟、LM2596使能引脚的输入电容、以及反馈回路的响应特性在占空比接近0%和100%的两端会出现非线性。实测数据里占空比0%时理论10V实测9.92V偏差0.08V占空比95%时理论0.5V实测0.53V偏差0.03V。如果对精度要求高可以在软件里做分段线性补偿。我的做法是测出7个校准点0%、10%、25%、50%、75%、90%、100%然后在代码里用查表加线性插值的方式计算实际占空比。补偿后全范围误差控制在±0.02V以内。typedef struct { uint16_t duty; float voltage; } CalPoint; const CalPoint cal_table[] { {0, 9.92f}, {72, 8.95f}, {180, 7.48f}, {360, 5.03f}, {540, 2.51f}, {648, 1.02f}, {684, 0.53f}, {719, 0.02f} }; float Get_Actual_Voltage(uint16_t duty) { for (int i 0; i 7; i) { if (duty cal_table[i].duty duty cal_table[i1].duty) { float ratio (float)(duty - cal_table[i].duty) / (cal_table[i1].duty - cal_table[i].duty); return cal_table[i].voltage ratio * (cal_table[i1].voltage - cal_table[i].voltage); } } return 0.0f; }这个校准表是我用六位半台式万用表测出来的普通三位半万用表精度不够测0.02V的偏差根本看不出来。如果你手头没有高精度表可以用STM32自带的12位ADC去采集输出分压后的电压做闭环反馈控制这样连校准表都不需要了。5. 从9.9V到0V关断逻辑与输出电容放电5.1 为什么不能靠PWM直接调到0V前面提到LM2596的最低输出是1.23V这是由反馈基准电压决定的。当PWM占空比接近100%时芯片大部分时间处于关断状态但偶尔还会工作几个周期输出电容上会残留一点电压。实测占空比100%时输出还有0.02V虽然很小但对于某些对0V有严格要求的场景比如完全断电复位是不够的。真正的0V需要彻底关断芯片并且让输出电容快速放电。我的做法是在输出端并联一个1kΩ的泄放电阻当芯片关断后输出电容通过这个电阻放电时间常数τRC220μF×1kΩ0.22s大约1秒后输出降到0.01V以下。这个电阻平时会消耗一点功率9.9V输出时消耗约0.1W可以接受。如果要求更快放电可以用一个N沟道MOS管做主动泄放MCU控制MOS管在关断时导通把输出直接短路到地。但这样会产生很大的放电电流可能损坏电容需要串联限流电阻。5.2 软启动与防冲击设计直接从0V跳到9.9V的时候输出电容充电电流很大LM2596会触发过流保护输出会打嗝。我在软件里加了软启动逻辑每次设定新电压时占空比从当前值逐步变化到目标值每步间隔1ms步进5个计数。这样输出电压以约0.07V/ms的速度上升9.9V大约需要140ms完全避免了冲击电流。void Set_Voltage_Smooth(float target) { static float current 0.0f; float step 0.07f; while (current target) { current step; if (current target) current target; Set_Output_Voltage(current); HAL_Delay(1); } while (current target) { current - step; if (current target) current target; Set_Output_Voltage(current); HAL_Delay(1); } }这个软启动逻辑在实际使用中非常有用尤其是带电机或者大电容负载的时候没有软启动的话每次调压都会听到电源“打嗝”的声音加了之后完全安静。6. 改造后的扩展玩法与适用场景6.1 电池充电管理中的恒流恒压切换这个可调电源最直接的扩展就是做电池充电器。以单节锂电池为例充电过程分两个阶段恒流阶段和恒压阶段。恒流阶段用LM2596输出固定电流恒压阶段切换到4.2V限压。用PWM调压的话可以在软件里实现状态机先设定一个较低的电压比如3.0V然后逐步升高同时用ADC监测充电电流当电流达到设定值后进入恒流模式通过调节PWM占空比维持电流恒定当电压达到4.2V后切换到恒压模式维持电压不变直到电流降到0.1C以下截止。这个方案比专用的TP4056芯片灵活得多充电电流和截止电压都可以通过软件调整适合多节电池串联或者非标准电压的电池组。6.2 配合ADC做闭环数控电源开环PWM调压的精度受温度和负载影响较大如果加上ADC反馈就变成了闭环控制。具体做法是用STM32的ADC采集输出端分压后的电压和设定值比较用PID算法调整PWM占空比。这样即使输入电压波动、负载变化输出也能稳定在设定值。我实测闭环控制下负载从0.1A变化到1.5A输出电压波动小于0.05V。PID参数整定的时候比例系数Kp先设小一点比如0.5积分系数Ki设0.01微分系数Kd设0然后根据响应曲线慢慢调。注意采样周期要大于PWM周期我用的采样周期是10ms对应100Hz远低于100kHz的PWM频率不会产生干扰。6.3 多路输出与程控电压序列STM32F103有4个定时器每个定时器有4个通道理论上可以控制16路LM2596。实际做多路输出的时候每路需要一个独立的GPIO和调理电路但可以共用输入电源。我用TIM2的4个通道做了4路输出分别给传感器、运放、显示屏和电机供电每路电压独立可调互不干扰。程控电压序列在测试场景里特别有用。比如测试一个宽电压输入的模块需要从3V逐步升到9V再降回来用这个电源写个循环就能自动完成不用手动拧电位器。我写了一个简单的序列执行函数把电压-时间序列存在数组里定时器中断里逐个执行精度和重复性都比手动操作好得多。7. 元件选型与PCB布局的实战经验7.1 关键元件的选型清单元件型号/参数备注主控芯片LM2596S-ADJTO-263封装可调版本续流二极管SS343A/40V肖特基压降0.5V电感33μH/3A屏蔽DCR50mΩ输入电容220μF/35V0.1μF电解陶瓷并联输出电容220μF/25V0.1μF电解陶瓷并联反馈电阻1kΩ7.15kΩ 1%金属膜缓冲三极管2N3904NPNTO-92上拉电阻10kΩ使能脚上拉基极电阻1kΩ限流输出滤波10μH100μF二级LC滤波泄放电阻1kΩ/0.25W关断放电这个清单里的元件都是常见易买的总成本不超过15元。SS34可以用1N5819替代但压降略高效率会低2%左右。电感如果买不到33μH47μH也可以用但输出纹波会略大需要加大输出电容。7.2 PCB布局的五个关键原则第一输入电容必须紧靠LM2596的VIN引脚和GND引脚走线越短越好。输入电容的作用是提供开关瞬间的峰值电流走线长了会产生寄生电感导致VIN引脚电压振铃严重时可能损坏芯片。第二续流二极管的阴极和电感的连接点要尽量短这个节点是开关节点dv/dt很高走线长了会辐射EMI。我的做法是把二极管和电感放在芯片同一侧走线长度控制在5mm以内。第三反馈电阻的分压点要从输出电容的正极直接引出不要从负载端引。从负载端引的话负载电流在走线上的压降会被反馈回路放大导致输出电压随负载变化。我第一版就是从负载端引的1A负载时输出比空载低了0.3V。第四使能脚的PWM信号线要远离反馈线和输出线最好用地线包起来。PWM信号是100kHz的方波边沿很陡容易耦合到高阻抗的反馈节点上。我在PCB上把PWM线走在底层反馈线走在顶层中间隔了地平面耦合明显减小。第五散热焊盘要大面积铺铜并且打过孔到背面。LM2596的散热主要靠PCB铜箔铺铜面积越大热阻越低。我实测25mm×25mm铺铜加9个过孔热阻约35℃/W比10mm×10mm铺铜低了近一半。7.3 调试工具与测量方法调试这个电路万用表和示波器是必备的。万用表用来看直流输出电压示波器用来看纹波和开关波形。测纹波的时候要注意方法示波器探头要用弹簧接地环不要用长地线夹长地线会引入额外的环路电感测出来的纹波比实际大好几倍。我一开始用长地线夹测出来200mV纹波换了弹簧接地环之后只有50mV。测开关波形的时候探头要接在LM2596的第2脚OUT和GND之间能看到150kHz的方波占空比随负载变化。如果方波有振铃说明寄生电感太大需要优化布局。如果方波频率不对说明芯片可能损坏或者反馈回路有问题。还有一个实用技巧用电子负载做动态测试。设定电子负载在0.1A和1A之间以100Hz交替切换用示波器观察输出电压的瞬态响应。好的设计应该在负载跳变时电压波动小于100mV恢复时间小于1ms。如果波动太大说明输出电容不够或者反馈响应太慢。8. 常见问题与快速排查指南8.1 输出为零或不可调最常见的原因是使能脚逻辑搞反了。如果你用的是NPN三极管反相驱动PWM占空比0%时输出最大100%时输出为零。如果发现占空比越大输出越低说明逻辑是对的如果占空比越大输出越高说明三极管接错了或者用了P沟道MOS。另一个原因是反馈电阻虚焊或者阻值不对。用万用表测FB脚电压正常应该是1.23V左右。如果FB电压为零检查R1是否接地良好如果FB电压等于输出电压检查R2是否开路。8.2 输出纹波过大按可能性排序输出电容失效或容量不足、电感饱和、接地不合理、PWM滤波不足。先用示波器看纹波频率如果是100kHz说明PWM滤波不够加大使能脚的RC滤波如果是150kHz说明输出滤波不够加大输出电容或电感如果是低频波动说明反馈回路不稳定检查补偿电容。8.3 芯片发热严重先算功耗P(Vin-Vout)×Iout×0.15。如果超过1W必须加散热片。如果功耗不大但还是很烫检查电感是否饱和、二极管是否接反、输出是否短路。LM2596有热关断保护温度超过150℃会自动关断但长期高温运行会缩短寿命。8.4 PWM无输出或频率不对用示波器直接测MCU的PWM引脚看有没有波形。如果没有检查定时器配置和GPIO复用功能是否使能。如果频率不对重新计算PSC和ARR值。注意STM32F103的APB1定时器时钟在系统时钟72MHz时是72MHz不是36MHz很多人在这里算错。9. 个人实操心得与几个容易忽略的细节这个改造项目我从画板子到调试完成大概花了一周时间中间踩了不少坑也积累了一些文档里不会写的经验。第一个心得是关于三极管的选择。2N3904的开关速度足够应付100kHz但它的集电极-发射极饱和压降有0.2V左右在使能脚上会产生一个小的残余电压。如果追求更低的关断电压可以用2N7002这种小功率MOS管导通电阻只有几欧姆饱和压降几乎为零。我后来换成了2N7002输出0V时的残余电压从0.02V降到了0.005V。第二个心得是关于PWM死区。STM32的定时器可以设置死区时间防止互补输出同时导通。但在这个应用里单路PWM不需要死区。如果你不小心使能了死区占空比会有几个计数的偏差导致低压端调不到0V。检查CubeMX里的Dead Time配置确保是0。第三个心得是关于电源去耦。STM32的VDDA引脚一定要加LC滤波否则MCU内部的ADC参考电压会被PWM开关噪声干扰导致ADC读数跳动。我用了一个10μH电感和1μF电容给VDDA供电ADC的噪声从±5LSB降到了±1LSB。第四个心得是关于输出电容的ESR。电解电容的等效串联电阻在低温下会显著增大导致纹波变大。如果应用环境温度可能低于0℃建议用固态电容或者钽电容替代电解电容。我冬天在阳台上测试的时候普通电解电容的纹波比室温下大了近一倍换了固态电容后就稳定了。第五个心得是关于程序里的浮点运算。STM32F103没有硬件浮点单元浮点乘除都是软件模拟速度较慢。在Set_Output_Voltage函数里做一次浮点运算大概需要几十微秒如果放在高频中断里会影响实时性。我的做法是预先算好占空比表运行时直接查表避免浮点运算。最后说一个扩展思路这个PWM调压的原理其实不限于LM2596任何带有使能引脚的开关稳压芯片都可以用类似的方法改造比如LM2576、MP1584、XL4015等。区别只在于使能引脚的阈值电压和响应速度不同需要重新调整PWM频率和滤波参数。掌握了这个思路你手头的大部分降压模块都能变成数控电源。