数控恒流源设计:从采样电阻到DAC校准的完整指南
简介这份资料围绕2005年全国电子设计大赛F题“数控直流电流源”系统整理了赛题任务、基本要求、发挥部分与评分标准并附有个人整理的详细设计说明及程序源码适合准备电子设计竞赛的学生、电子爱好者和电源设计初学者参考。文档以1个Word文件约238KB呈现结构紧凑涵盖从指标分解到方案实现的关键环节包括基于AT89S52单片机、AD7543数模转换器及运算放大器构成的压控恒流源电路以及电流采样、A/D转换与数字反馈实现闭环稳定的设计思路。已有325人浏览学习。对需要快速理解2005年F题考点、获取可借鉴的数控恒流源实现框架或参考竞赛报告撰写方式的读者来说这份资料能提供较完整的示例节省自行梳理赛题与设计方案的时间。1. 数控恒流源在电赛 F 题里的真实考点2005 年全国电子设计大赛 F 题数控恒流源表面上是让参赛者做一个“能用键盘设电流、用液晶屏看数值”的电源但真正拉开差距的是电流设定值和实测值在负载变化、温度上升之后还能不能保持稳定。评委把负载电阻换小、把电流调到接近量程边缘时很多用可调电阻手动调压的方案会暴露零点漂移和功率管发热引起的电流爬升。这道题的核心是把模拟恒流源的控制环与单片机的数字设定打通单片机输出数字量DAC 把它变成设定电压运放和功率级再把这个电压强制成采样电阻上的压降。理解了这条链路后续选型、程序标定和误差修正才有依据。本文给出一套从器件选型到校准技巧的完整做法适合准备电赛电源类题目、也在做可编程负载或电池充放电设备的工程师参考。2. 数控恒流源的硬件拓扑与关键器件选型2.1 压控恒流源的三种常见拓扑恒流源的本质是让输出电流只取决于一个控制电压而尽量不受负载阻抗影响。最常见的是用运放比较“设定电压”和“采样电阻反馈电压”放大器输出直接驱动功率管形成闭环。被控制的量是电流而不是电压所以反馈信号来自电流流过的采样电阻。第一种拓扑是低压侧采样MOSFET 源极串接采样电阻到地负载挂在电源和漏极之间。这种电路的反馈电压直接就是源极电压运放天然能处理缺点是负载不接地但电赛测试时负载本身就是浮空的所以完全够用。第二种是高压侧采样采样电阻放在电源正端需要差分放大器把压降送回来电路复杂度更高优点是负载可接地通常在车灯、传感器供电里才需要。第三种是 Howland 电流泵靠多电阻网络实现浮空负载电流小、精度高但输出电流受运放功耗限制安培级负载下基本不现实。数控恒流源在电赛 F 题这个场景下主流方案就是第一种拓扑。从方程看运放强制 $V_{sense} V_{set}$所以 $I_{out} V_{set} / R_s$。只要采样电阻 $R_s$ 稳定输出电流就只跟随 DAC 电压负载变化会被负反馈自动吞掉。2.2 DAC、运放、功率管与采样电阻选型先看 DAC。2005 年不少队伍还在用 DAC08328 位并行接口256 档对 2A 量程来说每档约 7.8mA做步进 10mA 勉强够用但做小电流精细调节就吃力。个人整理资料时更常用的是 TLC561510 位串行接口只占三根 IO配合 2.5V 基准电流档位细腻很多。如果希望做到每毫安一档建议直接上 12 位 MCP4921代价是程序里换算系数多一位硬件思路相同。运放选型要盯住输入失调电压。OP07 失调 60μV在最低 200mA 档位折算到电流误差约 8μA可以忽略LM358 失调电压典型值 2mV、最大值 7mV当设定电压只有 0.1V 时失调占比会到 2%~7%直接吃掉精度。因此电流源里的运放不能用“手头随便抓一颗”的思路至少要用 OP07 或 OP2188。功率管我一般选 IRLZ44N 或 IRF540。IRLZ44N 栅极阈值电压低5V 运放供电也能驱动IRF540 更常见但要给运放提供 12V 左右电源确保栅极电压能把 MOSFET 完全推进线性区。器件电流参数都远超实际需求真正要考虑的是散热。2A 电流、5Ω 负载在 12V 电源下MOSFET 要吃掉 2V 压降功耗只有 4W但负载短路或者接近 0Ω 时12V 几乎全部压在管子上功耗冲到 20W 以上必须配大散热片。2.3 精度预算采样电阻决定温漂天花板从 $I_{out}V_{set}/R_s$ 做误差合成相对误差大致等于 DAC 非线性误差、基准温漂、运放失调折算值和采样电阻误差的叠加。DAC 和基准一般能做到 0.1%~0.2%运放失调可以忽略剩下的采样电阻误差往往是最大的。普通贴片电阻温漂 100ppm/°C从冷机到带载半小时温度升高 50°C阻值变化 0.5%如果是 5A 电流就是 25mA 漂移。换成 25ppm/°C 的锰铜电阻同样温差下漂移只有 0.125%差异肉眼可见。采样电阻还要注意接线方式不能把铜箔走线算进采样路径里。1Ω 采样电阻如果 PCB 走线有 5mΩ对精度影响只有 0.5%但如果用细长飞线搭电路接触电阻随温度变化问题就复杂了。所以采样电阻两端要单独拉出开尔文连接线接到运放反相输入端和地避免输出大电流在采样走线上叠加压降。下表是一套经过实践验证的选型组合电流量程 0~2.4A器件型号/规格关键参数作用主控 MCUSTC89C52 / AT89S5228 引脚IO 足够读按键、驱动 DAC、显示DACTLC561510 位SPI参考 2.5V数字量转设定电压电压基准REF50252.5V温漂 3ppm/°C给 DAC 提供参考电压运放OP07失调电压 60μV比较设定电压与反馈电压功率管IRLZ44NVgs(th) 1~2V电流放大采样电阻1Ω5ppm/°C3W四脚连接电流转电压测试负载铝壳功率电阻 5Ω/50W可换 1Ω~10Ω模拟负载这套组合的核心思想是把“整数倍误差”控制在 DAC、基准和采样电阻三样东西上其他环节尽可能理想化。3. 电路搭建从 DAC 输出到功率级的计算3.1 TLC5615 与运放的实际连接方法TLC5615 的数据线只有三根SCLK、DIN、CS。把单片机 P1.1、P1.2、P1.3 分别接过去CS 当普通 IO 手动控制。基准电压从 REF5025 输出接到 TLC5615 的 Vref 引脚Vref 输入阻抗较高但 REF5025 输出能力只有 10mA不要再同时带动其他电路。DAC 的 Vout 引脚到 OP07 同相输入端之间可以串一个 100Ω 电阻配合运放输入端对地电容滤掉 DAC 输出切换瞬间的毛刺。OP07 反相输入接采样电阻高压端同相输入接 DAC 电压输出经过一个 10~100Ω 的隔离电阻接到 MOSFET 栅极。MOSFET 源极到地之间就是采样电阻。负载接在电源正极和 MOSFET 漏极之间也就是所谓的高端负载、低压侧采样。有几个容易踩的坑。第一OP07 的电源负端不能接地就算完事因为当设定电压接近 0V 时运放输出需要轨到负电源附近才能让 MOSFET 关断所以最好用 ±5V 双电源负压可以用 ICL7660 或 MC34063 反压产生。第二MOSFET 栅源之间并联一只 10kΩ 电阻给栅极电荷提供泄放路径否则关机后可能关不死。第三采样电阻的地要单独呈星形回到电源地不要和继电器、数码管的回流地串在一起。3.2 采样电阻与功率管耐压的计算脚本恒流源设计里最常见的翻车点不是控制环路而是电源电压选得太靠近负载压降。当负载电阻变大、负载电压升高到接近电源电压时MOSFET 进入线性区恒流能力立刻失效。设计时用一段脚本把电压和功耗算清楚比焊完板子再改电源靠谱得多。def calc_power(supply_v, load_res, iout): vload iout * load_res vds supply_v - vload p_mos vds * iout p_rs iout * iout * 1.0 return vload, vds, p_mos, p_rs for load in [1, 2, 5, 10]: v_load, vds, p_mos, p_rs calc_power(12.0, load, 1.5) print(f负载{load:2d}Ω: 负载电压{v_load:4.1f}V, f管压降{vds:4.1f}V, MOS功耗{p_mos:5.1f}W, f采样电阻功耗{p_rs:4.1f}W)这段代码按 12V 电源、1.5A 电流计算不同负载的功率分布。结果里最值得关注的是 1Ω 负载时 MOS 管压降 10.5V功耗 15.75W而 10Ω 负载时负载电压已经 15V超过了电源电压恒流源在这个状态下根本无法工作。所以硬件定型前要先用类似脚本确定“最大负载电阻、电源电压、最大电流”三者之间的关系留出至少 2V 的管压降裕量。参数上看12V 电源在 5Ω 负载和 1.5A 电流下负载电压 7.5V管压降 4.5VMOS 功耗 6.75W还可以接受。如果负载偶尔开路或者短路电流环会把 MOSFET 完全打开或关死短路状态下 12V 电压全部加在采样电阻和导线电阻上电流不会超过 Vset/Rs所以短路反而是安全状态。设计时真正要防的是过压和反向浪涌在电源入口加一个极性电容和稳压二极管就能覆盖。3.3 量程分段与切换电阻单只采样电阻很难同时满足大电流和微小步进。1Ω 电阻下10 位 DAC 配合 2.5V 基准理论最小步进是 2.44mA这对 2.4A 量程是合理的但对 100mA 量程来说粗得没法看。常见做法是用继电器切换采样电阻低档用 10Ω、高档用 1Ω。量程采样电阻DAC 基准最大电流理论最小步进低档10Ω 0.5W2.5V250mA0.244mA高档1Ω 3W2.5V2.5A2.44mA切换电路用一个三极管驱动继电器单片机 IO 输出高电平导通继电器线圈触点切换采样电阻。切换动作必须发生在输出电流设为 0 之后并且软件里要留 50ms 以上延时等触点稳定再建立新电流。两个量程的换算系数不同程序里用同一个设定毫安数值根据量程标志选择不同的采样电阻参与计算即可。切换后示波器观察输出电流波形如果出现尖峰说明换挡时电流环没有先断开或者采样电阻触点之间产生了瞬间开路。4. 程序实现单片机控制数控恒流源的完整代码4.1 电流毫安值与 DAC 码的整数换算程序里不能直接用浮点乘法去算 DAC 码51 单片机用浮点库既慢又占 ROM。常见做法是“先乘后除”用 unsigned long 保存中间结果最后截断成 10 位 DAC 值。设定电流 I_mA、采样电阻 Rs 和基准电压 Vref 的关系式是DAC_code I_mA * Rs * 1024 / Vref注意单位统一。I_mA 单位毫安Rs 单位毫欧Vref 单位毫伏这样计算全程都不出现小数。下面的函数把毫安值转换成 DAC 代码。#define VREF_MV 2500 // REF5025 实际输出 2.500V #define RS_MOHM 1000 // 采样电阻 1.000Ω unsigned int dac_code_from_ma(unsigned int current_ma) { unsigned long tmp; tmp (unsigned long)current_ma * RS_MOHM * 1024; tmp tmp / VREF_MV; if (tmp 1023) tmp 1023; return (unsigned int)tmp; }这个函数的关键在乘法顺序。current_ma 最大 2500乘以 RS_MOHM 1000 得 250 万再乘 1024 得 25.6 亿已经超过 unsigned int 的范围所以必须先把 current_ma 强转成 unsigned long否则结果溢出后只会得到一堆乱码。除完后钳位到 1023防止程序里误传超出量程的电流值。函数返回后直接把结果送进 DAC 写时序函数即可。换算公式的反向版本用于显示屏把 DAC code 换算回电流毫安值公式是 I_mA DAC_code * VREF_MV / (RS_MOHM * 1024)同样全程整数运算。两个函数放在同一个文件里随着校准系数一起更新避免显示和实际输出不一致。4.2 TLC5615 写时序和按键设定程序TLC5615 的串行帧是 16 位其中高 4 位是填充位低 12 位里只有高 10 位会被 DAC 锁存最低 2 位必须写 0。所以实际发送时要把 10 位数据左移 2 位组成 16 位帧再从最高位开始依次送出。代码里用循环逐位判断这是最基础也最稳的写法。#include REG52.H sbit DAC_SCLK P1^1; sbit DAC_DIN P1^2; sbit DAC_CS P1^3; sbit KEY_UP P3^0; sbit KEY_DOWN P3^1; unsigned int target_ma 0; void delay_ms(unsigned int ms) { unsigned int i, j; for (i 0; i ms; i) for (j 0; j 120; j); } void dac5615_write(unsigned int value) { unsigned char i; unsigned int frame; frame (value 0x03FF) 2; DAC_CS 0; for (i 0; i 16; i) { DAC_SCLK 0; if (frame 0x8000) DAC_DIN 1; else DAC_DIN 0; DAC_SCLK 1; frame 1; } DAC_CS 1; } void set_current(unsigned int ma) { if (ma 2400) ma 2400; dac5615_write(dac_code_from_ma(ma)); } void main(void) { while (1) { if (KEY_UP 0) { delay_ms(10); if (KEY_UP 0) { target_ma 10; if (target_ma 2400) target_ma 2400; set_current(target_ma); while (KEY_UP 0); } } if (KEY_DOWN 0) { delay_ms(10); if (KEY_DOWN 0) { if (target_ma 10) target_ma - 10; else target_ma 0; set_current(target_ma); while (KEY_DOWN 0); } } } }代码逻辑分成三层dac5615_write 只负责把 10 位数据发进去set_current 负责上限钳位和毫安到码的换算main 里负责按键消抖和步进调整。这样改量程时只需要改 set_current 里的换算函数按键逻辑完全不用动。TLC5615 的 SCLK 在空闲时保持低电平CS 下降沿开始传输、上升沿锁存以上代码对应默认时序。如果换用其他 SPI DAC只需要改循环位数和帧格式。4.3 程序里的闭环软化处理硬件反馈环是模拟的单片机不需要参与 PID但程序会影响启动瞬间的电流建立速度。如果上电直接把目标电流写进 DAC大电流档位会看到明显的电流过冲因为负载电容和采样电容在阶跃响应下会把 MOSFET 栅极电压推得过高。常见做法是“斜坡逼近”把设定电流从 0 开始每 5ms 增加一个小台阶直到目标值。这种做法的另一个好处是能配合继电器切换量程。换挡时先把电流斜坡降到 0切换采样电阻再重新斜坡到目标值整个过程不会产生机械触点拉弧。实现上就是在 set_current 外面包一层 ramp_to_ma 函数用 for 循环按步进递增每步调用一次 DAC 写函数并延时。提示斜坡时间不能太长。对 2.4A 量程从 0 升到 2.4A 建议控制在 200ms 内否则评委按一次按键要等很久才能看到电流稳定体验很差。5. 调试验证与精度校验让数控恒流源极快收敛的技巧5.1 用采样电阻电压判定电流调板子时不要把电流表串进负载回路电赛万用表电流档内阻虽小但大电流下仍会带来几十毫伏压降改变负载电压进而影响 MOS 管压降。更可靠的做法是把万用表打到电压档直接测采样电阻两端电压。采样电阻是 1Ω 时电压读数乘以 1000 就是电流毫安值如果是 10Ω 档读数除以 10 得到安培。这种方法不改变电路拓扑测试引线又短比电流表更接近真实工作状态。5.2 先看波形再改程序电流缓慢上漂多数不是程序问题。让恒流源带 2A 负载运行 20 分钟观察采样电阻电压如果读数持续上升用红外测温枪测采样电阻和 MOSFET 散热片温度升高导致采样电阻阻值变大或 MOS 管 Vgs(th) 变化都会造成这种现象。如果波形上叠加高频振铃则要在运放输出到栅极之间串 100Ω 电阻并在栅源之间并 10nF 电容这是补偿相位裕度最直接的办法不要一上来就调程序里的斜坡参数。5.3 两段校准法换板子后Vref 实际值不是整 2.500V采样电阻也有偏差理论换算出来的 DAC 码和实测电流会有 1%~2% 的固定误差。校准只需要两个点设电流 100mA等稳定后从万用表读实际电压算成电流记录目标值对应的实际值再设 2000mA重复同样操作。程序里把这两组值写成线性修正表使用时按比例插值替换掉理论计算的 DAC 码。校准数据建议保存到 EEPROM换量程时分别维护两组系数。以后每次开机先读 EEPROM再进入正常显示这样同一套硬件可以随时换采样电阻档位而不需要重新编译程序。本文还有配套的精品资源点击获取