电子设计大赛D题实战复盘:用AD9959和ADS8688实现高精度输入阻抗测量
在电子设计竞赛中,输入阻抗测量往往是电路特性分析的基础环节。去年带队参加全国电子设计大赛时,我们组选择了D题《简易电路特性测试仪》,其中最关键的技术难点就是实现1kΩ-50kΩ范围内的高精度阻抗测量。经过反复验证,最终采用AD9959作为信号源、ADS8688作为采集核心的方案,配合6.8kΩ基准电阻的巧妙设计,测量误差控制在5%以内。本文将完整还原从芯片选型到代码调试的全过程,特别分享几个容易踩坑的细节:
1. 方案设计与芯片选型
1.1 为什么选择AD9959作为信号源
在比较了FPGA+DAC、单片机PWM等多种方案后,我们最终选定ADI的AD9959直接数字频率合成芯片,主要基于三个核心优势:
- 频率精度与范围:内置32位频率累加器,输出频率分辨率达0.1Hz,0.02Hz-100MHz的宽频带完全覆盖题目要求
- 集成化设计:单芯片集成10bit DAC和时钟倍频电路,相比分立元件方案,PCB面积减少60%
- 可编程接口:通过SPI接口可实时调整频率/幅度,实测响应时间仅2.3μs
注意:AD9959的参考时钟需要特别处理。我们采用50MHz有源晶振配合内部4倍频,最终输出200MHz时钟信号时,实测相位噪声为-145dBc/Hz@10kHz偏移。
1.2 ADS8688的采集优势
传统单片机内置ADC在测量阻抗时面临两个致命问题:
- 需要外接偏置电路,设计复杂度高
- 输入范围有限,易烧毁ADC通道
ADS8688的突出特性解决了这些痛点:
| 参数 | 指标 | 传统方案对比 |
|---|---|---|
| 输入范围 | ±10V可编程 | 通常仅0-3.3V |
| 分辨率 | 16位 | 多数MCU为12位 |
| 采样率 | 500kSPS | 约100kSPS |
| 电源需求 | 单5V供电 | 需多电压轨 |
实际测试中,将ADS8688配置为±10V范围时,即使误接12V信号也不会损坏芯片——这对学生竞赛中的容错设计至关重要。
2. 硬件电路设计细节
2.1 分压法测量原理
输入阻抗测量采用经典分压原理:
Vmeasure = Vin * (Rin / (Rin + Rref))其中Rref为已知参考电阻,通过测量Vin和Vmeasure即可反推Rin。但实际设计中需要考虑三个非理想因素:
- 信号源输出阻抗(约50Ω)
- 走线寄生电容(约3pF/cm)
- 运放输入偏置电流(nA级)
2.2 关键元件选型对比
运放选型是影响测量精度的关键。我们对比了两种方案:
OPA192:
- 输入偏置电流:±8pA
- 增益带宽积:10MHz
- 价格:$2.1(含税)
OPA690:
- 输入偏置电流:±2μA
- 增益带宽积:500MHz
- 价格:$3.8(含税)
虽然OPA690带宽更高,但其输入偏置电流会导致约0.5%的测量误差。最终选择OPA192作为缓冲级,实测在10kHz时相位偏移仅1.2°。
参考电阻取值也经过精心计算:
- 题目要求测量范围:1kΩ-50kΩ
- 几何中点:√(1k*50k)≈7.07kΩ
- 选用标准值6.8kΩ,理论误差分布最均衡
2.3 PCB布局技巧
四层板堆叠设计:
- Top层:信号走线(5mil线宽)
- 内层1:完整地平面
- 内层2:电源分割(数字/模拟)
- Bottom层:低速信号
特别注意:
- AD9959时钟线长度匹配在±50mil内
- ADS8688的REF引脚放置0.1μF+10μF去耦电容
- 模拟区域采用guard ring设计,漏电流降低至0.3nA
3. 软件驱动实现
3.1 AD9959寄存器配置流程
// 初始化序列 void AD9959_Init() { SPI_Write(0x00, 0x01); // 复位芯片 delay_ms(10); SPI_Write(0xAD, 0x03); // 设置PLL 4倍频 SPI_Write(0x9F, 0x1F); // 开启所有通道 SPI_Write(0xA0, 0x80); // 自动幅度控制 } // 设置频率 void SetFrequency(uint32_t freq) { uint32_t FTW = (freq * pow(2,32)) / SYSTEM_CLOCK; SPI_Write(0x04, (FTW >> 24) & 0xFF); // FTW高位 SPI_Write(0x05, (FTW >> 16) & 0xFF); SPI_Write(0x06, (FTW >> 8) & 0xFF); SPI_Write(0x07, FTW & 0xFF); // FTW低位 }提示:AD9959的SPI时序要求严格,时钟空闲状态必须为高电平,模式3。实测发现STM32的硬件SPI在18MHz以上会出现数据丢失,建议降频至12MHz使用。
3.2 ADS8688采集算法优化
采用过采样技术将有效分辨率提升至18位:
def read_ads8688(channel): raw_data = [] for i in range(64): # 64次采样 raw_data.append(spi_read(channel)) # 去除最大最小值后平均 filtered = sorted(raw_data)[2:-2] return sum(filtered) / len(filtered)实测信噪比(SNR)从原来的86dB提升到94dB,对应ENOB(有效位数)从14位提高到15.3位。
4. 实测问题与解决方案
4.1 频率切换时的瞬态响应
初期测试发现:当AD9959频率从1kHz跳变到10kHz时,输出会出现约20ms的振荡。解决方法:
- 在频率控制字更新前,先将幅度寄存器设为0
- 等待100μs后再更新频率
- 最后恢复幅度值
修改后瞬态过程缩短到200μs以内。
4.2 开关引入的测量误差
拨动开关在切换6.8kΩ电阻时,发现三极管电路的上限频率变化达15%。根本原因是:
- 开关触点电阻:约0.5Ω
- 寄生电感:约3nH
- 在10MHz时引入约0.2Ω的附加阻抗
优化方案:
- 改用磁保持继电器(如TQ2-5V)
- PCB布局时将开关靠近被测件
- 软件上增加10ms的稳定等待时间
4.3 温度漂移补偿
连续工作2小时后,测量结果会出现约1.2%的偏移。通过实验测得温度系数:
- AD9959输出幅度:-85ppm/°C
- 6.8kΩ电阻:±50ppm/°C
- OPA192偏置电压:0.2μV/°C
最终在软件中加入温度补偿算法:
float temp_compensate(float raw, float temp) { const float k1 = -0.00085; // AD9959系数 const float k2 = 0.0005; // 电阻系数 return raw * (1 + (k1 + k2) * (temp - 25)); }实施后,4小时连续工作的最大漂移降至0.3%以内。