☰
STM32+IRF640自制300mA可调恒流源:原理、计算与实测全解析
2026/9/25 1:48:37 网站建设 项目流程

做硬件这件事,时间越久越会发现,真正卡脖子的往往不是那些花哨的模块,而是一台老老实实的可调恒流源。给激光二极管做老化测试不敢用恒压源,给LED灯珠量光功率必须固定电流,给锂电池组做容量测试又要限流充电,给PT100这类电阻型传感器供电也离不开恒定电流激励。商用可编程直流电源当然好用,但一台入门级设备的价格足以劝退大多数个人实验室。这台用STM32+IRF640搭建的300mA可调恒流源,就是我在这种需求下反复迭代出来的方案:电流0-300mA连续可调,通过单片机数字设定,配合ADC实时监测输出电流,带OLED显示和旋转编码器交互,整套BOM清单和设计细节全部公开。无论你是电子爱好者、实验室工程师,还是正在做电源方向毕业设计的学生,这套方案都能直接抄作业,也可以在此基础上扩展成更完整的多量程电源。

1. 为什么是STM32+IRF640:从实验室需求到核心选型复盘

1.1 恒流源的本质与"实验室级"到底指什么

恒流源这个东西,听起来玄乎,本质就是一套负反馈系统。把电流从负载回路里引出来,经过采样电阻转成电压,拿去跟目标基准电压做比较,再用比较结果去推动功率管调节导通程度。电流大了就关小一点,电流小了就开大一点,最终稳定在设定值上。打个比方,这就像一个自动调节的水龙头:你看水压表发现水流太大,就拧小阀门,小了再拧开,直到流速刚好。恒流源内部的运放和功率管每秒都在做这件事,而且响应速度远比你手动拧快得多。

所谓"实验室级",我对它的定义很简单:设定值是多少,输出电流就稳定在多少,不随负载电阻变化而明显漂移,长时间工作温升可控,并且具备数字设定和实时监测能力。这个标准下,电位器方案的痛点就暴露了:碳膜电位器有温度系数,手一碰数值就晃,时间久了接触不良,更别说做程序化扫描输出。所以我的结论很明确,用STM32生成高精度基准电压,模拟恒流环负责功率输出,数字部分负责设定、监测和校准,两者各司其职。

1.2 IRF640的核心参数与选型逻辑

IRF640是N沟道增强型MOSFET,很多人第一时间觉得拿它做300mA有点大材小用。但看看参数你就会理解这个选择:VDSS为200V,连续漏极电流ID可达18A,RDS(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.15V
1Ω0.3V0.09W9%0~0.3V
3.3Ω0.99V0.297W30%0~0.99V
10Ω3V0.9W91%0~3V

如果选1欧姆,DAC满量程的91%都被浪费,电流分辨率虽然还是够的,但基准电压的任何微小噪声和失调都会按比例放大到电流上。选10欧姆倒是把DAC范围用得很足,可电阻要承受0.9W功耗,还得换成2W甚至3W封装,同时负载的可用电压少了整整3V,12V供电下显得很浪费。

最后我选的是3.3欧姆,1%精度,2W额定功率。300mA时压降0.99V,功耗不到0.3W,散热压力小。基准电压范围0到0.99V,12位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.85W
10Ω3.0V8.01V2.40W
20Ω6.0V5.01V1.50W
30Ω9.0V2.01V0.60W

TO-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 × Rs,Rs取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.31V,DAC输出电压和ADC采样电压同时变化,换算成电流后误差反而没那么大。所以做这个项目时,不需要花钱去买高精度外部基准,共用内部3.3V就够了。

4. 原理图、PCB与保护电路里的工程化细节

4.1 原理图模块划分与关键连接

整个系统按功能可以切成四块:电源模块、恒流模拟环、STM32数字控制、人机交互。电源模块负责把外接12V适配器转换成5V和3.3V,12V直接接到功率回路给负载供电,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-220,N沟道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转5V,MP1584方案13元给运放和OLED供电
9TO-220散热片小型铝散热片11元配弹簧扣
10陶瓷电容100nF,22pF等若干3元去耦和环路补偿
11电阻10k,100Ω,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模块MCP4725,I2C接口,和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.2mA
100mA100.2mA+0.2mA
150mA149.9mA-0.1mA
200mA199.8mA-0.2mA
250mA250.1mA+0.1mA
300mA300.4mA+0.4mA

满载连续运行半小时之后,IRF640散热片温度大概在60摄氏度上下,重新测量电流仍有微小变化但不超过正负0.5mA。这个表现对于一台总成本不到100元的自制设备来说,已经非常体面了。

从整机的稳定性和扩展性来看,这套STM32+IRF640方案真正的价值不在于某一个零件的性能,而在于它的结构足够干净:模拟恒流环和数字控制彼此独立,采样电阻换一个规格就能改变量程,运放环路补偿参数可以在很宽的电流范围内保持稳定。如果你想做1A甚至5A的版本,只需要换掉采样电阻和MOS管,再重新算一遍散热,其余部分几乎可以原样复用。我自己在迭代过程中最大的体会是:先把模拟环路调到不动如山,再轮到软件去发挥它的灵活,这个顺序千万别反过来。

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

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

立即咨询