几年前,我需要一个快速、低频而又失真极低的源来测试板载微控制器(MCU) ADC,看它是否具有数据手册中所说的有效位数(ENOB)和线性度。
我知道Linear(现ADI)有失真度非常低的设计[1],但它有些复杂,并且对我的即时需求来说,这似乎有点过分了。因此,我基于Hein van den Heuvel[2]的电路构建了一个经典的三运算放大器状态可变振荡器,并采用一个小麦粒灯泡作为振幅稳定电路。
经过一天摆弄电路中运算放大器各级的负载后,我设法将谐波失真产物降低到-95dBc水平以下,这足以满足我的即时需求。
虽然可以构建分立式振荡器电路,但它很繁琐。这存在温度问题,例如振幅漂移、频率漂移、启动和稳定时间等。同样,我认为将来最好有一个具有多个2.5到±10V输出的快速设置振荡器,这样我就可以以16位精度快速测量任何ADC。
模拟方法绝不能实现快速设置,这让我开始思考专业音频分析仪如何实现它们的源。我认为,它们必须要构建精密的分立式DDS,或者使用一种高分辨率I2S音频DAC。
然后我浏览了TI应用笔记,了解了他们对超低失真测试振荡器的看法,果然,其中使用了他们的Burr-Brown I2S音频DAC之一,并在其后跟了一些高性能低通滤波器[3]。
我买了几个I2S DAC并将它们连接到我的一个MCU演示板上,大约一天后就开始让I2S运行,并发现有一些不错的信号从该设置中跑了出来。I2S的妙处在于它可以连接到处理器的DMA,从而使99%的数据传输对处理器透明。处理器所要做的就是每隔一段时间保持DMA管道充满。
这只是一次学习经历,在经济上没有优势,因为TI的电路售价要低于300美元,但是没有已发布的API可用于从我们自己的测试方案中控制其解决方案。
然后我想了下:“USB声卡适配器(dongle)怎么样?它们用起来一定很不错而且很便宜。”
我通过快速搜索了解到,Creative Labs确实制造了一种成本非常低但性能很高的16/24位USB适配器,它的名称令人印象深刻,叫做“Creative Labs Sound Blaster Play! 3”。这款不到20美元的设备甚至具有24位/96kHz数据速率[4]。我相信Creative Labs不会制造垃圾,所以我买了一个试试。
使用我的18位FFT分析仪进行的初步测试[5]表明,笔记本电脑不仅“听起来”更适合我的耳朵,而且性能确实达到了16位失真水平,并具有非常干净的本底噪声。
这种方法确实能成为我的通用ADC测试台的“快速设置”解决方案,因为所有软件都可以在我的实验室PC上运行。现在我就能拥有一个在频率和振幅方面“可控”的源,并且它在我的PC上运行,这样我就可以拥有独立的应用,甚至可以构建API,以在以后需要时将它包含到自动测试套件中。
很多工作就在此解决了,通过使用外部声卡,可以将精确的振幅和已知的质量在任何测试台之间转移,因为我的测试笔记本电脑内部声卡在输出振幅和真实音质上各处都不同。
使用笔记本电脑作为测试控制器的另一个好处是,可以拔出电源适配器并使用电池运行,从而消除了很多地回路问题——这些问题在尝试快速移动并完成工作时总是会突然出现。
现在所需的所有项目是Sound Blaster适配器的模拟接口板,以获得我的“通用”测试设置所需的输出。
我测量了Sound Blaster到指定300Ω耳机负载的音频输出,在一些测试音调和全量程输出的情况下,我测量到一致的0.37V峰值,这与我所使用的PC或操作系统无关。
表1列出了常用的ADC输入范围。我想如果我涵盖了常见的ADC输入范围,则可以通过使用音量控制调整振幅来测量介于两者之间的任何内容,这最终有可能降低可实现的信噪比(SNR),但Sound Blaster的SNR对于我要测量的应用绰绰有余。
表1:这些范围几乎涵盖了我在过去10年中所遇到的所有ADC输入。该表用作确定放大器在Sound Blaster适配器输出端所需增益和偏移量的基础。
3.3V的峰值范围是个“怪胎”,但仍然出现在较低分辨率的基本设计中——无论如何其大多数都是10位或12位ADC,因此我决定对这些应用只使用音量控制和0-5V范围,这样信噪比损失就很小。
然后我设计了所谓的“BlasterAmp”,它具有所需的增益和偏移,能够转换0.37V峰值,即Sound Blaster适配器的满量程输出,以匹配表2。
表2:设计BlasterAmp是为了覆盖表1中的常见电压,它仅具有4个增益步长和3个偏移量设置。单极性范围需要使用3个偏移电压。
关于单极性范围需要注意的一件事是:它们现在总是“轨到轨”的,而当我们说“轨到轨”时,几乎总是与“轨”有一定偏移量。这将对任何ADC/缓冲器测试造成严重破坏,因为如果“轨”不完全处于零或满刻度状态,则ADC就会削波,这就会导致严重失真,从而阻止进行任何有意义的测量。此外,有时ADC参考电压为2.048或4.096V,而不是2.5和5V。为了解决这些情况,我使用了数个25圈精密微调电位器,以便在需要时对增益和偏移量进行微调。微调电位器还支持Sound Blaster适配器、电阻容差和运算放大器偏移电压存在任何细微差异。
图1显示了所完成的BlasterAmp的一个通道。短接跳线用于支持根据需要更改偏移量和增益,以适应各种所需的输出范围。
图1:立体声BlasterAmp的一个通道。增益和偏移电压范围可通过可移动跳线设置,然后借助25圈精密微调电位器进行微调。U101周围的电阻网络是一个来自Vishay的1kΩ匹配网络(OSOPTC1001AT0)。所有其他电阻器均为0.1%、0805尺寸,以最大限度地减少电阻器发热和随后的失真。C100和C101必须是薄膜或COG陶瓷类型以消除失真。
对于放大器,我使用了久经考验的Burr-Brown OPA1611,这是一款超低失真音频运算放大器,它们的性能与数据手册相符,可以说非常出色。
对于偏移参考电压,我使用了TI REF5050,这是一款5V精密参考电压。
由于我期望将该电路在我的工作台上用于测试设置,我将其设计为由±15V电源轨供电,并使用了另一个久经考验的器件,即我在我工作台上保留的用于这种情况的HP6234A双线性电源。使用像HP6234A这样的线性电源非常有用,因为它具有低噪声、低IO电容设计,而且它不会像从开关电源那样到处喷出共模电流。如果我必须使用开关电源为设计供电,我会在电路中使用一些线性、低压降稳压器和强大的共模扼流圈,以尽我所能将开关噪声远离电路板。值得信赖的HP6234A消除了所有这些问题。
我将最终的双通道BlasterAmp PCB放置在一个小型Hammond外壳中[6],我没有盖上盖子,因为这样可以轻松更换各种跳线和调整电位器(图2)。
图2:所完成的BlasterAmp。我将PCB安装在挤压外壳中以提供保护。来自声卡的音频是PCB右上角的黑色电缆。我的HP6234A线性台式电源通过PCB右中部的电线连接器供电。完整的设计已经提供,请参阅参考文献10。
使用Sound Blaster适配器无疑大大简化了设计并节省了开发时间,但我仍然需要一种方法来将高动态范围测试信号送入到Sound Blaster中进行播放。我尝试了十来个音频测试音软件解决方案,其中大部分都只有60dBc的失真级别或更低,这对于听力测试来说还不错,但对我的应用来说不太好,我需要将失真降低到16位级别。
互联网上有几个音响爱好者网站提供了非常低失真的测试文件[7]。要想回放,就需要一个WAV或MP3文件播放器,并且它需要在循环时死区时间为零。我发现“foobar2000”这个程序虽然名字起得傻傻的但却是个很好的选择[8]。我最初在旅行时使用该程序在我的笔记本电脑上播放过白噪声以在尝试睡觉时淹没无关的声音,并且在循环播放白噪声文件时也不会听到有任何咔哒声或爆裂声,否则就会立即醒来。foobar2000程序非常适合BlasterAmp和睡眠。
这些预制测试文件具有固定频率,但可以根据需要通过BlasterAmp微调电位器或PC的音量控制对振幅进行微调。
至于能够以编程方式设置频率和音量,我找到了一个名为PyAudio的Python库[9],它支持我生成给定幅度的精确正弦波信号,然后能够直接从Python脚本播放它[10]。事实证明,这会产生非常低的失真信号,如图3所示。
图3:BlasterAmp在我的DMT9000 FFT分析仪上所测得的±10V范围的结果[5]。可以看到满量程失真产物处于低于满量程-96dBc的16位级别。
然而,在生成任何测试音时必须小心。我们要么必须制作一个连续且足够长的文件来进行测试,要么必须连续循环。循环时,只需确保波形的起点和终点完全对齐,否则会出现不连续性,从而在循环点处增加失真。
作为使用Sound Blaster适配器进行精确音调生成的最后一点注意事项,请务必关闭所正在播放声音生成的PC上的所有音频均衡器或控制程序,以确保不会出现不可预见的问题。
在下一篇文章中,我将展示使用BlasterAmp测量一些实际ADC和测试器件失真的技术。
Python脚本的完整源代码和BlasterAmp的完整原理图可以在Github上找到[10]。
[1] Jim Williams, Guy Hoover, “Fidelity Testing for A→D Converters”, Linear Technology AN132:https://www.analog.com/media/en/technical-documentation/application-notes/an132f.pdfhttps://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/dc1858a.html
[2] Hein van den Heuvel, “Reference Sine Wave Generator”, Elektor Post, Project No. 53 – https://www.elektormagazine.com/index.php/files/attachment/326
[3] Precision Signal Injector (PSI) Evaluation Module for Testing ADC Performance, Texas Instruments – https://www.ti.com/tool/PSIEVM
[4] Creative Labs Sound Blaster Play! 3 – https://us.creative.com/p/sound-blaster/sound-blaster-play-3
[5] A future design article will detail my DMT9000 18 Bit FFT Analyzer Instrument.
[6] Hammond Manufacturing, Extruded Enclosures – https://www.hammfg.com/electronics/small-case/extruded/1455
[7] These test tones are of good quality:https://www.mediacollege.com/audio/tone/download/https://www.audiocheck.net/testtones_thd.php
[8] “foobar2000” looping audio playback program – https://www.foobar2000.org/download
[9] The PyAudio installer is broken as of May 2022, a fixed version can be downloaded from – https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio
[10] The complete BlasterAmp design and the Python Scripts can be found at – https://github.com/Hagtronics/BlasterAmp
——Steve Hageman从五年级开始就被证实是位“模拟狂(Analog-Crazy)”。他有幸设计了运算放大器、开关电源、千兆赫兹采样示波器、锁定放大器、无线电接收机、50GHz射频电路和数字无线产品测试设备。Steve知道,所有的现代设计都不能用R、L和C来完成,所以他涉足了PC和嵌入式系统的编程,从而就足以完成这项工作。
(原文刊登于EDN美国版,参考链接:Simplify testing of embedded analog-to-digital converters,由Franklin Zhao编译。)
本文为《电子技术设计》2023年1月刊杂志文章,版权所有,禁止转载。免费杂志订阅申请点击这里。