做硬件这件事时间越久越会发现真正卡脖子的往往不是那些花哨的模块而是一台老老实实的可调恒流源。给激光二极管做老化测试不敢用恒压源给LED灯珠量光功率必须固定电流给锂电池组做容量测试又要限流充电给PT100这类电阻型传感器供电也离不开恒定电流激励。商用可编程直流电源当然好用但一台入门级设备的价格足以劝退大多数个人实验室。这台用STM32IRF640搭建的300mA可调恒流源就是我在这种需求下反复迭代出来的方案电流0-300mA连续可调通过单片机数字设定配合ADC实时监测输出电流带OLED显示和旋转编码器交互整套BOM清单和设计细节全部公开。无论你是电子爱好者、实验室工程师还是正在做电源方向毕业设计的学生这套方案都能直接抄作业也可以在此基础上扩展成更完整的多量程电源。1. 为什么是STM32IRF640从实验室需求到核心选型复盘1.1 恒流源的本质与实验室级到底指什么恒流源这个东西听起来玄乎本质就是一套负反馈系统。把电流从负载回路里引出来经过采样电阻转成电压拿去跟目标基准电压做比较再用比较结果去推动功率管调节导通程度。电流大了就关小一点电流小了就开大一点最终稳定在设定值上。打个比方这就像一个自动调节的水龙头你看水压表发现水流太大就拧小阀门小了再拧开直到流速刚好。恒流源内部的运放和功率管每秒都在做这件事而且响应速度远比你手动拧快得多。所谓实验室级我对它的定义很简单设定值是多少输出电流就稳定在多少不随负载电阻变化而明显漂移长时间工作温升可控并且具备数字设定和实时监测能力。这个标准下电位器方案的痛点就暴露了碳膜电位器有温度系数手一碰数值就晃时间久了接触不良更别说做程序化扫描输出。所以我的结论很明确用STM32生成高精度基准电压模拟恒流环负责功率输出数字部分负责设定、监测和校准两者各司其职。1.2 IRF640的核心参数与选型逻辑IRF640是N沟道增强型MOSFET很多人第一时间觉得拿它做300mA有点大材小用。但看看参数你就会理解这个选择VDSS为200V连续漏极电流ID可达18ARDS(on)典型值0.18欧姆VGS(th)在2到4伏之间。这些参数放在一个TO-220封装里单价不过两三块钱而且五颗起买也没压力。具体到我们这个方案IRF640的优势有三点。第一300mA的设定电流连它额定电流的零头都不到即使在极限压差工况下导通损耗也基本可以忽略。第二200V的耐压余量很大实验室里电源电压经常是12V、24V甚至更高的开关电源感性负载关断瞬间还会产生反冲尖峰高耐压给了足够容错空间。第三TO-220封装十分友好可以锁在散热片上也方便手工焊接更换比贴片MOS管更适合做实验设备。当然它也有个需要注意的地方VGS(th)最高4V也就是说完全导通需要10V级别的栅压。所以运放供电电压不能取STM32的3.3V我实际用的是5V运放输出摆幅接近5V时IRF640已经进入可靠的线性调节区。如果你想让系统支持更大电流这个驱动电压余量依然够用架构不需要大改。1.3 为什么不做纯模拟恒流源而是让MCU介入纯模拟方案也不是不行一个精密基准源加一个多圈电位器接到运放同相端就能搭出不错的恒流源。但你说它是实验室级吗我觉得差一口气。电位器调出来的电流值没有视觉反馈不知道当前输出是多少毫安更别提把电流以0.1mA步进精确设定到某个值。测试重复性也很差你上午调好的状态下午可能因为电位器漂移就变了。STM32介入之后这个系统就完全变了一个物种。设定值以数字的形式存放在寄存器里通过DAC输出电压作为基准不存在机械漂移问题。ADC实时采样电流OLED屏幕上直接显示实测值。编码器一转就是1mA步进按下按键还能切换粗调/微调。更进一步如果需要做阶梯电流扫描或者定时输出完全可以在软件层面扩展不用改任何硬件。这就是让单片机参与控制带来的价值。2. 参数推导采样电阻、运放环路与MOS管散热的计算过程2.1 采样电阻的取值逻辑分辨率、功耗和可用电压的三角权衡恒流源最核心的换算公式是Iout Vref / Rs其中Rs是采样电阻阻值Vref是送到运放同相端的基准电压。这个公式决定了整个设计的基调。采样电阻取得越大同样电流下产生的反馈电压越高对基准电压分辨率和运放失调电压的敏感度越低但代价是负载上可用的电压被压缩电阻自身功耗也上升。我针对300mA满量程做了测算几个常见取值对比很直观采样电阻300mA时压降电阻功耗DAC满量程利用率对应Vref范围0.5Ω0.15V0.045W4.5%0~0.15V1Ω0.3V0.09W9%0~0.3V3.3Ω0.99V0.297W30%0~0.99V10Ω3V0.9W91%0~3V如果选1欧姆DAC满量程的91%都被浪费电流分辨率虽然还是够的但基准电压的任何微小噪声和失调都会按比例放大到电流上。选10欧姆倒是把DAC范围用得很足可电阻要承受0.9W功耗还得换成2W甚至3W封装同时负载的可用电压少了整整3V12V供电下显得很浪费。最后我选的是3.3欧姆1%精度2W额定功率。300mA时压降0.99V功耗不到0.3W散热压力小。基准电压范围0到0.99V12位DAC用满约30%每个LSB对应的电流分辨率大约是0.24mA足够精细。这个取值在12V和24V电源下都能用是300mA量程下的一个平衡点。2.2 运放环路设计与防振荡补偿运放在这里的作用是构成恒流负反馈环同相端接基准电压Vref反相端接采样电压VRs输出端直接驱动MOS管栅极。当输出电流偏大时采样电压升高反相端电压高于同相端运放输出下降MOS管导通程度减小电流被拉回来。整个环路每秒都在做这种微调。运放选型上最稳妥的是轨到轨单电源运放例如MCP6002或者SGM8534它们输入失调电压通常在1mV左右而LM358这类老型号典型的失调是5mV在3.3欧姆采样电阻上会换算成约1.5mA的电流误差校准时虽然能修正一部分但温漂却很难完全补偿。我的建议是预算允许就直接上MCP6002省去后面跟漂移较劲的麻烦。环路稳定性也是这个方案能否长期稳定工作的关键。最开始我搭的板子没有做补偿用示波器看采样电阻上的波形发现某些负载条件下会出现高频振荡大概在几百千赫兹的尖峰听感上甚至会从散热片附近传出微弱啸叫。解决方案有两个一是在运放输出到反相输入端之间并联一个22pF的陶瓷电容形成积分补偿二是在MOS管栅极串接一个100欧姆电阻抑制栅极振铃。这两招同时用上之后从空载到满载的整个区间输出都稳定得干干净净。2.3 MOS管的功耗边界与散热片选型恒流源和恒压源最大的不同在于多余的功率都消耗在调整管上。电流设定为300mA时MOS管的耗散功率等于输入电源电压 - 负载电压 - 采样电阻压降× 电流。这个公式决定了散热片的规格。我用12V供电做了一组实际推演结果如下负载电阻负载压降MOS管压降MOS管功耗5Ω1.5V9.51V2.85W10Ω3.0V8.01V2.40W20Ω6.0V5.01V1.50W30Ω9.0V2.01V0.60WTO-220封装在不加散热片的情况下结到环境的热阻大约是62摄氏度每瓦2.85W意味着结温升高170多度直接烧毁。而加上一个几十克的小型铝散热片热阻可以降到20摄氏度每瓦左右2.85W功耗下温升约57摄氏度环境25度时散热片表面大约82度烫手但管子还在安全范围内。如果你的电源电压更高或者经常接近满载运行我建议散热片再大一号甚至加个小风扇强制风冷。IRF640的最高结温是150度长期使用最好留出30%以上的裕量。3. STM32控制链路从DAC/PWM基准到ADC闭环标定3.1 有没有DAC决定了STM32型号的选择STM32家族内部并不是所有型号都带DAC这一点特别坑人。比如最常见的STM32F103C8T6内置ADC和定时器很齐全偏偏没有DAC外设。如果你在淘宝上随手买一块蓝色Pill板就开始做很快就得面对基准电压从哪来的问题。有两条路可以走。第一条换芯片或者换最小系统板例如STM32F103RCT6就内置12位DAC引脚输出范围0到3.3V软件里直接写DAC_SetChannel1Data这个函数就能生成基准电压硬件极简。第二条如果你手头已经有C8T6不想换可以用定时器的PWM输出加二阶RC滤波来模拟DAC。PWM频率取20kHz以上RC截止频率取1kHz左右经过两级低通滤波之后再经过运放缓冲给到恒流环。10位PWM模式下满量程对应约0.3mA/LSB的分辨率作为普通用途完全够但有大约0.5mA级别的纹波抖动做精密测试时会有感知。我更推荐直接上带DAC的型号比如STM32F103RCT6理由很简单内置DAC是真正的12位分辨率输出建立快无纹波软件只需要关心数值换算公式不用跟滤波电路的时间常数较劲。3.2 软件换算与主循环设计整个数字控制部分其实不复杂核心是两个换算公式。设定电流到DAC值的换算DAC_Value (I_set / 1000) × 3.3 × (4095 / 3.3)因为Vref I_set × RsRs取3.3欧姆这个式子可以进一步化简为DAC_Value I_set × 4095 / 909。反向的ADC采样换算I_measured V_ADC / 3.3 × 4095_adc × 1000 / 3.3最终得到毫安值。主循环的结构也很直白while (1) { read_encoder(delta); if (delta ! 0) { i_set delta; // 编码器增量调整设定值 clamp(i_set, 0, 300); // 限制在0-300mA dac_value i_set * 4095 / 909; // 设定电流转DAC DAC_SetValue(dac_value); } adc_value read_adc_filtered(); // 多次采样取平均 i_measured adc_value * 3300 / 4095 / 3.3; oled_show(i_set, i_measured); }ADC滤波我用的是排除了最大值和最小值后取平均的方法连续采16次先排序扔掉两端各一个剩下14个求平均。这个办法看效果非常明显显示数值能从抖动正负2mA收敛到正负0.5mA以内。3.3 二点标定为什么说不校准就谈不上实验室级即使元件都用1%精度整个链路的误差来源依然不少3.3V基准电压的绝对精度、DAC的增益误差、采样电阻的偏差、运放的失调电压每一项都可能贡献几毫安的误差。堆在一起不校准的板子实测可能偏差到正负10mA这在实验室级的定位下是不能接受的。解决办法是二点标定。开机后先进入标定模式用外部精密万用表串联在输出回路中把设定值调到0mA记录ADC的输出这对应零点偏移再把设定值调到300mA记录实际电流和ADC读数计算出增益系数。最后把这两个参数存入STM32的Flash每次开机读取并应用到显示和设定链路上。用这个方法校准之后整机在常温下基本能做到正负1mA以内的误差。还有一个很多人不知道的细节DAC和ADC共用一个3.3V的基准源时基准电压的绝对漂移对设定和测量的影响会在换算中部分抵消。简单说如果基准从3.29V漂到3.31VDAC输出电压和ADC采样电压同时变化换算成电流后误差反而没那么大。所以做这个项目时不需要花钱去买高精度外部基准共用内部3.3V就够了。4. 原理图、PCB与保护电路里的工程化细节4.1 原理图模块划分与关键连接整个系统按功能可以切成四块电源模块、恒流模拟环、STM32数字控制、人机交互。电源模块负责把外接12V适配器转换成5V和3.3V12V直接接到功率回路给负载供电5V给运放供电3.3V给STM32、OLED和编码器供电。恒流模拟环的核心就是运放加IRF640加采样电阻数字部分提供基准电压并读取采样点。有几个连接细节决定了系统能不能稳定工作。运放同相端接DAC输出反相端接采样电阻的高端MOS管源极接采样电阻的低端采样电阻的低端再接到系统地。负载接在12V电源正极和IRF640漏极之间。运放输出端经过100欧姆电阻接到MOS管栅极。这里特别要注意采样电压的走线必须从采样电阻两端直接引到运放输入引脚不能顺着功率电流的走线绕一圈否则走线上的寄生压降会叠加到采样电压里造成电流误差。4.2 PCB布局开尔文连接、单点接地与走线宽度PCB布局上我踩过一次很深的坑。第一版板子为了省事把采样电阻到运放反相端的走线设计得很长中间还过了两个过孔结果万用表测出来的电流和设定值之间总是差那么几个毫安而且负载变化误差跟着变。查到最后发现就是那段走线的铜箔电阻参与了采样造成了系统性偏差。后来改成了开尔文连接采样电阻的两端各引出一对走线一对走功率电流一对专门送到运放输入这样功率通道上的压降就被排除在反馈环路之外了。地线的处理原则同样重要。功率地包括输入电源负极、滤波电容负极、采样电阻地端模拟地包括运放信号地、DAC输出地、STM32的AGND。两类地分开走最后在输入电源的负极处单点汇合。这样做的好处是功率回路里的脉冲电流不会在地线上产生压降去干扰模拟信号的处理。300mA的电流在PCB走线上其实不需要太宽就能安全通过但我在实际设计时还是把MOS管源极到采样电阻、采样电阻到系统地这段功率走线加宽到了2mm顺便多打了几个过孔目的是降低这段关键通路的电阻和热阻给未来的电流扩展留点余量。4.3 保护细节上电状态、ESD与反接风险MOS管在硬件上最容易忽视的保护是栅源之间的泄放电阻。在STM32还没初始化、DAC输出为高阻状态的时候如果没有这个电阻MOS管栅极处于悬空状态静电或者噪声就可能让管子误导通导致上电瞬间负载收到一个不受控的冲击电流。我在栅源之间并了一个100k欧姆的电阻同时这个电阻也保证通过运放输出上电前缓慢泄放栅压让MOS管默认处于截止状态。输出反接是恒流源使用中最常见的损坏场景。恒流模式下如果负载接反环路依然会努力维持设定电流但此时MOS管要承受几乎全部电源电压和设定电流的乘积功耗可能高达数瓦容易超温。我在设计上没有在输出端串防反二极管因为那个二极管会引入额外压降影响恒流精度。正确做法是在输出端子旁边印上明显的正负极标记同时在软件里加强散热保护——如果ADC检测到MOS管压降超过某个阈值持续一段时间主动把电流降低到安全值并报警。5. BOM清单全公开元件选型和可替代方案5.1 完整BOM清单整个项目的物料成本控制得相当低批量打样加单件采购的情况下单台成本可以压在90元以内。下面是完整的清单序号元件规格数量参考单价备注1STM32F103RCT6最小系统板带12位DAC120元也可以用C8T6加PWM方案2IRF640TO-220N沟道MOSFET12.5元建议多买几只备用3MCP6002轨到轨运放SOP-812元可用SGM8534、LM358替代4采样电阻3.3Ω ±1%2W金属膜11元精度直接影响整机指标50.96英寸OLEDI2C接口110元SSD1306驱动6旋转编码器EC11带按键11.5元带旋钮帽7AMS1117-3.3LDO稳压10.5元给STM32供电8DC-DC降压模块12V转5VMP1584方案13元给运放和OLED供电9TO-220散热片小型铝散热片11元配弹簧扣10陶瓷电容100nF22pF等若干3元去耦和环路补偿11电阻10k100Ω100k等若干2元上拉、隔离、泄放12PCB打样5片10x10cm以内130元嘉立创5片约30元1312V电源适配器12V/1A115元输入供电这个表里最不能省的地方就是采样电阻。3.3欧姆1%精度是底线如果手里有低温漂的金属箔电阻那更好。普通碳膜电阻温度系数太大300mA电流让电阻自身发热温度升高阻值漂移电流跟着漂这种情况在调试的时候非常难排查。5.2 关键元件的替代思路如果手头元器件不齐全有几个替代方案是验证过可行的。运放部分MCP6002可以用SGM8534替换后者是国产运放里性能不错的轨到轨型号如果手头有一个LM358临时用也能跑但建议把采样电阻从3.3欧姆改到1欧姆让失调误差的绝对值小一些同时做好接受正负几毫安偏差的心理准备。MOS管方面IRF640买不到的时候可以用STP55NF06或者IRLZ44N替换。IRLZ44N是逻辑电平MOS栅极3.3V就能完全导通如果运放供电想降到3.3V这个管子更合适。但要注意它的RDS(on)比IRF640大大电流工况下发热明显增加300mA的应用里倒无所谓。没有内置DAC的STM32型号前面已经说过用PWM加RC滤波。如果系统里还挂了外接DAC模块MCP4725I2C接口和OLED共用总线也能实现完全相同的功能。MCP4725自身输出是轨到轨的精度和稳定度都很好唯一的缺点就是写I2C的代码比写DAC寄存器要稍微多一点工作。6. 从空载到300mA的实测调试流程与常见故障定位6.1 第一次上电的检查清单拿到打样好的板子焊接完毕第一次上电不要太激动按这个顺序检查能省下很多排查时间。先用万用表的通断档确认输入12V正负极之间没有短路再确认IRF640的D和S之间没有短路这一步能避免上电瞬间烧管子。接着不接负载只给板子上电测量3.3V和5V是否正常用示波器或者万用表检查DAC输出是否在0V左右因为软件初始化之后设定电流默认是0mA。最后再接上假负载电源适配器限流如果可调把限流先设到200mA左右旋编码器缓慢增加设定值观察电流是否跟着上升。我习惯用一根10欧姆5W的水泥电阻当假负载电流300mA时功率约0.9W轻松应对。6.2 高频振荡、电流失控和数值跳动三个典型故障的定位过程调试过程中最容易遇到的问题是电流设定值附近出现高频振荡。现象是OLED上电流数值不稳示波器接采样电阻两端能看到几百kHz的尖峰。根因基本在环路补偿上运放输出到栅极没有串电阻或者反馈电容没加。解决方案就是前面说的22pF反馈电容加100欧姆栅极电阻两个元件加上后振荡立刻消失。如果你的振荡频率更低比如几十千赫兹可以把反馈电容加大到100pF试试代价是响应速度略微下降对这个应用完全可以接受。另一个典型故障是设定50mA实际输出突然飙到接近最大值。这个问题的定位思路是看运放输入。用万用表测运放同相端和反相端的电压理论上这两个电压应该相近。如果反相端电压明显低于同相端说明反馈环路断开最常见的原因就是采样电阻虚焊或者MOS管源极到采样电阻之间的焊盘连锡了。照着这个思路排查多数情况下几分钟就能定位。数值跳动是第三个常见问题但很多时候不是硬件而是软件滤波不足。我第一版固件只做了简单单次ADC采样显示数值在正负3mA之间来回跳。改成16次采样排序去极值求平均之后跳动收敛到正负0.3mA以内。如果你做完软件滤波还有跳动检查一下ADC引脚旁边有没有大电流走线就近加一个100nF的电容也会有改善。6.3 校准后的实测数据在完成二点标定之后我记录了室温下的一组数据用四位半万用表串联在回路中作为读数基准设定电流实测电流偏差50mA49.8mA-0.2mA100mA100.2mA0.2mA150mA149.9mA-0.1mA200mA199.8mA-0.2mA250mA250.1mA0.1mA300mA300.4mA0.4mA满载连续运行半小时之后IRF640散热片温度大概在60摄氏度上下重新测量电流仍有微小变化但不超过正负0.5mA。这个表现对于一台总成本不到100元的自制设备来说已经非常体面了。从整机的稳定性和扩展性来看这套STM32IRF640方案真正的价值不在于某一个零件的性能而在于它的结构足够干净模拟恒流环和数字控制彼此独立采样电阻换一个规格就能改变量程运放环路补偿参数可以在很宽的电流范围内保持稳定。如果你想做1A甚至5A的版本只需要换掉采样电阻和MOS管再重新算一遍散热其余部分几乎可以原样复用。我自己在迭代过程中最大的体会是先把模拟环路调到不动如山再轮到软件去发挥它的灵活这个顺序千万别反过来。
