ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用ADuC845 DAC打造高精度可编程恒流源:从电路到校准全解析

用ADuC845 DAC打造高精度可编程恒流源:从电路到校准全解析 上个月调试一块温度采集板的恒流源手头正好有ADuC845干脆就用它片上自带的12位DAC来做可调恒流前前后后折腾了三天踩了不少坑但也拿到了比较满意的实测数据。今天不聊芯片手册上已有的东西就把这套从电路搭接到软件配置、再到实测校准的完整过程拆开讲清楚文末还附了一组从0mA到250mA的实测记录给你一个可以直接参考的模板。ADuC845是ADI出的一颗8051内核单片机片上集成了24位Σ-Δ ADC、双12位DAC还带内部基准源。很多人拿它只当高精度ADC用其实它的DAC配合简单的外围电路做精密恒流源非常顺手。适合的场景包括传感器激励电流、LED驱动、电池充电测试、以及需要可编程电流输出的仪表电路。只要你对电流精度有“百分之一到千分之几”这种量级的要求这套方案都能满足。先给你吃颗定心丸最终实测下来DAC码值从0到4095对应输出电流0到250mA线性度可以做到±0.3%以内经过两点校准后误差能压到±0.1%左右。这个过程不需要额外买昂贵的可编程电阻或精密恒流源芯片一颗运放、一颗三极管、一颗精密采样电阻就搞定了。1. 方案拆解为什么用DAC做恒流而不是PWM1.1 ADuC845的DAC到底强在哪ADuC845的DAC不是普通的PWM模拟输出它是真正的12位电压输出型DAC内部自带输出缓冲放大器。你只要往寄存器里写一个数字码值它就输出对应的直流电压不存在PWM必须要滤波的纹波问题。这一点对恒流源来说非常关键因为恒流源最怕的就是电流纹波。这颗DAC有两个独立通道DAC0和DAC1每个通道都是12位分辨率。你可能会说12位看起来平平无奇但关键是它和芯片内部的2.5V基准源是配套的。如果基准源不稳定DAC输出再准也白搭。ADuC845的内部基准经过出厂校准温漂大约在几十ppm/°C量级配合外部精密基准可以做更高精度的应用。我这次采用内部2.5V基准DAC输出范围设为0到2.5V。12位分辨率对应的最小电压步进是[ V_{LSB} \frac{2.5V}{4096} \approx 0.61mV ]如果采样电阻取10Ω对应的电流步进就是0.061mA也就是61µA。这个分辨率对大多数传感器激励和中小功率恒流场景完全够用了。如果你需要更小的电流步进可以把采样电阻加大或者把DAC量程换到更小的档位。1.2 为什么不用PWMRC滤波的方案有朋友可能会问STM32用PWM加RC滤波也能做DAC成本还低为什么非要选ADuC845这种自带DAC的我去年做过一版PWM恒流方案PWM频率用的25kHz后端两级RC滤波。实际调试中遇到两个非常头疼的问题一是滤波后的纹波始终压不到1mV以下电流纹波跟着变大二是PWM的占空比分辨率和DAC是两回事PWM一般只能做到8到16位占空比但实际受时钟影响线性度很难保证。如果拿PWM方案做非恒流、纯调压的场合比如风扇调速、LED亮度调节问题不大。但恒流源这东西对电流稳定性的要求很苛刻PWM的开关噪声很容易通过反馈链路耦合到输出所以我还是推荐用真正的DAC。这也算是“一体机”方案省心的地方。另外ADuC845片上还有24位ADC可以把采样电阻两端的电压直接读回来做闭环校正。这个组合是很多纯DAC芯片给不了的等于“模出模入”都集成在同一颗芯片里软件调试和后续校准非常方便。1.3 恒流拓扑选型线性稳压式V-I转换DAC输出的是电压要变成恒流核心是做一个V-I转换电路。最常用也最好调的是“运放三极管”线性恒流源DAC输出电压送到运放同相输入端运放反相输入端接采样电阻的上端运放输出驱动三极管基极负载和采样电阻串在主回路里运放强制“虚短”让采样电阻上端电压等于DAC输出电压。这是一个很经典的负反馈结构。DAC设定一个电压运放就会自动调节三极管的导通程度让采样电阻上的压降等于DAC输出电压。采样电阻确定了流过它的电流也就确定了这个电流就是负载电流。负载电阻变多少运放都会去“纠正”三极管的管压降保证电流不变。我用生活化的方式理解DAC电压是“水龙头开度目标值”运放是“自动调节阀门的人”采样电阻是“流量计”三者配合最终让流过负载的水流电流恒定。这个结构简单、成本低、线性度好非常适合调试。缺点是三极管上有一定功耗不适合大电流场合。如果电流要上到1A以上把NPN换成MOS管再把三极管的功耗散热处理好拓扑仍然成立。2. 硬件搭接与关键参数计算2.1 最小电路ADuC845 运放 三极管 采样电阻完整的最小电路大概是这样DAC0输出引脚接到运放的同相输入端运放反相输入端接NPN三极管发射极和采样电阻Rsense上端运放输出通过一个1kΩ电阻接三极管基极三极管集电极接负载一端负载另一端接正电源采样电阻下端接系统地负载电流就是流过三极管集电极和发射极的电流等于采样电阻上的电流。我在调试中用的运放是LM358注意这里有个大坑后面会专门说。三极管用的是D882中等功率NPN最大Ic能达到3A左右在250mA以下很安全。采样电阻用10Ω/0.1%的精密电阻功率选1W实际最大功耗只有0.625W留了余量。需要注意的是运放供电和ADuC845模拟供电最好独立至少要在电源入口处做好去耦。我刚开始就是因为运放和单片机共用一组12V转5V的电源轨导致DAC输出上有一大堆开关噪声后来在运放电源脚就近加了10µF钽电容和0.1µF瓷片电容噪声才降下来。2.2 采样电阻和功耗的计算逻辑采样电阻的选择决定了整个电路的电流范围、分辨率、温漂表现。计算公式很简单[ I_{load} \frac{V_{DAC}}{R_{sense}} ]最大输出电流出现在DAC满量程时。如果你选用内部2.5V基准且DAC输出范围是0~2.5V那么[ I_{max} \frac{2.5V}{10Ω} 250mA ]采样电阻的功耗为[ P_{R} I_{max}^2 \times R_{sense} 0.25^2 \times 10 0.625W ]所以不能用普通的0603贴片电阻至少要选2512封装或者直插式精密电阻。我用的1W直插精密电阻虽然体积大但散热好温漂小。除了采样电阻本身的阻值还要考虑采样电阻的引线电阻。调试时我一开始把万用表直接夹在采样电阻引脚两端测电压结果读数和DAC设定的电压对不上差了几十毫伏。后来用“四线开尔文接法”在采样电阻两端单独走两根细线到运放反相输入端才算排除掉走线电阻的干扰。2.3 PCB布局上容易被忽视的3个要点做恒流电路布局比原理图更重要尤其是DAC输出的模拟信号和采样电阻的反馈回路。我把这次调试中真正起作用的布局要点整理一下第一DAC输出引脚到运放同相输入端的走线要短且尽量远离数字信号线。ADuC845的数字部分有8051内核和通信外设如果走线太近数字翻转噪声会耦合进模拟通道。最好在DAC引脚旁边加一个RC低通滤波器我用了100Ω1nF截止频率约1.6MHz对低频恒流信号毫无影响但能滤掉很多高频毛刺。第二采样电阻的反馈走线要“一点接地”。运放反相输入端到采样电阻上端的线不要和其他大电流走线共用一段铜皮。如果共用铜皮的寄生电阻会串进反馈回路导致电流误差。采样电阻的下端单独回到模拟地不要和数字地、电源地在采样电阻附近汇合。第三运放电源和DAC基准电压的去耦电容要就近放置。电源去耦电容离运放电源脚越近越好基准引脚的电容要选低ESR的我通常并一个10µF的钽电容和一个0.1µF的陶瓷电容。很多所谓“DAC输出跳动”的问题其实就是基准引脚去耦不到位。3. 寄存器配置与软件实现3.1 DACCON控制和DAC0L/DAC0H数据寄存器ADuC845的DAC配置很直接。先看控制寄存器DACCON它负责DAC的时钟分频、输出范围选择以及掉电控制。我这次配置的思路是选择内部2.5V基准设置DAC输出范围为0到VREF使能DAC输出缓冲设置一个合适的DAC时钟分频保证输出稳定。具体位定义不同批次可能略有差异一定要以数据手册的寄存器表为准。工程中我建议先读一遍DACCON的默认值再按位或、按位清的方式修改不要直接整个寄存器赋值避免误动其他功能位。12位数据存入两个寄存器DAC0H是高字节高4位有效DAC0L是低8位。写入时拆开void DAC0_Write(unsigned int code_12bit) { DAC0H (code_12bit 4) 0x0F; DAC0L code_12bit 0xFF; }有些从STM32转过来的朋友可能会把code左移4位再拆那样就全错了。ADuC845的12位码值在寄存器里是“左对齐”还是“右对齐”要参考手册。我上面这种方式是按右对齐处理的实测OK。每次写入后可以等一下让DAC输出稳定再读ADC通常延时100µs就够了。3.2 从目标电流反推DAC码值反向计算非常重要。假设我现在要输出100mA采样电阻Rsense10ΩDAC基准VREF2.5V那么[ V_{DAC} I \times R_{sense} 0.1 \times 10 1.0V ][ CODE \frac{V_{DAC}}{V_{REF}} \times 4096 \frac{1.0}{2.5} \times 4096 1638.4 ]取整后写入1638。如果采样电阻精度是0.1%那理论误差就是0.1%左右。如果发现实测电流偏差较大第一反应不是去改软件而是用万用表量一下采样电阻的实际阻值。我用的是10.02Ω的电阻比标称多了0.2%也不要紧在软件里按实际阻值算固定系数即可。我把这个过程封装成函数直接传目标电流值void set_current_ma(unsigned int current_ma) { float v_dac ((float)current_ma / 1000.0f) * R_SENSE; unsigned int code (unsigned int)(v_dac / V_REF * 4096.0f); DAC0_Write(code); }如果单片机没有硬件浮点单元这种计算放在初始化阶段还好但如果要在控制环里高频调用建议直接改成查表或定点运算。我这次只在手动设置时调用频率低浮点完全没问题。3.3 用串口调试助手验证DAC输出光写好寄存器还不放心我习惯先用串口打印DAC码值和预期电压再拿万用表实测确认软件这条路通没通。ADuC845的UART在调试中起了大作用。我每设置一个电流就通过串口打印一行printf(SET: code%d, v_dac%.3fV, target%.1fmA\r\n, code, v_dac, current_ma);电脑上用串口调试助手波特率9600直接观察输出。如果你看到的数值和设定值对得上说明MCU侧没问题问题就出在模拟电路侧。这一步能把问题边界切得很干净。调试助手的选择没有太多讲究SSCOM或者普通的串口工具都行关键是别开奇偶校验。我有一回就是串口助手端选了偶校验结果收到的全是乱码折腾了半天才发现是上位机配置问题不是单片机的问题。4. 实测数据与线性度分析4.1 一组完整的实测记录这是我在室温约25°C、采样电阻实际阻值10.02Ω、外部供电12V条件下测得的一组数据。DAC电压是用万用表在运放同相输入端测的电流是串联在负载回路里的万用表电流档测的。DAC码值理论DAC电压(mV)实测DAC电压(mV)实测电流(mA)理论电流(mA)误差000.60.060—410250.0249.224.925.0-0.4%819500.0500.550.050.00.0%1229750.0751.875.175.00.1%16381000.0998.499.8100.0-0.2%20481250.01252.1125.1125.00.1%24581500.01496.0149.5150.0-0.3%28671750.01753.2175.2175.00.1%32772000.01996.5199.5200.0-0.2%36862250.02254.0225.3225.00.1%40952500.02498.8249.8250.0-0.1%从数据看全量程范围内最大误差约0.4%大部分点都在±0.3%以内。这里要说明一下万用表本身的电流档位精度大约在0.5%左右所以这个“实测误差”包含了一部分仪表误差。如果对精度要求更苛刻需要用更高精度的电流表或者六位半万用表来标定。4.2 误差来源分析怎样进一步压缩误差把上面数据拆开看误差主要来自三个方面第一是采样电阻精度。10.02Ω实测值与标称值10Ω差0.2%这会直接造成系统误差。解决办法是在软件里把R_SENSE常量改成10.02或者干脆用软件标定重新计算系数。第二是DAC本身的增益和失调误差。12位DAC的积分非线性INL典型值在±1LSB左右但失调电压可能让零点附近出现几十mV的偏移。从表格可以看到DAC码值为0时输出还有0.6mV对应0.06mA的实际电流这就是DAC的失调电压。要消除它可以在软件里做零点校准先让DAC输出0测量实际电流然后在后续的码值计算中减去这个偏移。第三是运放的输入失调电压。LM358的输入失调电压最大能到7mV这在满量程2.5V面前虽然占比不大但在低电流档位会影响精度。如果想把误差压到0.1%以内建议换一颗低失调运放比如OP07或者更适用于单电源低功耗场景的轨到轨运放比如MCP6002、OPA340。运放失调这个问题越到小电流越明显所以如果你主要工作在10mA以下换运放的收益会非常大。校准方法也很直接在恒流源输出端串联一个精密电阻用24位ADC或者外部高精度万用表读取采样电压软件里做一个两点校准即记录低端和高端两个实际电流值算出增益系数K和偏移量B最终输出电流用[ I_{calibrated} K \times I_{raw} B ]这套流程做完把系统误差控制到±0.1%以内是完全可以实现的。5. 避坑指南与问题排查实录5.1 这次调试中踩过的5个坑第一个坑在前面已经提过运放不是轨到轨。LM358的输出摆幅到不了电源轨当DAC输出电压比较高时运放输出接近饱和恒流效果变差。我有一回设定200mA实际只有180mA就是因为运放输出电压不够驱动三极管。后来把运放供电提高到15V或者换轨到轨运放问题才解决。因此如果你用的是普通运放供电电压一定要留足余量。第二个坑是DAC输出缓冲器没有正确使能。ADuC845的DAC输出引脚如果当作普通电压源带载能力很有限直接接运放输入看起来没问题但内部结构和手册上给的等效电路不完全一致。我一开始没认真检查DACCON里缓冲使能位导致DAC输出接到运放后电压被拉低。后来把缓冲使能位正确配置后DAC输出电压和设定值就对了。建议调试第一步就先把DAC输出空载测一遍确认电压正常后再接模拟电路。第三个坑是电源噪声通过基准耦合进DAC。前面提到过我最初和运放共用电源示波器看DAC输出上有大量毛刺。这些毛刺看起来不大但经过恒流电路放大后电流端能看到明显的抖动。解决方法是把ADuC845的模拟电源和运放电源分开走线并在基准引脚就近加去耦电容。第四个坑是采样电阻发热导致的温漂。大电流持续工作时采样电阻温度升高阻值变化电流也跟着漂移。一开始我用0.25W的贴片电阻通150mA就烫得不行电流从150mA慢慢漂到148mA。换成1W直插电阻后温漂明显改善。如果你要长时间工作在250mA建议采样电阻额定功率至少选2W并且不要紧贴其他发热器件。第五个坑是软件里写了DAC码值但没等到稳定就测量。每次改DAC输出后内部RC建立需要一点时间运放环路也要时间稳定。我建议在写入DAC寄存器后延时1ms到5ms再做ADC采样或测量否则读到的是过渡状态的数据。用定时器触发DAC更新时这一点尤其重要。5.2 常见故障快速排查表调试过程中如果遇到异常别急着重焊先用这张表把问题定位到具体环节现象可能原因排查方法DAC输出一直为0DACCON未使能或输出范围配置错误先空载测量DAC引脚电压确认寄存器写入是否正确DAC有电压但负载无电流三极管接反或基极电阻过大检查三极管引脚定义测量基极电压是否在0.6~1V左右输出电流明显小于设定值运放输出饱和或DAC缓冲未使能示波器看运放输出脚电压检查是否接近电源轨电流抖动很大电源噪声耦合或基准去耦不足用示波器看DAC输出和采样电阻电压纹波加强去耦电流随负载电阻变化采样电阻反馈没接对确认运放反相输入端是否接在采样电阻上端检查接线是否形成闭环小电流档误差大运放失调电压贡献明显换低失调运放或软件做零点校准5.3 给新手的3个调试建议第一先把DAC当普通电压源单独调通再接恒流电路。这一步能帮你快速排除“软件配置问题”和“模拟电路问题”的边界。我见过不少朋友一上来就把整个系统接好出现问题根本不知道从哪里查。第二用示波器同时看DAC输出和采样电阻上的电压。如果两个信号都稳定电流一定稳定如果DAC稳定而采样电阻电压跳动那问题在运放或三极管环节。用万用表只能看到平均值一些高频抖动必须靠示波器才能暴露。第三给软件预留校准参数接口。在代码里留出K和B两个变量方便后续在产线上做两点校准。即使你现在只做一次实验这两个变量在后续改版时会帮你省下大量时间。6. 扩展玩法动态电流波形与闭环控制6.1 用定时器中断生成电流斜坡和正弦波恒流源不一定只能输出固定电流。ADuC845的DAC支持持续更新只要在定时器中断里按一定时间间隔修改DAC码值就能输出动态电流波形。比如要做电流斜坡设定一个定时器中断周期为1ms每次中断把DAC码值加1从0增加到4095就生成了一个周期约4秒的线性电流斜波。用这个斜波给电池做充电扫描或者给二极管做伏安特性扫描非常方便。做正弦波也不难提前算好一个正弦表放在数组里中断里查表写DAC即可。由于DAC更新速率受中断频率限制如果正弦波频率太高会出现阶梯感。我一般把更新频率控制在1kHz以下这样波形平滑度能满足大部分场合。6.2 用片上24位ADC做软件闭环ADuC845自带的24位ADC是这颗芯片的另一个杀器。恒流输出的采样电阻电压可以直接接到ADC输入端在软件里读回实际电流和目标电流做比较然后修正DAC码值。这等于把模拟恒流环升级成了数字闭环。数字闭环最大的好处是能自动补偿运放失调、采样电阻误差、电源波动等因素。代码逻辑很简单每次读取ADC值换算成实际电流计算误差 err target - actual用简单的PID或比例积分控制调整DAC码值循环执行直到误差足够小。我试过只做纯比例控制比例系数取0.05就能在一秒内把电流误差收敛到0.1%以内。如果加入积分项稳态误差还能进一步减小。这个方案做恒流时即便采样电阻阻值不是那么精确软件也能帮你兜底。不过要提醒一点ADC采集要避开DAC刚更新后的过渡时间。通常在DAC写完后延时几毫秒再读ADC否则软件看到的是“假误差”反而会让环路震荡。根据我个人的调试验证这套方案整体非常成熟稳定。遇到最难缠的往往不是理论计算而是那些“看起来能工作但精度总差一点”的模拟细节。只要把采样电阻的精度、运放选型和PCB布局这三件事做好再用串口配合ADC做一次标定就能得到一条非常漂亮的恒流输出曲线。后续如果你想扩展还可以在电路板散热条件允许的情况下适当提高供电电压把恒流范围从250mA扩展到500mA甚至更高或者把控制环路改成可编程的PID应对更复杂的负载特性。
返回列表