简介围绕程控电流放大器展开的设计文档面向电子类竞赛选手、课程设计学生与模拟电路爱好者重点解决可控增益放大、自动增益控制与输出电压有效值实时显示等问题。内容以AD603宽带运放两级级联作为前级配合AGC反馈与ADUC812单片机完成增益预置、数据运算和数码管显示后级采用分立元件推挽互补输出并结合LM317T可调稳压电源方案给出方案论证、原理框图和关键电路分析。文档还涉及峰值检波反馈、线性补偿与直流稳压电源等环节便于理解整机信号链的衔接关系。压缩包仅含1个doc文件约246KB篇幅集中、便于打印批注适合作为课设或赛题报告的参考底稿。已有406人学习读者可从中获取三种可控增益方案的取舍依据、AD603增益公式与级联调试思路、后级输出级设计要点以及整机联调时的常见问题排查方向。1. 程控电流放大器数字指令和安培之间那段模拟电路程控电流放大器要干的事很朴素让输出电流严格正比于一条数字指令并且在负载电压、环境温度、时间漂移面前都守住这个比例。前阵子帮人看一块 200 mA 量程的板子原理图翻不出毛病实物却在某几个码点附近来回跳换运放、换 DAC、加滤波全无效最后发现采样电阻的地和功率地共用了一段走线。这类问题的共同点是程控电流放大器的精度上限很少由 DAC 位数决定而由采样方式、顺从电压余量和环路稳定性这三件事决定。它适合谁做激光二极管和 LED 驱动、传感器恒流激励、线圈与电磁铁驱动、半导体参数扫描的人尤其是需要软件设定值、需要按曲线扫电流的场合。2. 拓扑选型从负载倒推串联调整式还是 Howland 电流泵选拓扑之前先把负载画清楚它是一头接地还是两头都悬空是纯阻性还是带感性两端电压会不会跟着电流一起变。这三个问题答完可选拓扑基本只剩一两个。反过来先挑电路再找负载后面九成要在顺从电压和共模抑制上返工。2.1 五个必须先钉死的规格参数很多人一上来就开原理图量程、分辨率都还是拍的。我的习惯是先填一张表填不满就先别画图。表里每一行都会直接决定下游器件选型改一行往往要重画半张图。规格示例值为什么最先定直接影响满量程电流 I_FS200 mA决定采样电阻与调整管功耗采样电阻阻值、封装、散热顺从电压 V_C12 V负载两端可能出现的最大压降电源轨电压、调整管耐压负载性质0–50 Ω 阻性可带 1 mH 感性决定环路补偿和关断保护补偿网络、续流路径分辨率16 位标称目标 1 μA 可用决定 DAC 位数与噪声预算DAC 选型、滤波带宽建立时间100 μs 到 0.1%决定环路带宽与补偿强度补偿电容、运放 GBW顺从电压这一行最容易被低估。恒流源的电源轨必须满足 V_rail ≥ V_load,max V_sense V_headroom其中 V_headroom 是调整管维持恒流所需的最小压差加上运放输出摆幅余量实际取 1.2–2 V 比较稳妥。轨压定高了满载时多余的压降全落在调整管上变成热定低了负载稍重电流就掉下来而且这种掉落是渐变的不看波形很难发现。2.2 串联调整式恒流源环路里到底有哪几块最常见的结构是低边串联调整负载上端接正电源下端接 N 沟道 MOSFET 漏极源极经采样电阻到地运放同相端接设定电压、反相端接采样电压、输出驱动栅极。环路闭合后运放强行让 V_sense V_set于是 I_out V_set / R_sense与负载电压无关——前提是调整管始终工作在饱和区。这个环路里有三块增益要算清楚。第一块是运放的开环增益直流通常在 100 dB 以上第二块是调整管的跨导 gm它把栅压变化换成电流变化第三块是采样电阻把电流换回电压。三者相乘就是直流环路增益200 mA 量程下这个数经常在 10⁵ 量级意味着只要有一点相位滞后就会振。后面第 4 章会专门算它。低边结构的问题很直接负载不接地。如果负载必须接地比如某些传感器外壳就是地就得改成高边采样。2.3 高边采样配合差分放大器共模抑制比怎么算高边采样的思路是把采样电阻放到正电源和负载之间用差分放大器或集成电流检测放大器把电阻两端的小压差取出来再送进运放的反相端。负载可以接地代价是多了一级共模抑制的要求。麻烦在于共模电压是变的负载从 0 Ω 扫到 50 Ω采样电阻上端的共模电压就在 1 V 到 11 V 之间摆。差分放大器的共模抑制比不够这个摆动就会漏进差分输出被误认为电流误差。而且这种误差随负载变化两点校准根本校不掉——它不是一个恒定增益误差。import math # 高边采样由负载摆幅反推差分放大器需要多高的共模抑制比 V_CM_SWING 12.0 # 采样电阻上端共模电压的摆幅 (V) R_SENSE 5.0 # 采样电阻 (Ω) I_LSB 3.05e-6 # 1 LSB 对应的电流 (A)200 mA / 65535 ERR_BUDGET 0.5 # 允许共模误差占几个 LSB err_i ERR_BUDGET * I_LSB # 允许的等效电流误差 err_v err_i * R_SENSE # 折算到差分输入端的电压误差 cmrr_db 20 * math.log10(V_CM_SWING / err_v) print(f允许输入误差 {err_v*1e6:.2f} μV) print(f需要 CMRR ≥ {cmrr_db:.1f} dB)这段代码把“精度要求”翻译成“器件指标”。算出来的结论通常让人不太舒服想在 200 mA、16 位量程上把共模误差压到半个 LSB需要 120 dB 以上的共模抑制。普通四电阻差分电路靠 0.1% 薄膜电阻只能做到 60–70 dB必须用激光修调的集成电流检测放大器或者干脆把采样电阻挪回低边。这也是为什么大量实际设计宁可让负载浮地也不愿意做高边。2.4 改进型 Howland 电流泵靠电阻匹配撑输出阻抗Howland 电流泵用一颗运放同时接正反馈和负反馈输出电流由输入电压和采样电阻决定负载接在输出和地之间。它最大的好处是能双向出电流——既拉也灌适合驱动接地的感性负载或需要过零的扫描场合。它的软肋是输出阻抗完全依赖电阻匹配。四条电阻臂的相对失配 δ 会直接把理想电流源拉成带内阻的实际源输出阻抗大致按 R/(4δ) 的量级下降。10 kΩ 臂长、0.1% 失配输出阻抗只有几百 kΩ 量级负载 1 kΩ 时误差就是千分之几。想靠它做到 16 位精度电阻得用 0.01% 的配对网络成本立刻上去。拓扑电流能力负载可接地精度主要受限因素适用场合低边串联调整大几十 mA 到数 A否采样电阻与运放失调大电流、负载可浮地高边采样串联调整大是差分放大器 CMRR负载必须接地、大电流改进型 Howland小几十 mA 以内是电阻匹配、运放输出能力双向扫描、小电流精密集成 V-I 转换中小视型号芯片内部匹配空间紧张、量不大我个人做大电流一律走低边串联调整只有在负载接地这条硬约束下才考虑高边Howland 留给几十毫安以内、需要双向的场合。3. 从 DAC 码到安培增益链、分辨率与噪声的三笔账选完拓扑接下来是把“多少个码对应多少安培”这条链路算平。这三笔账分别是采样电阻的取舍、噪声折算、以及校准能补回多少误差。三笔账算完你才知道自己标的 16 位到底是真 16 位还是名义 16 位。3.1 采样电阻取值用顺从电压换分辨率采样电阻决定满量程时电阻上的压降 V_sense。V_sense 取大同样的电流换成更大的电压失调和噪声的相对影响就小但 V_sense 每增加 1 V电源轨就得抬高 1 V调整管多烧 I×1 V 的热。这是一个纯粹的交换。# 采样电阻、顺从电压与分辨率的第一轮核算 I_FS 0.200 # 满量程电流 (A) V_SENSE 1.000 # 满量程时采样电阻上的压降 (V) V_LOAD 10.0 # 最坏情况下负载压降 (V) V_HEAD 1.5 # 调整管压差 运放输出裕量 走线压降 (V) N_BITS 16 R_SENSE V_SENSE / I_FS P_SENSE I_FS ** 2 * R_SENSE V_RAIL V_LOAD V_SENSE V_HEAD LSB I_FS / (2 ** N_BITS - 1) print(f采样电阻 {R_SENSE:.3f} Ω满载功耗 {P_SENSE*1e3:.0f} mW) print(f电源轨至少 {V_RAIL:.2f} V) print(f1 LSB {LSB*1e6:.3f} μA) print(f调整管最坏功耗 {(V_RAIL-V_LOAD-V_SENSE)*I_FS:.2f} W)参数按顺序改V_SENSE 是可调变量通常在 0.1–2 V 之间选。压到 0.1 V采样电阻只有 0.5 Ω运放 25 μV 的失调就折算成 50 μA 的电流误差16 位里的一半码全废了取到 2 V电源轨要多 1 V调整管多烧 0.2 W但失调折算只剩 12.5 μA。我一般落在 0.5–1.5 V 之间。采样电阻的功耗要留三倍以上余量而且必须用低温度系数的型号。200 mW 落在 1206 封装上自热几十度100 ppm/°C 的电阻在这个温差下就是 0.3% 的增益漂移直接把 16 位打成 8 位。3.2 噪声折算到输出电流为什么 16 位常常只剩 12 位有效先算全量程的信噪比结果通常很漂亮再算低码段就会发现问题。所有噪声源折算到输出端都是固定的绝对值不随设定电流缩小所以设定越小信噪比越差。噪声源电压噪声密度10 kHz 带宽内 rms折算到输出电流运放输入电压噪声5 nV/√Hz0.5 μV0.10 μA采样电阻热噪声0.29 nV/√Hz0.03 μV0.006 μADAC 输出噪声20 nV/√Hz2.0 μV0.40 μA基准源折算噪声—1.0 μV0.20 μA合计RSS——0.46 μA按这个预算满量程 200 mA 处的信噪比约 113 dB折合 18 位以上但设定在满量程 1%2 mA处信噪比掉到 73 dB有效位数只剩 11.9 位。也就是说这颗 16 位 DAC 的低端 4 位在噪声里游泳写进去和没写进去差不多。这就是为什么宽动态范围的程控电流放大器几乎都做量程切换把 200 mA 拆成 200 mA / 20 mA / 2 mA 三档通过继电器或低电荷注入的模拟开关切换采样电阻每档都用接近满量程的 V_sense 工作噪声折算到该档的满量程始终是同一个相对值。代价是每档都要单独校准而且切换瞬间的电荷注入要考虑。注意噪声带宽不等于信号带宽。在运放输出和 DAC 输出后各加一级 RC截止频率取目标带宽的 1.5–2 倍能按平方根关系压掉带外噪声。但 RC 会引入相位滞后要和第 4 章的环路补偿一起考虑。3.3 两点校准与分段校准的固件实现误差分成两类增益误差和零点误差。采样电阻容差、基准容差、DAC 增益误差表现为斜率偏差运放失调、DAC 零点误差表现为截距偏差。两点校准能同时消掉这两项但消不掉非线性。产线校准的做法是在 10% 和 90% 码点各测一次实际电流解出斜率与截距写进存储区。固件在每次设定时先按理想公式算出目标电流再反解出应该写进 DAC 的码。/* 两点校准后的码值修正先映射到理想电流再用实测系数反解 */ typedef struct { float gain; /* 实测斜率 / 理想斜率典型 0.998~1.002 */ float offset; /* 零码残差单位 A */ float full_scale_i; /* 本量程满量程电流单位 A */ } cal_t; static int32_t apply_cal(int32_t code, const cal_t *c, uint32_t code_max) { /* 1. 输入码换算成理想电流 */ float i_ideal (float)code / (float)code_max * c-full_scale_i; /* 2. 去掉零点、修正增益得到真实需要的设定电流 */ float i_real (i_ideal - c-offset) / c-gain; /* 3. 换回码值并做上下限钳位防止越界写入 */ int32_t out (int32_t)(i_real / c-full_scale_i * (float)code_max 0.5f); if (out 0) out 0; if (out (int32_t)code_max) out (int32_t)code_max; return out; }三个参数各有来源gain 由两次测量算出offset 由零码附近的小电流点测出full_scale_i 是这一档的设计值。钳位这一步不能省——如果 gain 略大于 1满量程附近反解出的码会超过 code_max写进 DAC 后溢出成小电流负载端会出现莫名其妙的电流塌陷。线性度更差的设计要做分段校准把量程切成 8 或 16 段每段存一组斜率和截距固件按段查表。代价是存储和产线工时上涨一般只有在 INL 实测超过 2 LSB 时才值得上。import numpy as np # 多点最小二乘拟合用来评估一段量程内的非线性 code np.array([6554, 19661, 32768, 45875, 58982], dtypefloat) meas np.array([0.019985, 0.060012, 0.100041, 0.140005, 0.179972]) # A A np.vstack([code, np.ones_like(code)]).T k, b np.linalg.lstsq(A, meas, rcondNone)[0] resid meas - (k * code b) print(f斜率 {k*1e6:.4f} μA/code截距 {b*1e6:.3f} μA) print(f最大残差 {np.abs(resid).max()*1e6:.2f} μA f({np.abs(resid).max()/3.05e-6:.2f} LSB))残差就是这一段校准消不掉的非线性。如果残差已经接近 1 LSB再提高 DAC 位数没有意义该去查采样电阻的自热和运放的共模失真。4. 环路补偿为什么一接上 MOSFET 就开始振恒流源环路和普通电压放大器最大的区别是环路里那颗调整管的跨导不是常数它跟着设定电流一起变。这意味着你在满量程调好的补偿到小电流段可能完全不是同一回事。4.1 环路增益随设定电流变化的三个极点环路里有三个主要极点。第一个是运放自身的开环主极点一般在几十赫兹第二个是运放输出电阻与调整管栅极电容形成的极点栅极电容从几百 pF 到几 nF配合几十欧的输出电阻落在几百 kHz 到几 MHz第三个是漏极节点上负载电阻与调整管输出电容、线缆电容形成的极点。把这三块乘起来看直流环路增益T_dc A_ol × gm × R_sense。A_ol 是运放开环增益R_sense 是采样本文还有配套的精品资源点击获取