ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

基于ADuC845的数控恒流源实战:DAC配置、电路选型与三大避坑指南

基于ADuC845的数控恒流源实战:DAC配置、电路选型与三大避坑指南 做一个数控恒流源很多人第一反应是“不就是DAC输出电压给运放嘛”可真等你把ADuC845的DAC配好、电路焊完、上电实测才发现处处是坑。这段时间我做现场仪表用的可编程恒流电路主控选了ADuC845——这颗8051内核单片机最方便的地方在于片内集成了24位高精度ADC和双12位DAC一颗芯片同时搞定“测”和“控”省掉外部转换芯片不说做数字闭环也顺手。但也正因为DAC在片内很多人习惯把它当普通外设用忽略了参考电压质量、输出缓冲、地平面处理这些细节最终导致恒流电路怎么调都有误差甚至误以为芯片坏了。这篇文章我按自己的调试顺序完整写一遍从寄存器配置、电路选型和参数计算到实测数据与误差分析再讲三个真正让我折腾到半夜的问题。内容偏长建议先收藏再慢慢看。1. 先搞懂ADuC845的DAC从寄存器到输出引脚1.1 DAC的硬件框架与输出范围选择ADuC845片内集成了两个12位电压输出DAC属于带内部缓冲放大器的那种轨到轨输出数据手册上给出的建立时间大约10微秒级别对恒流源来说响应速度完全够用。很多人第一次用会忽略DACCON寄存器一上来就写DHR寄存器结果发现引脚上没电压然后怀疑芯片坏了。其实DAC输出默认是关闭的必须在控制寄存器里把对应通道的使能位置1。DACCON低两位分别是DAC0EN和DAC1EN控制两路DAC的开关这在所有ADI老款8051内核MCU上都差不多但具体位定义还是要以你手头的型号和手册为准。DAC输出范围可以配置成0到Vref也可以0到2倍Vref由DACCON里的增益配置位决定。这里有个容易踩的选择误区有人觉得范围越大越好其实12位DAC一共就4096个码分到2倍量程后每位对应的电压步进变大绝对误差并没有改善反而在软件换算时更容易出问题。我最终选择1倍量程也就是0到2.5V配内部2.5V基准。1.2 DHR寄存器写入与码值换算DAC的输出电压和码值的关系很简单Vout (code / 4096) × Vref × GAIN其中GAIN是DACCON里配置的增益倍数用1倍量程时GAIN1。如果目标输出1.25VVref2.5V那么code就是2048。配置和输出的代码框架如下在Keil C51环境下用ADI官方头文件可以这样写#include ADuC845.h void DAC0_Output(unsigned int code_val) { unsigned char hi, lo; // 只使能DAC0DAC1保持关闭 DACCON (DACCON 0xFC) | 0x01; // 配置增益为1倍具体控制位参考手册 DACCON ~0x20; // 12位码值拆成高低字节写入DHR0 hi (code_val 8) 0x0F; lo code_val 0xFF; DHR0H hi; DHR0L lo; }注意不同版本的芯片头文件对DHR0的定义不完全一样有的把DHR0联立成16位寄存器有的拆成DHR0H和DHR0L两个独立SFR。工程里先打开头文件确认一下避免编译报错。我自己习惯按字节拆开写不管头文件怎么定义都不会出问题。写码值时的另一个细节DHR寄存器名义上是16位但DAC是12位只用到低12位。输入超过0x0FFF的高位要么被忽略要么产生未定义行为稳妥起见在上层函数里做一次码值限幅防止误操作。1.3 输出引脚上的真实表现DAC内部虽然有缓冲放大器但它的驱动能力依然有限不能把它当成真正的功率输出。我实测过直接拿DAC0引脚接1kΩ电阻对地输出电压比空载时下降十几毫伏负载调节率远不如外部独立DAC芯片加运放缓冲的电路。所以在恒流源设计里DAC输出后面必须接高输入阻抗的调理级比如电压跟随器、分压网络或者直接进入恒流运放的同相端。PCB布局上DAC输出算模拟信号走线尽量短别和数字信号线平行长距离走线尤其是靠近晶振引脚、UART TX/RX这些频繁翻转的地方。有一版我就是因为DAC输出线和UART发送线挨了近3厘米串口一通信恒流输出就出现周期性毛刺。参考电压引脚的去耦也不能省。REFIN引脚旁边我放了10uF钽电容加0.1uF陶瓷电容紧贴引脚摆放。内部2.5V基准虽然方便但噪声指标一般如果你对精度有更高要求后面坑二会详细讲外部基准的必要性。2. 恒流源电路选型为什么是运放加NMOS低边方案2.1 三种常见恒流方案对比DAC输出只是把“控制信号”做好了真正决定恒流性能的是后面的功率级电路。我整理了三种常见方案的对比方案精度成本调试难度适用场景三极管恒流源低受hFE和温度影响大最低简单对精度不敏感的LED驱动运放NMOS低边恒流源高只取决于参考电压和采样电阻中中等0~1A单向精密恒流Howland电流源高但依赖电阻匹配中高高小电流双向精密输出三极管恒流源看似简单但基极电流会泄掉一部分,而且hFE随温度漂移明显做精密控制完全不行。Howland电流源是种很经典的方案输出电流精度很高但它需要四个匹配电阻严格配对否则共模抑制比恶化调试起来很头疼。最终我选了运放加NMOS的低边恒流源。它的原理并不复杂DAC输出电压通过分压网络得到设定电压Vset送入运放同相输入端NMOS管作为调整管源极串一个精密采样电阻Rsense到地采样电阻上的电压反馈到运放反相输入端。运放不断调整栅极电压直到反馈电压等于Vset此时输出电流IoutVset/Rsense只取决于两个关键元件原理清晰、调试直观也方便软件校准。2.2 指标拆解与关键参数计算这块板子的目标指标是0到500mA可编程恒流输出DAC分辨率12位理论上电流步进为500mA/4096≈0.122mA足够覆盖实际需求。DAC输出电压范围0~2.5V采样电阻1Ω2W0.1%精度分压网络R14kΩR21kΩ分压比0.2设定电压Vset0~0.5V输出电流范围0~0.5A分压网络的用意很明确DAC满量程2.5V直接给运放的话1Ω采样电阻对应2.5A输出功率和散热都不现实。通过R1和R2分压把0~2.5V映射到0~0.5V采样电阻上的压降限制在安全范围。这两个分压电阻必须用0.1%精度、25ppm/°C以内的低温漂电阻因为分压比的漂移会直接叠加到电流误差里。采样电阻的选择决定了整个恒流源的“底噪”。0.5A流过1Ω电阻功耗是0.25W用2W封装就是为了让电阻温升尽量小。功率电阻在温度升高时阻值会变化即使标称25ppm/°C温升50°C也会带来千分级的漂移。采样电阻两端我预留了开尔文测试焊盘方便用万用表直接量电压也方便后面飞线验证。运放选型有几个硬指标单电源供电、轨到轨输出甚至轨到轨输入、失调电压低于1mV。我用的型号是SGM8521大概算这类应用的入门级选择输入偏置电流在pA级别对高阻抗分压网络不会造成明显误差。NMOS管选了逻辑电平驱动的N沟道增强型MOS管比如AO3400VGS(th)典型值在1V左右RDS(on)很小。选管的时候要特别注意VGS(th)如果阈值电压太高而运放输出低端摆不到足够负的电压小电流段就会出现“调不出来”的问题这个坑在本文避坑指南部分会专门展开。2.3 环路稳定性和栅极驱动细节运放加NMOS加采样电阻本质上是一个闭环负反馈系统MOS管的栅源电容会引入一个极点运放输出端到栅极的走线电感也可能在超高频段造成振荡。如果上电后用示波器看采样电阻波形发现叠加了几十MHz的小幅正弦振荡DAC码值没变但电流读数明显偏大基本就是自激振荡了。处理办法是运放输出到MOS栅极之间串一个10到100Ω的电阻推荐先放33Ω然后在栅极对地加一个1nF到10nF的电容限制带宽。我实际测试中33Ω串联电阻加4.7nF栅极电容的组合很稳没有牺牲太多响应速度。PCB上这两个元件的位置预留好参数可以现场换。电源供电也要分开处理运放和DAC用5V稳压供电功率级用12V给负载和MOS管供电模拟地单点汇合。如果功率地和模拟地混在一起负载电流的波动会直接干扰DAC基准后面实测出来的数据会很吓人。3. 实测数据DAC码值对照表与误差来源分析3.1 测试平台与仪器配置测试环境是室温25°C板子上电稳定半小时后再记录数据避免热漂移干扰判断。供电方面数字部分和DAC用5V功率级用12V直流稳压电源负载用25Ω功率电阻模拟0.5A时功耗6.25W电阻要选够功率余量的。测量仪器是一台六位半台式万用表分别测DAC0输出电压、Vset电压、采样电阻两端电压电流按U/R计算。测数据的同时ADuC845的UART把当前DAC码值和设定电压值实时回传到串口调试助手这样人不用一直盯着屏幕数据也能留档。Keil调试模式下还可以直接查看DHR0寄存器的实时值确认写入是否正确。这套“串口回传加万用表实测”的配合方式效率很高建议做类似项目的朋友都搭一套。串口回传反映的是“单片机认为自己在输出什么”万用表反映的是“电路板上实际发生了什么”两者一对比问题出在数字侧还是模拟侧立刻就能看出来。3.2 实测数据表下面这组数据是未校准、室温条件下同一块板子连续测量得到的。DAC参考电压2.5V分压系数0.2采样电阻1Ω所以理论电流I_out Vset / 1Ω。DAC码值理论DAC电压(V)Vset理论值(V)理论电流(mA)实测电流(mA)误差(mA)00.00000.00000.00.80.85120.31250.062562.561.9-0.610240.62500.1250125.0124.4-0.615360.93750.1875187.5187.1-0.420481.25000.2500250.0249.6-0.425601.56250.3125312.5312.0-0.530721.87500.3750375.0374.9-0.135842.18750.4375437.5437.2-0.340952.50000.5000500.0497.5-2.5中段误差基本控制在±0.1%以内完全满足这台仪表的规格要求。但数据两端的异常值得分析零点有0.8mA残余输出满量程时误差扩大到2.5mA这两个现象在后来的避坑排查中都找到了具体原因。3.3 数据背后的三个线性度问题第一个问题是零点残余电流。code0时DAC输出理论是0V但运放输出低端摆幅不是真正的0VNMOS在栅压不为0时也会有微弱的漏电流加上运放自身的失调电压几种因素叠加就产生了0.8mA的残留。对精度要求高的场合必须做零点校准或者给运放加负电源让输出真正能到0V。第二个问题是中间段一致性很好。124.4、187.1、249.6这几个点和理论值差距基本恒定在0.4到0.6mA这部分误差主要来自分压电阻的精度和采样电阻的标称偏差属于系统误差完全可以通过软件两点校准消除。第三个问题是满量程附近的误差扩大。接近500mA时NMOS管的漏源电压被压缩开始接近线性区运放输出电压也逼近自身的摆幅上限加上12V电源在负载增大时会有轻微跌落几个因素一起导致了高端误差变大。这个问题靠软件校准只能缓解必须从硬件上改善电源调整率或者选择导通阻抗更低、阈值更合适的MOS管。校准思路很简单取两个点就能做线性修正。比如用code1024和code3584两点记录实测电流I1和I2得到修正系数k(理想增量)/(实测增量)代码里输出前对码值做一次线性变换。实测下来中段误差可以压到0.3mA以内。4. 避坑指南三个让我折腾到半夜的问题4.1 坑一采样电阻走线导致电流低频抖动现象很诡异DAC码值固定用万用表直流档读电流数值会在几十毫安范围内周期性漂动指针表完全没法看。用示波器看采样电阻两端波形发现不是干净直流而是叠了一层低频毛刺。排查链路值得完整复盘一遍。先怀疑DAC输出不稳定量DAC0对地电压很干净排除了数字侧的问题。再把示波器探头移到运放反相输入端毛刺跟着出现了说明故障点在模拟反馈回路里。最后用万用表毫伏档从采样电阻两端到运放反相输入逐个测点位压差发现问题出在PCB布局上。根因是采样电阻的地端通过一条细长走线回到系统地这条走线上恰好有MOSFET的功率电流路径。负载电流流经地线时产生压降这个压降叠加到采样电压上运放无法区分真实采样信号和地线上感应的噪声于是输出电流跟着波动。解决方法是采样电阻两端各引一条独立的细走线直接到运放输入引脚即“开尔文连接”。功率电流路径和电压采样路径完全分开在PCB上从采样电阻正负端单独引出两条线原功率路径不动两条采样线在某一点单点接入系统地。飞线验证后毛刺立刻消失电流稳定度显著提高。这个坑在低电流时可能不明显电流大了之后会非常致命设计阶段就要把采样网络当成一个独立的高灵敏度“测量仪表”来布局。4.2 坑二DAC参考电压不够干净恒流精度被拉垮做完零点和中段校准后我尝试把分辨率推到0.1mA级别结果发现DAC码值每变化几个LSB电流跳变量很不均匀有时候码值加1电流反而往回退一点完全不是单调变化。一开始怀疑数字侧写寄存器有误用Keil调试模式盯着DHR0寄存器看数据完美写入。然后量DAC输出直接对地电压发现问题波形上叠了大约几个毫伏的噪声而且这个噪声的周期和板子上开关电源的纹波一致。继续追根溯源量REFIN引脚噪声更大。根因是内部2.5V基准虽然方便但在片内共享模拟与数字电源域ADC采样和数字内核活动会通过衬底和电源网络耦合到基准源上。外部基准引脚和旁路电容走线也没处理好等于把整个系统最敏感的参考节点暴露在干扰源旁边。解决方法是换外部低噪声基准源ADR425或REF192都可以REFIN引脚直接接外部基准输出不再用内部基准。REFIN引脚处重新布置了0.1uF高频去耦电容加10uF钽电容的组合。实测DAC输出噪声降到了原来的约三分之一恒流输出毛刺也明显减小。这里有个经验内部基准不是不能用但前提是系统对精度要求不太苛刻而且模拟和数字电源通过磁珠或电阻做了充分隔离。一旦发现DAC输出有周期噪声优先怀疑参考电压节点直接用示波器量基准引脚排查效率最高。4.3 坑三运放选错导致小电流段“调不出来”当DAC码值降到很低时比如Vset理论值只有20mV时输出电流要么是0要么突然跳到30mA完全不能按比例调节中间找不到平滑过渡区。排查链路也很典型量运放同相输入端电压正常量反相输入端电压比同相端高说明运放根本没有进入线性负反馈状态。再用示波器看运放输出引脚已经贴到电源低轨了。根因是当初用的运放不是轨到轨输出单电源5V供电下输出最低只能摆到大约0.6V。当时Vset只有20mV采样电阻上只需要20mV反馈电压但运放要把NMOS栅极拉到接近0V才能满足这个条件而它的输出摆不到那么低反馈稳定点就根本不存在。通俗点说运放“够不到”它该去的位置输出直接撞在低轨上MOS管一会儿全关一会儿微导通电流自然乱跳。解决方法是换轨到轨输出运放换片后低端电流可以平滑调到1mA以下问题彻底消失。如果手头只有普通运放有两个变通方案给运放加一个小负电源比如-5V让它输出能真正回到0V附近或者在运放同相端加一个高于地的小偏置电压把整个工作点抬高。第二种方案需要额外校准精度略受影响但能救急。这个坑非常典型几乎所有用DAC控恒流的项目都会遇到建议选型阶段就确认“轨到轨输出”这个指标别光看失调电压。5. 一些值得补充的经验最后分享几条实测中积累的体会。第一PCB打样时一定要留足测试点。DAC输出、Vset、运放同相端、反相端、采样电阻两端、栅极电压这些节点全部引出测试焊盘。排查问题时探头一搭就能量不用飞线、不用刮开阻焊层效率完全不一样。第二上电顺序有讲究。先让单片机跑起来确认DAC输出一个较小码值再接通功率级电源。如果在DAC没有初始化的状态下直接上12V功率电运放同相端电压不确定MOS管栅极可能被拉到异常电位输出电流瞬间超标轻则烧采样电阻重则损坏负载。第三温度对恒流精度的影响不能忽视。采样电阻、分压电阻、基准源是三个主要温漂来源。我的板子在25°C校准后放到40°C环境再测中段误差扩大了约0.5mA主要来自采样电阻和分压电阻的温漂。对温漂敏感的场合直接上低温度系数的精密电阻或者利用ADuC845片内24位ADC实时采样采样电阻电压做数字闭环补偿。第四ADuC845最值钱的地方其实是那颗24位ADC。目前我只是用DAC开环控制后续版本打算用片内ADC实时回采采样电阻电压做软件PID闭环这样不仅能修正运放非线性和温漂还能自动补偿电源波动。对做仪表的工程师来说这颗芯片的价值远不止一个12位DAC那么简单。调试这类精密模拟控制电路本质上是个反复“测量、对比、排除”的过程。先把数字侧确认清楚再用示波器和万用表把模拟侧逐级拆开看绝大多数问题都能定位到具体节点上。希望这篇记录能帮你少走几步弯路少熬几个夜。
返回列表