在工业校准设备上,我做过最烦的一件事就是拿螺丝刀去调一颗三毫米的机械电位计。手一抖,输出偏了,重调;环境温度一变,阻值又漂了;设备往现场一放,运输振动可能让旧电位计的位置彻底移位。后来我把这些精调电位计统一换成 AD5293BRUZ-20-RL7,配套主控用 PIC18F46K40,才算是把“调电位计”这件事从生产环节里彻底去掉。这篇文章就从硬件接线、SPI时序、固件校准流程和现场踩坑几个角度,完整拆一遍这套可编程电阻控制方案。内容主要面向做仪器仪表、工业校准模块、传感器信号调理的工程师,也适合刚接触数字电位计的开发者,照着做基本能跑通。
1. 标题背后的三个基本面:数字电位计、MCU角色和应用场景
1.1 为什么校准应用被机械电位计折磨了这么多年
工业仪表里,电路参数的微调几乎绕不开电位计。传感器零点偏移要调,放大电路增益要调,基准电压的微调也要调。传统做法是焊接一颗机械电位计,产线上工人拿螺丝刀一面看万用表一面拧。这种流程有三个天生缺陷:第一,人工调节一致性差,同一个料号在不同工人手里能差出好几个百分比;第二,机械结构存在磨损、氧化、振动移位问题,设备出厂时校准好的参数,运到客户现场可能就不准了;第三,温度漂移大,碳膜电位计的温漂系数通常在几百ppm/°C量级,而一块正经的工业仪表内部温漂预算往往只有几十ppm。
所以“用数字方式代替手动调节”这个思路,在工业校准领域几乎是必然方向。把可编程电阻接到MCU上,由固件完成自动校零、自动增益修正甚至老化补偿,这才是现代仪表该有的样子。
1.2 AD5293BRUZ-20-RL7 这颗料解决了什么
AD5293BRUZ-20-RL7 是 ADI 推出的一款单通道 SPI 接口数字电位计,型号里的 20 表示端到端电阻为 20kΩ。它最核心的指标是 1024 位分辨率,也就是 10 bit,可以把 20kΩ 的电阻网络分成 1023 步,单步理论分辨率接近 19.5Ω。这个分辨率在工业校准场合非常够用,配合合适的调理电路,完全能把信号调到千分之一甚至更高精度。
比分辨率更吸引我的是它的稳定性和一致性。AD5293 的端到端电阻容差在 ±1% 以内,温度系数典型值 5ppm/°C,而且采用的是 R-2R 梯形电阻网络架构,温漂特性要远好于普通数字电位计内部的薄膜电阻串。尾缀 RL7 表示卷带包装,适合大批量贴片生产,这对我这种要把方案推向量产的人来说是刚需。工作温度范围覆盖 -40℃ 到 +125℃,放在工业现场设备里也不用担心。
要特意说明一下,在标题里看到 BRUZ-20 这个型号时,不要和“20次编程”之类的表述混淆,这里的 20 纯粹指电阻值档位。如果你需要非易失存储抽头位置,还得看 AD5292 或者带 EEPROM 的型号;AD5293 作为成本优先的版本,上电后通常回到默认位置,需要在 MCU 初始化代码里重新写入,这一点后面会专门讲。
1.3 PIC18F46K40 在这套方案里的定位
PIC18F46K40 是 Microchip 的一款 8 位 MCU,在仪表类产品里非常常见。选择它不是因为性能最强,而是因为它刚好覆盖了这套方案需要的全部外设:至少一路 SPI 主模式,一路 10 位 ADC,内置 64MHz 无源振荡器,供电范围可以到 5V,足够让它直接和 AD5293 的逻辑电源对接,省去电平转换芯片。
另外一个很实用的特性是 PPS 外设引脚映射功能。PIC18F46K40 上 SPI 的 SCK、SDO、SDI 不一定要死在默认引脚上,开发者在代码里可以重新映射到任意合适的引脚。这意味着画 PCB 的时候布线自由度更高,特别是当 PCB 上已经有一堆信号线时,这个功能可以节省很多过孔和绕线。
在下面的设计里,PIC18F46K40 承担三个任务:通过 SPI 把抽头位置写入 AD5293;通过 ADC 采集校准节点的反馈电压;运行校准算法,自动逼近目标值。说白了,它既是执行器控制器,也是测量和决策中心。
2. 硬件设计:从原理图到 PCB 的接线要点
2.1 AD5293 与 PIC18F46K40 的引脚级连接
硬件连接看起来很简单,但有几个地方值得说清楚。AD5293 的数字接口包括 SYNC、SCLK、SDI,以及可选的 SDO,正好和 SPI 的四根线对应。PIC18F46K40 的 MSSP1 外设提供 SCK1、SDO1、SDI1 三根线,SYNC 我用一个普通 GPIO 控制,因为它在每次传输时都会被拉低再拉高,用硬件片选不灵活。
常见的接线方式如下表:
| AD5293 引脚 | PIC18F46K40 引脚 | 说明 |
|---|---|---|
| SCLK | RC3/SCK1(可 PPS 重映射) | SPI 时钟 |
| SDI | RC5/SDI1 | AD5293 数据输入 |
| SDO | RC4/SDO1 或通用输入 | 读回诊断时使用 |
| SYNC | RC0 任意 GPIO | 片选/帧同步信号 |
| VLOGIC | 3.3V 或 5V | 与 MCU 逻辑电平一致 |
| VDD | 5V | 模拟电源 |
| VSS | GND | 单电源应用直接接地 |
如果你也使用 PIC18F46K40 的 PPS 功能,接线前后的基地址会变化。我的习惯是尽量把 SPI 信号放在同一组端口,避免跨端口导致代码里还要翻 LAT 和 TRIS 寄存器。RC3/RC4/RC5 刚好可以组成一组,所以我通常这么接。
2.2 电源、基准与接地处理的几个细节
AD5293 的供电分两部分:模拟端 VDD/VSS 负责内部电阻网络和开关电路,逻辑端 VLOGIC 负责 SPI 输入级。VLOGIC 可以直接接 MCU 的电源,但要注意顺序问题。如果 MCU 是 3.3V 而 AD5293 的 VDD 是 5V,务必保证 VLOGIC 先建立,否则 SPI 引脚可能出现电流倒灌。为了规避这种风险,更稳妥的做法是在 VDD 和 VLOGIC 之间串一个 100Ω 到 1kΩ 的电阻,再配合钳位二极管,成本很低但能避免不少现场故障。
电源退耦不能省。VDD 引脚旁边放 0.1μF 陶瓷电容,另加 1μF 到 10μF 的钽电容或大容量陶瓷电容,放置位置尽量靠近引脚。AD5293 内部有数百个开关管,在抽头切换的瞬间会有一个短暂的电流冲击,如果退耦电容离得太远,电源噪声会直接影响输出电压精度。这点和模拟运放的退耦要求类似。
接地方面,工业设备上最常见的错误是把模拟地和数字地彻底分开,然后在芯片底部搞出一大块隔离带。实际上对于板内混合信号设计,我建议采用单点接地策略:AGND 和 DGND 在电源入口处短接,AD5293 的 GND 焊盘直接打过孔接到完整的地平面。完整地平面比割裂的“隔离地”对噪声的抑制效果好得多,尤其是板上有开关电源的时候,地平面不连续反而会带来更大的阻抗回路。
2.3 使用 SDO 做读回诊断的接法
AD5293 的 SDO 引脚在单机模式下可以不接,但我强烈建议无论量产还是样机都留一根飞线或者 0Ω 电阻的位置。SDO 的主要作用是读回当前的 RDAC 寄存器值,这在调试 SPI 时序时几乎是救命功能。现象很典型:写完抽头值以后,输出端电压没有变化,你很难判断是命令字不对、时序不对,还是芯片压根没进入工作状态。这时候只要用 SDO 读回寄存器,就能快速定位是写入失败还是后续模拟通道被其他地方短路。
SDO 接 PIC 的 SDI1 引脚即可。因为 AD5293 在读命令时,数据是在 SCLK 边沿从 SDO 输出的,PIC 的 SPI 主模式天然支持这半双工读操作。需要注意 SDO 是推挽输出还是开漏输出,不同批次可能会有内部弱上拉配置,如果发现读回的数据全是高电平,先查数据手册确认是否需要外接上拉电阻。
3. SPI 时序与控制寄存器:为什么先理解模式再写代码
3.1 AD5293 的命令字格式和寄存器理解
AD5293 属于标准 SPI 从机,一次传输是一帧 16 bit。我习惯把这一帧拆成“命令位 + 数据位”来看:命令位用来指定要操作哪个寄存器或者执行什么动作,数据位在写 RDAC 寄存器时是 10 bit 抽头位置。项目里使用的高 6 位命令字,低 10 位数据这种帧结构在 AD5293 系列上验证没问题,但不同批次或者跨型号(比如 AD5292)时,我还是会先打开数据手册的 Register Map 一页逐位核对一遍,因为这种数字电位计的命令字格式曾经过多次微调,早期的参考代码和现在的芯片不完全兼容。
常用的几条命令包括:
| 功能 | 命令码示例 | 数据位 |
|---|---|---|
| 写 RDAC 寄存器 | 0x04 | 10 bit 抽头值 |
| 写控制寄存器 | 0x18 | 保护位等 |
| 复位 | 0x06 | 无 |
代码里应该把命令码统一用宏定义好,不要散落在函数中:
#define AD5293_CMD_RDAC 0x04 // 写RDAC寄存器 #define AD5293_CMD_CTRL 0x18 // 写控制寄存器 #define AD5293_CMD_RESET 0x06 // 软件复位RDAC 寄存器是核心抽头位置寄存器。写入 0 时,W 端靠近 B 端,等效电阻接近 0Ω 加上一个游标电阻;写入 1023 时,W 端靠近 A 端,等效电阻接近端到端电阻值。写入 512 时理论上接近 10kΩ,但因为端到端电阻有 ±1% 容差,实际阻值在 9.9kΩ 到 10.1kΩ 之间浮动,这在系统级校准时需要特别留意,后面我专门讲。
3.2 PIC18F46K40 MSSP 配置示例
PIC18F46K40 的 MSSP1 模块可以工作在 SPI 主模式。初始化过程我一般这样写:
void SPI1_Init(void) { // 引脚方向:SCK1 输出,SDO1 输出,SDI1 输入 TRISCbits.TRISC3 = 0; // SCK1 TRISCbits.TRISC4 = 0; // SDO1 TRISCbits.TRISC5 = 1; // SDI1 TRISCbits.TRISC0 = 0; // CS 输出 LATCbits.LATC0 = 1; // CS 默认高电平 // 关闭模块并重新配置 SSP1CON1 = 0x00; SSP1CON1bits.SSPM = 0b0010; // SPI Master,FOSC/64 SSP1CON1bits.CKP = 0; // 时钟空闲低电平 SSP1CON1bits.SSPEN = 1; // 使能 MSSP1 SSP1STATbits.SMP = 1; // 在末尾采样 SSP1STATbits.CKE = 1; // 时钟边沿模式,ADI 常用模式之一 }注意 CKP、CKE 和 SMP 三个位组合起来决定了 SPI 模式。AD5293 这类芯片通常对模式很敏感,写错以后的表现是:读回数据全是 0xFF,或者写入后输出根本没有变化。调试时最好用一个逻辑分析仪同时看 SYNC、SCLK、SDI 三根线,比盲改寄存器要快得多。如果手上没有逻辑分析仪,可以用 PIC 的 GPIO 模拟 SPI,把时钟降到 100kHz 以下,再用万用表量 SYNC 和 SCLK 是否正常翻转。
MSSP 的波特率我一般选择 FOSC/16 或者 FOSC/64,AD5293 支持的最高时钟是 50MHz,PIC18F46K40 完全跑不满,所以瓶颈在 MCU 侧。在板级短走线情况下,用 FOSC/16 完全没有问题;如果 AD5293 和 MCU 之间有接插件或者超过 10cm 的排线,我会降到 FOSC/64,这个速度仍然足够完成校准任务,但抗干扰能力会明显提高。
3.3 时序验证的实操办法
写完 SPI 初始化代码后,第一件事不是去写校准算法,而是验证读写通路。最简单的方法是写一个固定抽头位置,再用 SDO 读回来比对。
举个例子,先把抽头设成 0x200(十进制 512),然后用读命令把 RDAC 寄存器的值读回来,如果读回来的值和写入的值一致,说明整个 SPI 通路和命令帧格式都是对的,可以继续往下开发;如果不一致,优先查三个地方:SPI 模式、帧长度、CS 时序。CS 时序这个问题最容易忽略,AD5293 要求 SYNC 在整个 16 bit 传输期间必须保持低电平,传输结束后再拉高,而且拉高到下一次拉低之间至少要留一个极短的时间间隔。有些工程师习惯在传输完每个字节后都把 CS 拉高再拉低,这在很多 SPI Flash 上是允许的,但在 AD5293 上会导致一帧数据被错误拆成两帧,命令根本不会执行。
4. 固件实现:单次写入、读回验证与自动校准流程
4.1 基础驱动函数实现
底层的 SPI 字节交换函数用 MSSP 的标准写法:
uint8_t SPI1_ExchangeByte(uint8_t data) { SSP1BUF = data; while (!PIR1bits.SSP1IF); PIR1bits.SSP1IF = 0; return SSP1BUF; }往 AD5293 发一帧命令时,先把 CS 拉低,发送两个字节,再拉高 CS:
void AD5293_SendCommand(uint16_t cmdWord) { CS_LOW(); SPI1_ExchangeByte((cmdWord >> 8) & 0xFF); SPI1_ExchangeByte(cmdWord & 0xFF); CS_HIGH(); }设置抽头位置的函数只需要拼好命令字:
void AD5293_SetWiper(uint16_t position) { uint16_t cmdWord; if (position > 1023) position = 1023; cmdWord = (AD5293_CMD_RDAC << 10) | position; AD5293_SendCommand(cmdWord); }读回 RDAC 寄存器时,需要先发一个读命令帧,然后紧接着再传一个任意时钟帧用来把数据从 SDO 移出来。这里要注意,读回来的数据可能只有 10 bit 有效,高 6 位需要清零:
uint16_t AD5293_ReadRDAC(void) { uint16_t result; CS_LOW(); SPI1_ExchangeByte((AD5293_CMD_READ_RDAC << 8) & 0xFF); result = SPI1_ExchangeByte(0x00); CS_HIGH(); return result & 0x03FF; }如果不出意外,写进去 512 再读回来就应该是 512。这一步验证通过后,后面所有校准算法都可以建立在“写进去的就是真实阻值”这个前提上。
4.2 自动校准流程:用 ADC 闭环逼近目标值
在工业现场,我最常用的场景是:PIC 通过 ADC 采集某个输出信号,然后自动调节 AD5293 的抽头位置,让输出信号稳定在目标值。这个闭环可以非常简单,一个二分搜索就能解决。
假设目标 ADC 值是 2048,采集通道是 AN0:
#define TARGET_ADC 2048 #define ADC_CHANNEL 0 uint16_t auto_calibrate_pot(void) { uint16_t low = 0; uint16_t high = 1023; uint16_t mid; uint16_t adcVal; while (low < high) { mid = low + (high - low) / 2; AD5293_SetWiper(mid); __delay_ms(5); adcVal = ADC_ReadAverage(ADC_CHANNEL, 16); if (adcVal < TARGET_ADC) { low = mid + 1; } else { high = mid; } } AD5293_SetWiper(low); return low; }ADC_ReadAverage 是我自己封装的函数,连续采样 16 次取平均,消除开关电源带来的纹波影响。5ms 的延时是给 AD5293 内部 RC 网络和外部滤波器一个稳定时间,实际需要多少取决于后级电路的带宽。如果后级是低通滤波器,可能要延到 20ms 甚至更长。
二分搜索的好处是收敛快,最多 10 次就能把 1024 个位置搜索完。如果校准速度要求不高,也可以用逐次逼近的方式:从 0 开始往上加,每步延时后判断 ADC 值是否过冲,一旦过冲就回退一步。这种方法实现更直白,但时间会不稳定。我通常会默认用二分,看到 ADC 读数有明显单调性就无需再纠结。
4.3 软件复位和上电抽头位置的管理
AD5293 在上电后会进入默认状态,常见默认状态是中间抽头位置,也就是 512 对应的输出。这个状态在开发阶段没问题,但在工业设备上可能带来安全隐患。比如一个功率模块在启动瞬间如果电阻值是中间值,可能导致驱动电流过大或者电压过高。
我的处理方式是在 MCU 上电后、主功能启动前,立刻把 AD5293 设置到一个安全抽头位置。安全位置应该根据产品定义决定,可以是 0、1023 或某个特定值,目标是让信号链在启动阶段不会触发任何保护阈值。代码里我一般单独维护一个SAFE_WIPER_POS宏,每次开机先执行AD5293_SetWiper(SAFE_WIPER_POS);然后再做其他初始化。这样即使后续校准算法跑飞,最坏情况也就是卡在安全位置,不至于造成硬件损伤。
还有一个细节是,AD5293 的抽头切换是瞬时的。如果你在系统运行中直接从一个抽头跳到另一个差距很大的抽头,输出信号会产生一个很大的阶跃。在校准算法收敛过程中,如果二分搜索大步长跳动,后续电路可能会因为这个阶跃产生过冲甚至振荡。所以我通常会在固件里加一层“限步进”包装:每次抽头变化不超过 8 到 16 步,超过的话分成多次执行,每次之间延时 1ms。这样信号变化看起来是平滑斜坡,对整个系统的冲击小很多。
5. 工业现场最容易踩的坑:上电瞬间与电阻精度
5.1 上电毛刺如何伤害被测设备
这个坑我踩过不止一次。最初做样机时,我关注的是静态精度,完全没留意上电瞬间 AD5293 的输出状态。结果设备每次开机,后级电路都会收到一个意外的电压尖峰。如果是普通 LED 或者指示灯问题不大,但如果后级是功率驱动模块或者昂贵的传感器电路,这个尖峰可能导致误动作。
根因有两层:第一,PIC18F46K40 从复位到执行第一条 C 指令需要几十毫秒,甚至更久,如果是内部振荡器启动、ADC 模块初始化等流程走完,到执行AD5293_SetWiper(SAFE_WIPER_POS)可能需要几十毫秒;第二,在这段时间里 AD5293 的 SYNC 引脚可能处于未定义状态,SDI 上的数据也可能是随机电平,芯片很容易在干扰下完成一次误写入,把抽头切到任意位置。
解决办法不只是软件。硬件上我会在 SYNC 和 SCLK 引脚各加一个 10kΩ 下拉电阻,保证 MCU 还没配置 GPIO 时,AD5293 不会把随机电平当成有效时钟或片选信号。软件上则把写安全位置的代码放到 main 函数最开始,连串口初始化都放在它后面。这种“先暂停输出,再建立控制”的时序设计,是工业设备启动阶段最重要也最容易被忽视的一环。
5.2 端到端电阻容差和游标电阻带来的误差修正
写 512 不意味着输出就是 10.000kΩ,这是很多人第一次用数字电位计时最容易产生的误解。AD5293 的端到端电阻容差是 ±1%,也就是说名义 20kΩ 的芯片,实际可能是 19.8kΩ 到 20.2kΩ 之间的任意值。另外,W 端和内部开关管之间存在一个游标电阻,典型值大概在 60Ω 量级。在计算等效电阻时,应该用更准确的模型:
R_effective(D) = (R_AB / 1023) × D + R_W
当 D 接近 0 时,游标电阻占主导;当 D 接近 1023 时,游标电阻的占比不到 0.5%,影响可以忽略。但如果你把数字电位计放在低阻值精密电路里,尤其 D 值小于 100 时,游标电阻的绝对值和温漂就不能忽视了。
针对这个误差,系统级校准是最好的应对方式。别指望靠 AD5293 本身“绝对准确”,而要把“电位计位置值”当成一个变量,用 ADC 实时监测输出,再用算法找目标位置。这样即使换了一颗不同批次的 AD5293,端到端电阻变了,只要 ADC 参考电压是稳定的,校准算法都能自动收敛到正确位置。这也是我在这套方案里坚持“ADC + 软件闭环”而不是“开环写固定抽头”的根本原因。
5.3 ESD、热插拔和长线 SPI 的防护
工业现场和实验室桌面的最大区别是电磁环境和连接方式。AD5293 的 A、B、W 三个端子在原理图上看起来像电阻,但内部是 MOS 开关阵列,耐压和抗静电能力都比普通电阻差得多。如果有人拿着信号线去碰 W 端,或者设备在带电状态下插拔传感器,这些端子很可能被打坏。
我通常会在 A、B、W 端子并联一对反向串联的开关二极管,把电平钳位在 VDD 和 VSS 之间,再串一个小阻值限流电阻。如果设备有对外接口,还会加 TVS 管或者专用 ESD 防护芯片。这个设计会增加一点点成本,但换来的是现场返修率的大幅下降,非常划算。
SPI 线如果超过 10cm,或者经过排线连接器到另一块板子,就要考虑信号完整性了。我的做法是降低 SPI 时钟到 1MHz 以下,同时在靠近接收端串联 22Ω 到 47Ω 的电阻,压制振铃。如果线长超过 30cm,最好改用电流环或者 RS-485 接口,而不是硬折腾 SPI。数字电位计的控制速度本来就不高,时钟慢一点完全不影响功能,但稳定性会显著提升。
6. 从样机到量产的扩展:标定、追溯与替代选型
6.1 出厂标定流程怎么设计
整套方案跑通以后,生产线的标定流程可以做到高度自动化。我的做法是:每台设备上电后,由上位机通过串口发送测试指令,PIC18F46K40 运行校准函数,把 ADC 采集到的结果和最终抽头位置上报。校准值写入 MCU 的 Flash 参数区,下一次开机直接使用,同时记录设备序列号、校准时间、校准温度、ADC 原始值等数据。
这样做的好处有两个。一是产线一致性大幅度提升,不再需要工人手动调整,标定时间从原来的一两分钟缩短到十几秒。二是数据可追溯,万一客户现场出现异常,可以把这个设备的校准历史调出来,快速判断是出厂偏差还是现场环境变化。这个思路适用于几乎所有带校准环节的工业仪表。
需要注意,虽然 AD5293 本身不带非易失存储,但其抽头位置可以由 MCU 在上电初始化时恢复。离线保存的位置值建议加上校验码,防止 Flash 数据被意外改写后设备仍然正常运行,结果输出却偏了。我在工程里会把校准值同时存两份,加异或校验和,启动时比较,不一致就进入故障安全状态。
6.2 多通道校准和菊花链扩展
如果一块板上有多路需要校准的通道,例如四路传感器信号调理,可以每个通道放一颗 AD5293,然后用菊花链的方式把它们串在一条 SPI 总线上。AD5293 支持链式结构,上一级的 SDO 接下一级的 SDI,共用 SCLK 和 SYNC。配置时先计算出所有芯片的命令帧,按照从末端到首端的顺序拼接,再一次性移出。这样 MCU 只需要占用一个片选和一个 SPI 外设,就能同时控制四颗芯片。
菊花链的代价是每次写操作都要把所有通道的数据一起发一遍,即使只改了其中一个通道。不过这在校准场景里无所谓,因为校准时本来就是一台设备逐步遍历所有通道,数据量很小。需要注意的是,链越长,每帧数据越长,SPI 时钟还是不要跑太高,否则首尾芯片的数据时序会偏移。
假如不想用菊花链,也可以把每颗 AD5293 的 SYNC 单独接到不同 GPIO,用软件分时操作。这种做法的优点是程序更直观,缺点是会占用多个 GPIO 引脚。PIC18F46K40 引脚资源比较充足,但我一般还是优先用菊花链,因为接线更整齐,后期扩展也方便。
6.3 和普通数字电位计的选型对比
做方案选型时,很多人会把 AD5293 和 MCP4131、MAX5487、AD8403 这些数字电位计放在一起比。这里我列一个比较实用的对照表,帮大家根据场景快速判断:
| 型号 | 分辨率 | 端电阻 | 接口 | 主要特点 |
|---|---|---|---|---|
| AD5293 | 10 bit | 20kΩ | SPI | ±1% 容差,5ppm/°C 温漂 |
| MCP4131 | 7 bit | 5kΩ/10kΩ | SPI | 便宜,适合低精度场合 |
| MAX5487 | 8 bit | 10kΩ | SPI | 双通道,非线性较好 |
| AD8403 | 8 bit | 10kΩ | SPI | 四通道,适合多路粗调 |
从经验看,如果你的产品定位是精密校准仪表,AD5293 的 10 bit 分辨率和低温漂是实打实的好处;如果只是给普通电路提供一个可调的偏置电平,8 bit 或者 7 bit 的芯片就足够了,还能省不少成本。AD5293 的 BRUZ-20-RL7 版本定位偏高端,但它带来的产线自动化收益往往远超物料成本,这个账要算整个产品生命周期的成本,而不是只看 BOM 单颗价格。
选型时还要留意通道数和封装尺寸。AD5293 是单通道,如果板上有四路信号需要独立校准,要么用四颗单通道芯片,要么换四通道的 AD8403。但 AD8403 只有 8 bit,分辨率低了四倍,在校准精度要求高的场合不太够用。这时候我更倾向于用四颗 AD5293 做菊花链,既保留了高分辨率,也不至于让 PCB 面积失控。
6.4 混合方案:数字粗调加模拟精调
做一个补充思路。在部分要求特别高的应用里,比如输出精度需要到十六位 DAC 级别,单靠一颗 10 bit 数字电位计仍然不够。这时可以采用“数字电位计粗调 + 模拟电位计精调”的混合结构:AD5293 负责大步进粗调,后级运放反馈网络里保留一颗小型机械微调电容或低温漂电阻用于最终精调。虽然又用到了机械元件,但这颗元件只在生产线上调一次,之后不再触碰到,它的温漂和稳定性问题可以通过选用高精度电阻缓解。
这种混合方案在高端可编程电源和校准源里很常见。优点是兼顾量产自动化和最终精度,缺点是设计和调试复杂度增加。大多数情况下,AD5293 单独作为精调元件已经足够,混合方案是给那些对精度有“偏执”要求的项目准备的。
最后分享一个我自己的小习惯:在所有用到 AD5293 的电路板上,我都会在 A、W、B 三个端子旁边预留一组测试点,哪怕只是很简单的焊盘。量产出问题的时候,测试点可以直接用万用表量出实际阻值,不用拆散热胶、不用刮阻焊油,调试速度会快非常多。可以说,整个项目的周期收益,有一部分就来自这些不起眼的细节设计。