尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

基于STM32和IRF640的可编程恒流源设计:低成本实验室方案

发布时间:2026/9/25 1:04:07

资讯中心
01
ARTICLE

基于STM32和IRF640的可编程恒流源设计:低成本实验室方案

基于STM32和IRF640的可编程恒流源设计:低成本实验室方案
做电子这么久只要进过实验室多半会遇到缺一台可调恒流源的尴尬。要测LED伏安特性要给电池做充放电曲线要验证稳压管击穿电压拿普通直流电源调电流往往拧到怀疑人生一不小心还过流烧东西。市面上一台像样的可编程恒流源又贵得离谱很多学生党或者刚工作的工程师只能望洋兴叹。这次分享的项目就是我自己用来解决这个问题的方案用STM32F103C8T6最小系统板 一路运放 一颗IRF640做一个0~300mA可调的实验室级恒流源。电流设定完全程控可以按键调、串口调也可以接传感器做自动扫描关键是整套方案成本不到40块电路原理清楚BOM清单、固件流程和调试踩坑全部公开。无论你是做STM32毕设缺一个能写进论文的完整功能模块还是纯粹想在洞洞板上攒一台好用的桌面工具这个方案都值得参考。1. 方案设计为什么是STM32 运放 IRF6401.1 恒流源的本质它不是“输出恒定”的电源很多人第一次接触恒流源会有一个直觉性的误解以为它是一个能“稳定输出电流”的电源。其实恒流源的本质是不管负载电阻怎么变只要没超出电路的电压上限流过负载的电流都保持在一个设定值。你设定300mA那么负载短路时是300mA负载是10Ω电阻时也是300mA负载是20Ω电阻时依然是300mA区别只是MOS管上多承担了多少压降。实现恒流最经典的方式就是“压控电流”。我给你的目标电流对应一个电压拿这个电压去控制功率管让采样电阻上的压降始终等于这个电压电流就等于Vset除以采样电阻。用天平来理解最贴切一端是设定电压“砝码”另一端是采样电阻的压降“秤盘”如果两边不平衡运放就自动调节MOS管的导通程度直到平衡。只要采样电阻精度够高电流就能做得很准。1.2 为什么用IRF640便宜、耐造、随手就有选IRF640这颗管子说实话一开始并不是因为它在恒流源里表现最优纯粹是我手边料箱里有好几颗从旧电源板上拆下来的存货不用白不用。但用着用着发现它在300mA这个量级上其实非常适合。IRF640是N沟道功率MOSFET耐压200V最大连续漏极电流18A。这些参数对300mA的小电流应用来说严重“过剩”但过剩有过剩的好处同样电流下管子工作温度更低不用担心动不动就过热。它既然是开关管驱动电压也低Vgs(th)大约2~4V用一颗低压运放加3.3V都能推到想要的电流值。当然它不是没有缺点。IRF640的输入电容Ciss大约1350pF对普通运放来说直接驱动这支电容容易引起振铃甚至自激所以栅极必须串联电阻抑制振荡。另外它是开关管线性区功耗管理不如专门的线性稳压管优雅需要算好散热。这些坑后面都会展开讲。还要解释一个很多人纠结的问题为什么选N沟道MOS而不是P沟道我要做低压侧恒流负载接漏极源极接采样电阻到地这样采样电阻上的电压就是相对地平面的正电压运放反相端可以很轻松地检测到它反馈逻辑简单直接。如果换成P-MOS放到高端你得做电平位移电路复杂一倍300mA这个量级完全没必要。1.3 为什么不用手拧电位器非要上STM32一个最基础的恒流源其实用一颗运放、一颗精密基准源、一颗电位器就能搭出来十年前我做过一个纯模拟版本直到现在还能用。那为什么还要加STM32核心原因是“可编程”带来的三个实用价值第一电流设定值可以存成数字不用每次手动对表盘第二可以做软件限流和软启动上电瞬间先让电流从0缓慢爬升LED和待测器件不会受到电流冲击第三可以把恒流源和ADC采样联动起来做自动扫描测试比如让电流从10mA步进到300mA每步之间记录负载电压一条I-V曲线很快就能扫出来。STM32F103C8T6这颗芯片在这个场景里属于性能溢出它有DAC外设PA4和PA5两个12位模拟输出通道正好用来产生设定电压它还自带多通道ADC可以实时采集采样电阻压降。一个芯片把“设定电压产生”和“实际电流反馈”全干了而且成本十几块钱。如果你手里是没有DAC的STM32型号也可以用PWM加二阶RC滤波产生等效模拟电压但纹波和响应速度都差点意思做实验室级设备我不太推荐。所以我选型时特意锁定了带DAC的型号。2. 硬件电路拆解从DAC到功率级每一环怎么算2.1 主电路链路从DAC输出到MOS管栅极整个功率回路的信号链路是这样的STM32的DAC输出设定电压经过一级电压跟随器隔离缓冲再经过一个栅极电阻送到IRF640的栅极。IRF640的源极接采样电阻采样电阻下端接GND采样电阻上端则反馈回运放反相输入端。负载接在VCC和MOS管漏极之间。这里每个元件都不是随便放的。DAC后面的电压跟随器第一作用是隔离STM32的DAC输出阻抗不小直接驱动运放同相端没问题但如果后面还要分压或滤波隔离后更稳第二作用是让运放的输出摆幅不受DAC负载影响。用一个普通的轨到轨运放就可以LM358勉强能用但输出摆不到轨如果你设定电压刚好在临界值会影响最大电流输出。我选的是LMV358单电源3.3V供电输出能接近轨电压性价比还高。栅极电阻Rg我取了47Ω。这个电阻的作用就是抑制运放输出级和MOS管Ciss之间的高频振荡。IRF640的输入电容不小如果运放输出直接连过来整个环路等效成一个二阶系统非常容易自激。串一颗几十欧的电阻相当于给环路增加了一个零点补偿实测下来大部分电路都能稳住。栅源之间我还并了一颗10kΩ电阻目的是在运放上电瞬间或者DAC还没初始化时把栅极电压拉到地避免MOS管误导通。采样电阻Rsense是这个恒流源的“眼睛”也是精度核心。我用的是1Ω、2W的低温漂合金电阻。300mA电流在它上面产生0.3V压降这个电压太高会影响MOS管最小压降太低了又被运放失调电压吃掉太多。0.3V对LMV358大约2mV的输入失调来说占比不到1%可以接受。2.2 运放反馈环路自激振荡是最容易踩的坑运放加MOS管构成恒流源电路上看起来只有几个零件但能不能稳定工作关键在于运放的反馈补偿。IRF640的Ciss加上实际布线寄生参数会让运放的闭环增益在高频段变得很奇怪。我一开始按最标准的电路搭运放输出直接拉过去结果一上电就看到示波器上几百kHz的衰减振荡电流表在目标值附近抖个不停。后来在运放反相输入端到输出端之间并联了一颗22pF的小电容配合栅极电阻一起压低环路带宽振荡立刻消失。需要注意的是这个补偿电容不能太大。如果你并到100pF稳定是稳定了但电流变化响应变得极慢设定值从100mA跳到200mA要好几毫秒才爬上去在线性扫描时就会看到明显的滞后。我做实验后的建议是先并10pF用示波器看有没有振铃有振铃再往上加直到临界阻尼。不要一上来就抄个大电容。还有一个很容易被忽略的点运放的电源去耦电容必须靠近运放电源引脚。很多洞洞板作品把104电容放在芯片旁边5cm以外的地方等于没有。自激和这个关系极大一个良好的100nF陶瓷电容放在运放电源脚1cm以内能解决一半的怪问题。2.3 保护电路与开尔文接法恒流源的负载有时候是感性元件比如电磁铁、继电器线圈。断开瞬间电感会产生反向电动势电压可以轻松击穿MOS管。所以我在漏极和地之间反向接了一颗1N5819肖特基二极管让续流电流有个泄放通道。如果是纯电阻或LED负载这颗二极管用不上但留着总比炸管好。采样电阻的接法是最影响实际精度的细节。Rsense两端各引一根线到运放反相端和地看起来很简单但你要确保反馈线直接落在采样电阻的焊盘上而不是从功率电流路径的中间节点“顺手”借一段走线。300mA的电流如果先流过一段地线再到采样电阻地线上的杂散压降会被运放当成采样电压的一部分直接导致设定输出偏小。这就是实验室常说的开尔文接法本质上是让采样信号和功率电流各走各的路避免互相干扰。输出电压上限也要心里有数。假如负载短路MOS管承受的电压就是电源电压。STM32最小系统板如果从USB取5V供电那MOS管满载时最大功耗是5V乘300mA1.5W不加散热片勉强能扛。如果你想测试更高电压的负载比如拿12V电源做实验那短路功耗会到3.6W必须给IRF640装一个指甲盖大小的铝散热片。要不要散热片不是看电流是看VCC乘电流的总功耗。3. STM32固件实现DAC输出、ADC采样与恒流闭环3.1 第一步用DAC直接输出设定电压最基础的固件其实很简单就是把目标电流换算成DAC输出电压。STM32F103的DAC是12位参考电压3.3V那么每个LSB对应的电压是3.3除以4096约0.8mV。换算代码如下float target_current_A 0.25f; // 目标电流 250mA float sense_resistor 1.0f; // 采样电阻 1Ω float target_voltage target_current_A * sense_resistor; uint16_t dac_code (uint16_t)(target_voltage * 4095.0f / 3.3f); DAC-DHR12R1 dac_code; // 通道1输出到PA4这个开环版本已经能工作了DAC输出电压送到运放同相端运放自动调节MOS管电流。你用一个万用表串在负载回路里会发现电流基本等于设定值误差大概在1%~3%足够应付很多日常测试。但实验室级设备不能止步于此。3.3V参考电压本身有误差LDO输出实际可能是3.28V或者3.31V采样电阻也不是严格1Ω可能是0.99Ω运放还有固有输入失调。这些误差叠加起来300mA档位可能偏好几mA。要解决就得做闭环校正。3.2 第二步ADC采样反馈做数字闭环STM32F103的ADC可以采集采样电阻两端的电压换算成实际电流然后和目标值比较用PI算法修正DAC输出。这个闭环的逻辑和模拟反馈类似但好处是校正量是精确的、可观测的。ADC采样需要注意几点采样电阻上的压降是0~0.3V对于ADC来说动态范围比较小可以直接采但一定要把采样时间设置得足够长否则内部采样电容充不满数值会偏低。我把采样周期配置成最大档大概几十微秒然后连续采16次取平均做一层简单的数字滤波。PI控制的关键是防止积分饱和。目标电流突然从10mA调到300mA时误差很大积分项会一路飙升等到实际电流到达目标值积分项还维持着很大的数值输出会冲过头然后来回震荡好几次才稳定。解决方式就是限幅积分项和输出都做上下限int32_t error target_mv - current_mv; integral error; if (integral 500) integral 500; if (integral -500) integral -500; int32_t adjust error * 3 integral * 1; if (adjust 800) adjust 800; if (adjust -800) adjust -800; int32_t new_code (int32_t)dac_code adjust; if (new_code 0) new_code 0; if (new_code 4095) new_code 4095; DAC-DHR12R1 (uint16_t)new_code;Kp取3、Ki取1这个组合是我在实际板子上试出来的对300mA级别的响应速度比较合适。如果你跟我的硬件参数差得远先从小到大试KpKp合适了再慢慢加Ki。闭环PID不是标准库函数我用的是整数运算因为单片机做浮点虽然也行但整数运算更直观且不会有精度损失问题。3.3 第三步标定与误差修正闭环以后误差主要来源于ADC本身的增益误差和偏移。STM32的ADC出厂校准值可以读但更稳妥的办法是外接一个标准万用表实测几组电流值然后用两点校正求出增益和偏移写成常数存到Flash里。具体做法设定100mA用万用表读实际值I1设定300mA读实际值I2。假设ADC采样回来的数字分别是A1和A2那么实际电流 diff / dADC * (ADC值 - A1) I1。把这个线性关系固化到代码里后续显示和闭环都用校正后的值。我测过校正后300mA档位误差可以稳定控制在±0.5%以内作为实验室设备够格了。内部电压基准还有一个妙用。STM32的3.3V通常来自AMS1117虽然不高精度但它内部有一个固定的VREFINT通道可以测量实际供电电压。程序启动后先读VREFINT反推出当前VDD的实际值再用这个实际值做DAC和ADC的转换系数这样即使换一块板子电池供电电压漂了电流依然准。4. BOM清单、成本与制作路线4.1 完整BOM清单整个项目的零件种类不多但每种都有讲究。我按一套实际可用的配置列出清单价格按常见渠道的零售价估算实际会有些浮动适合参考。序号元件规格/型号数量参考单价备注1主控核心板STM32F103C8T6 最小系统板112.0元用带DAC的型号PA4用于DAC输出2功率MOS管IRF640 TO-22011.5元拆机件也行注意批次一致性3运放LMV35810.8元也可用MCP6002、SGM85324采样电阻1Ω 2W 合金电阻10.6元务必用低温漂不要用碳膜5栅极电阻47Ω 0805/直插10.05元抑制振荡用6栅源泄放电阻10kΩ 0805/直插10.05元防上电误导通7反馈补偿电容22pF 瓷片电容10.05元根据振铃情况调整8电源去耦电容0.1uF 陶瓷电容20.1元一个给运放一个靠近MCU9反馈电容100nF 陶瓷电容10.1元用于DAC输出滤波可选10续流二极管1N581910.2元感性负载必备11散热片TO-220 小型铝散热片10.8元电流超过100mA就建议装12接线端子5.08mm 两脚20.4元用于电源输入和负载输出13按键6x6 轻触开关20.2元电流 / 电流-14OLED屏幕0.96寸 I2C SSD130616.0元可选实时显示电流15旋钮编码器EC11带开关11.2元可选代替按键16电源LDOAMS1117-3.310.5元核心板自带则不用单独买17PCB/洞洞板5x7cm12.0元建议打样成本更低18铜柱/螺丝M3一套若干1.0元固定散热片和板子不加屏幕和编码器的纯核心方案成本大约25元加上OLED和编码器也就30多元。用ST官方开发板的思路来做这个真的非常便宜了。4.2 三种制作路线别一上来就画四层板第一条路线也是我建议新手走的就是直接用STM32最小系统板加一块洞洞板搭功率部分。DAC信号用杜邦线连过去功率部分自己飞线。优点是不用画板子、不用等打样当晚就能做出来缺点是飞线过长容易引入噪声高频自激的概率会大一些但配合前面说的补偿电容还是能做稳的。第二条路线是打一次PCB把运放、MOS管、采样电阻、保护二极管全部集成在一张5cm×7cm的小板上然后留出排针插STM32最小系统板。这种“核心板功率底板”的结构最实用我做第二版就是这种方式以后想换主控把底板排针一拔换颗芯片就能继续用。第三条路线是完全自己画电路板连最小系统一起集成。适合毕设展示或者量产化改造。但说实话对这个项目来说没有必要STM32最小系统板十几块钱还带USB转串口自己集成反而增加制造和调试成本。4.3 供电设计AMS1117周边别想得太玄整个系统有两种电源STM32的3.3V逻辑电源和功率侧的VCC电源。最简单的做法是统一用一个5V电源输入AMS1117降到3.3V给MCU和运放5V直接接负载回路。这样对IRF640来说承受的电压就是5V减负载压降功耗不大。这里要特别说一个网上经常讨论的坑AMS1117的输出电容该用钽电容还是陶瓷电容。有人担心AMS1117这种LDO用低ESR陶瓷电容会不稳定实际测试下来输出端用一个22uF的X7R陶瓷电容再并一个0.1uF高频电容完全没问题。真正要注意的是输入输出电容要尽量靠近芯片引脚走线不要拉太长。我已经在多块板上这么用了没有一次因为电容问题出过事。功率地和模拟地要在采样电阻的地端单点汇合这是模拟电路的基本功。如果PCB上到处都是地噪声会从功率回路串到信号回路ADC采样数值会跳个不停。标准做法是运放、DAC走信号地MOS管、采样电阻走功率地两块地在采样电阻下端焊盘处焊在一起。5. 调试流程与常见故障排查5.1 上电调试顺序千万别直接带负载第一次通电不要急着接负载按照下面这个顺序一步一步来能帮你省出一半以上的排查时间。第一步先把MOS管焊下来或者让MOS管栅源短接确保功率回路断开。给板上电用万用表量STM32的PA4引脚看DAC有没有输出设定电压。这里最容易出问题的是STM32的DAC通道没有使能或者引脚被复用成了GPIO导致PA4始终是0V。如果代码没错量到0.2V左右对应200mA设定值说明信号链路正常。第二步焊上MOS管和采样电阻但负载先接一个510Ω的电阻保证负载电流远小于设定值让MOS管工作在可变电阻区。上电后用一个示波器探头夹在采样电阻两端观察波形。如果看到干净的水平线说明环路稳定如果看到频率比较高的正弦波或者毛刺乱跳说明自激了按之前说的调整补偿电容。第三步把负载换成LED或者短路线从最低电流开始缓慢往上调。每调一次用万用表串在回路里读一次电流看和设定值是否一致。这里要强调万用表测电流时表笔本身也有接触电阻在300mA下会造成轻微读数偏差最好用四线制测量或者用钳表校准。5.2 典型故障排查表调试过程中遇到最多的问题我整理成了一份速查表基本覆盖90%的情况。现象可能原因排查/解决上电瞬间负载就亮/电流最大值MOS管栅源电阻没焊或DAC上电默认输出高电平确保Rgs10kΩ代码初始化DAC时先输出0再软启动电流不受控调设定值没反应运放的供电没接、运放接错引脚、采样电阻反馈线断核对运放引脚定义量反相端电压是否为0V电流在设定值附近高频抖动运放环路自激IRF640的Ciss造成相位余量不足加大反馈电容到47pF缩小栅极走线回路在负载断开时输出还算准带载后偏低采样电阻地线走了功率回路开尔文接法失效把反馈地线单独引到采样电阻负端焊盘电流调到最大只有某值上不去DAC输出电压摆幅不够或运放不是轨到轨换LMV358/MCP6002或提高模拟电源电压IRF640烫得不敢摸负载压降过大MOS管功耗超过散热能力加散热片降低VCC或减小目标电流串口无法烧录程序STM32的USB/串口驱动没装或PA9/PA10被占用先把BOOT0拉高用串口ISP擦除再烧录OLED/编码器有显示但电流没变I2C地址错误/编码器引脚接错DAC值未更新打印实际DAC值确认是否在代码中被错误覆盖5.3 独家避坑心得第一IRF640的栅极绝不允许悬空。调试时如果运放还没装或者运放供电断了MOS管栅极处于高阻状态一个静电或者附近电网的感应电压就能把它顶到导通状态。我为这事吃过一次亏板子放桌上手一碰栅极引脚负载直接满血导通幸亏电流不大没烧东西但吓了一跳。从此所有闲置MOS管我都用短接线短路三根脚装到板子上也先确认栅源电阻在位上。第二示波器探头一定要用短地弹簧不要用那根大鳄鱼夹地线。大鳄鱼夹等效于给测量回路接了一大圈天线在300mA电流和MOS管开关电路旁边会感应出一堆噪声你会看到一个实际根本不存在的“振铃”然后花一晚上加补偿电容。换了短地弹簧很多“振铃”当场消失。第三别在迷你面包板上跑300mA。面包板的触点接触电阻大而且不稳定电流小的时候显示不出来一旦上几百毫安触点发热电阻漂移采样电阻电压跟着飘你的闭环输出也会跟着乱跳。这个项目至少要上洞洞板焊接。第四如果发现STM32的PA4引脚电压总是比DAC寄存器值偏低先查是不是代码里某个外设把PA4也复用了。STM32的引脚复用如果配置冲突DAC输出会被GPIO拉低这是我在一次半夜调试中血泪重复过的坑。6. 扩展玩法从恒流源到更完整的程控电源做完这个300mA恒流源之后你会发现这套电路其实是一个“低压小电流程控电源”的最小原型。我在实际使用中做了不少扩展都还挺顺利的。一个比较实用的方向是加上I2C OLED屏幕和旋转编码器。屏幕实时显示设定电流和ADC采到的实际电流编码器旋转改变设定值。按下编码器切换步进精度比如0.1mA步进用于精细调节1mA步进用于快速扫描。这样一台“桌面版数控恒流源”就成型了。另一个方向是把DAC的12位分辨率换成更高位数。STM32F103内部DAC是12位在300mA档位下最小分辨率大约0.073mA。如果你需要更精细的微调可以外挂一颗16位I2C DAC比如MCP4725把采样电阻改成4.7Ω让电压范围和分辨率匹配更合理。软件上只需要把写入12位寄存器那段代码改成写16位DAC的I2C命令其他逻辑完全复用。还可以把功率回路的电压抬高。IRF640耐压200V所以理论上低压侧恒流部分可以承受几十伏的供电电压。如果你想做一个0~30V、0~300mA的高压小电流恒流源只需换一个合适的高压运放电源以及重新算采样电阻的功率整个电路拓扑不用变。我拿12V供电试过配合一个大一点的散热片做稳压管伏安特性扫描非常顺手。在做I-V扫描时恒流源只负责输出恒定电流同时用STM32的ADC采集负载两端电压把电流和电压两路数据通过串口发到上位机就能画出一条完整的正向伏安特性曲线。这个扩展项目在毕设里非常能打硬件部分只要增加一个电阻分压网络几乎不用改代码框架。我有一次用这个功能测了一颗LED从0到300mA的完整曲线发光二极管的结电阻变化一目了然拿给学生讲半导体物理比翻教科书直观太多了。这台恒流源做出来后我过去几个月的实验室生活轻松了不少。需要老化LED模组就设置成250mA扔在那跑一晚测试稳压二极管直接步进扫描电流记录电压给学生做实验也不用再担心他们误拧旋钮把电流调到最大烧掉被测器件。这个项目改造成熟以后稳定性比很多商用电源的电流源模式差不了太多关键是电路简单、故障好查、坏了随时能修。如果你也打算复制一台我的建议是从洞洞板版本起步遇到振荡先不要懷疑运放型号先看补偿电容和地线布局跑顺了再去打PCB把扩展接口留好。这套东西一旦稳定工作你会发现“恒流源”这三个字在实验室里的出场率远比你想象的高。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。