ADS8584S SAR ADC过采样与转换中读取技术实战解析

发布时间:2026/7/24 15:04:35

ADS8584S SAR ADC过采样与转换中读取技术实战解析 1. 项目概述当高精度ADC遇上系统吞吐率瓶颈在电力自动化、工业控制或者精密测试测量领域我们这些搞硬件的工程师经常会遇到一个经典矛盾既要马儿跑高采样率、高吞吐率又要马儿不吃草高精度、低噪声。尤其是在做多通道同步数据采集比如电网的电压电流谐波分析时你需要在同一时刻“咔嚓”一下把四个通道的模拟量瞬间冻结并转换成数字量然后赶紧把数据读走为下一次转换腾出地方。这个过程慢了就会丢失高频信号细节精度不够谐波分析的结果就失去了意义。这时候像TI的ADS8584S这样的16位、4通道同步采样SAR ADC就成了很多人的选择。它集成了前端PGA、滤波器和基准源省去了不少外围电路设计的麻烦。但光有好的ADC芯片还不够如何把它“压榨”到极致让系统吞吐率达到理论最大值才是真正考验设计功底的地方。这里面的核心技巧就是官方手册里提到的两个“大招”过采样Oversampling和转换中读取Data Read During Conversion。前者是提升信噪比和有效位数的“静音器”后者则是拔高系统吞吐率的“加速器”。很多人可能只关注了其中一个但真正的高手懂得如何让它们协同工作在保证精度的前提下把数据流的速度推到芯片的极限。今天我就结合自己的实际调试经验把这两个技术的原理、实现细节和那些容易踩的坑掰开揉碎了讲清楚。2. 核心原理深度拆解为什么需要过采样与转换中读取在深入代码和时序之前我们必须先搞明白这两个技术到底解决了什么问题。这就像医生开药得先诊断清楚病症。2.1 过采样不只是“多采几次”那么简单很多人对过采样有个误解认为它就是单纯地提高采样频率。比如对一个50Hz的工频信号我用1kSPS采和用10kSPS采后者就是过采样。这个理解对了一半但不完整。过采样的核心目的是利用数字信号处理中的噪声整形和滤波来换取更高的分辨率或更好的动态性能。2.1.1 量化噪声的“摊薄”效应SAR ADC在转换时会产生固有的量化噪声。这个噪声的功率在直流到奈奎斯特频率Fs/2的带宽内是均匀分布的可以把它想象成一层均匀的“白噪声”铺满了整个频谱。假设ADC的采样率是Fs那么这层噪声的功率谱密度每赫兹的噪声功率就是固定的。 当我们把采样率提高到OSR * FsOSR是过采样倍数比如2、4、8...64时奈奎斯特频率也提高了OSR倍。量化噪声的总功率不变但它现在被“摊薄”到了一个更宽的频带上。因此在我们关心的信号带宽比如原来的Fs/2以内里噪声的功率谱密度就降低了。理论上每增加4倍的过采样率信噪比SNR能提升约6dB相当于增加了1个有效位ENOB。2.1.2 ADS8584S的过采样实现机制ADS8584S的过采样不是让你外部去提高CONVST信号的频率。恰恰相反它的转换时间tCONV会随着过采样率OSR的增加而线性增加。从手册的时序图可以看到OSR0即不过采样时转换时间典型值是2μsOSR2时是5μsOSR4时是11μs。 芯片内部实际上是在进行一次“超级转换”在单个转换周期内ADC内核以极高的内部频率进行多次采样然后通过一个集成的数字平均滤波器通常是一个移动平均或FIR滤波器将这些采样值合并最终输出一个结果。这个过程带来了两个直接好处降低白噪声随机噪声通过平均被抑制。抑制特定频带噪声集成的数字滤波器会形成一个低通响应进一步滤除信号带宽外的高频噪声和干扰。手册中的图78-83展示了不同OSR下的数字滤波器频率响应OSR越高通带越窄对高频的抑制越强。2.1.3 过采样的代价与选择天下没有免费的午餐。过采样提升性能的代价是更长的转换时间和更低的单通道最大吞吐率。例如在OSR64时转换时间可能长达数十微秒此时单通道的最大采样率会大幅下降。 因此选择OSR是一个权衡的艺术对静态或慢变信号如直流电压监测追求极致精度和稳定性可以选用较高的OSR如32或64大幅抑制噪声从手册的DC直方图图72-77可以看出OSR越高码值的分布Sigma值越集中。对动态信号如电力谐波分析需要保证足够的信号带宽。例如要分析20次谐波60Hz系统下为1200Hz根据奈奎斯特定理采样率至少需大于2400SPS。此时你需要选择一个OSR使得在满足这个采样率的前提下还能提供足够的噪声抑制。通常OSR2或4是兼顾带宽和性能的常见起点。2.2 转换中读取榨干每一微秒的潜力这是提升系统级吞吐率的关键技术也是很多新手容易忽略或误用的地方。我们来看一个典型的ADC读取流程控制器拉低CONVST信号启动ADC转换。ADC拉高BUSY信号开始内部转换。控制器等待BUSY变低转换完成。BUSY变低后控制器通过并行或串行接口读取数据。读取完成后才能启动下一次转换。问题出在第3步和第4步。转换时间tCONV和读取时间tREAD是串行的。系统吞吐率的瓶颈就是1 / (tCONV tREAD)。对于16位并行接口读取可能很快几十到一百多纳秒但对于串行接口或当控制器繁忙时读取时间可能长达几微秒这就严重拖累了整体速度。2.2.1 “偷时间”的艺术ADS8584S的“转换中读取”模式允许你在BUSY信号为高电平即ADC正在转换期间去读取上一次转换的结果。这相当于把“读取时间”这个动作巧妙地“塞进”了“转换时间”这个空档里。 从时序上看过程变成了这样启动第一次转换CONVST下降沿BUSY变高。在BUSY为高期间无需等待直接发起对**上一次转换结果可能是初始值或无效值**的读取操作。注意此时读到的不是正在进行的这次转换的数据。第一次转换结束BUSY变低。在BUSY的下降沿新的转换结果被锁存到输出数据寄存器。几乎在BUSY变低的同时满足建立时间tSU_CSBSY后可以立即启动第二次转换CONVST下降沿BUSY再次变高。在第二次转换期间读取第一次转换的结果。 如此循环往复。你会发现读取操作完全被转换时间所覆盖。理想情况下系统的吞吐率仅受限于转换时间tCONV达到了理论最大值1 / tCONV。2.2.2 关键时序与“雷区”这个模式用好了是神器用错了就会导致数据错乱。手册里强调了一个至关重要的时序参数tDZ_CSBSY。是什么tDZ_CSBSY指的是CS信号上升沿到BUSY信号下降沿之间的最小延迟。为什么关键在BUSY下降沿的时刻ADC内部会更新输出数据寄存器将刚转换完成的新数据写入。如果在这个更新发生的瞬间你的读取操作CS为低正在进行读操作还没有结束就可能会干扰寄存器的更新过程导致数据损坏。这就像别人在往记事本上写字的时候你强行去翻页很可能把字迹弄花。怎么做因此你必须确保在BUSY下降沿到来之前当前的读操作已经完全结束CS已拉高并且CS保持高电平的时间至少满足tSU_CSBSY的要求。这通常意味着你的控制器需要在BUSY下降沿之前的某个时间点就完成读取并释放总线。3. 硬件设计与配置要点理解了原理我们来看看如何在实际电路和配置中实现它。这里有很多细节决定了系统的稳定性和性能上限。3.1 过采样模式OSR的硬件配置ADS8584S的过采样率是通过硬件引脚OS[2:0]来配置的。这是一个非常关键的设计点因为它决定了芯片上电或复位后的初始工作模式。3.1.1 配置引脚连接方案OS[2:0]是三个数字输入引脚它们的状态在每次BUSY信号的下降沿被锁存并用于配置下一个转换周期的OSR。这意味着你可以在运行时动态改变OSR但改变后的设置需要等到下一次转换启动后才生效。 常见的配置方法有固定配置对于确定的应用可以直接通过上拉或下拉电阻连接到DVDD或DGND来设置。例如OS[2:0] 000b 表示OSR0不过采样001b表示OSR2以此类推。务必参考手册的真值表。动态配置如果需要切换OSR可以将这些引脚连接到控制器的GPIO。在需要改变采样率时先设置好GPIO电平然后在一次转换完成后、下一次CONVST触发前确保GPIO电平已经稳定。由于锁存发生在BUSY下降沿所以这个时机是安全的。注意OS[2:0]引脚是数字输入但其电平应以DVDD为参考。确保上拉/下拉电阻的阻值选择合适如4.7kΩ~10kΩ避免过大的电流。3.1.2 输入前端滤波器的重新计算当启用过采样时芯片内部的数字滤波器会发挥作用。为了充分发挥其效果并防止混叠外部模拟输入端的抗混叠滤波器RC低通也需要相应调整。原则外部滤波器的-3dB截止频率应略高于你关心的信号最高频率如20次谐波频率但同时应远低于有效采样频率的一半。这里的“有效采样频率”不是最终的输出数据率而是内部过采样频率。举例假设信号最高频率为1.26kHzOSR4。内部采样频率提高了但外部RC滤波器的截止频率主要仍需针对1.26kHz来设计以防止实际环境中的高频干扰在过采样前混叠到低频。手册图85的平衡RC滤波器如4.3kΩ 4.3kΩ 和 5.6nF是一个经典设计其截止频率约为f_c 1 / (2π * R * C) 1 / (2 * 3.14 * 4300 * 5.6e-9) ≈ 6.6kHz。这个频率远高于1.26kHz保证了信号无衰减通过又能有效抑制MHz级别的高频噪声。3.2 实现转换中读取的接口设计ADS8584S支持并行、并行字节和串行三种接口模式转换中读取模式在三种接口下均可使用。这里以最常用的16位并行接口为例讲解硬件连接和操作要点。3.2.1 控制信号连接CONVSTA, CONVSTB在过采样模式下这两个引脚必须短接在一起由同一个控制器引脚驱动。因为过采样需要所有通道同步启动转换。BUSY这是一个开漏输出引脚必须接一个上拉电阻通常4.7kΩ~10kΩ到DVDD。控制器将其作为输入监测转换状态。CS片选信号低电平有效。在并行接口下它用于开启数据总线输出。RD读信号低电平有效。与CS配合读取数据。DB[15:0]16位并行数据总线。连接到控制器的数据总线或GPIO端口。3.2.2 电源与去耦性能的基石无论采用何种高级模式干净的电源都是ADC性能的底线。ADS8584S有独立的AVDD模拟电源4.75V-5.25V和DVDD数字电源2.3V至AVDD。AVDD去耦手册强调每个AVDD引脚共有4个都必须就近连接一个1μF的X7R陶瓷电容到AGND。这至关重要因为SAR ADC在转换期间会从电源吸入瞬态电流良好的去耦能为这些电流提供本地“蓄水池”防止电源网络上的毛刺影响转换精度。布局上电容必须尽可能靠近芯片引脚。DVDD去耦至少需要一个1μF的陶瓷电容就近去耦。参考电压去耦如果使用内部基准REFCAPA、REFCAPB和REFIN/REFOUT引脚都需要按照手册要求连接10μF电容。这些电容的布局同样关键应直接放在芯片引脚旁中间不要过孔以最小化寄生电感。3.3 基准源的选择与滤波基准电压的噪声和温漂直接叠加在ADC的转换结果上。ADS8584S内部集成了一个不错的基准但对于超高精度应用可以考虑使用外部基准如手册推荐的REF5025。外部基准电路如图86所示在基准芯片输出后建议增加一个由RFILT和CFILT组成的RC低通滤波器。这个滤波器可以滤除基准芯片输出的宽带噪声。例如选择RFILT10ΩCFILT10μF其截止频率约为1.6kHz能有效滤除高频噪声而对直流或低频的基准电压影响极小。REFSEL引脚此引脚用于选择内部或外部基准。硬件上需要正确连接。4. 软件驱动与时序控制实战硬件搭好了接下来就是通过软件通常是FPGA或MCU的固件来精确控制时序实现过采样和转换中读取。这里以一款通用ARM Cortex-M系列MCU为例假设使用GPIO模拟并行接口。4.1 初始化配置流程// 引脚定义 #define PIN_CONVST GPIO_PIN_0 #define PIN_BUSY GPIO_PIN_1 #define PIN_CS GPIO_PIN_2 #define PIN_RD GPIO_PIN_3 #define DATA_PORT GPIOB // 假设DB[15:0]连接在GPIOB上 // 初始化函数 void ADS8584S_Init(void) { // 1. 配置OS[2:0]引脚假设连接在GPIOC的0,1,2脚 // 根据需要的OSR设置电平例如OSR4 (010b) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); // OS0 0 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET); // OS1 1 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET); // OS2 0 // 2. 配置控制引脚为输出CONVST, CS, RD // 3. 配置BUSY引脚为输入上拉 // 4. 配置数据端口为输入读取时或高阻不读时 // 5. 确保CS和RD初始状态为高不选中不读 HAL_GPIO_WritePin(GPIOA, PIN_CS, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, PIN_RD, GPIO_PIN_SET); // 6. 给一个复位脉冲如果硬件有RESET引脚或等待足够的上电稳定时间 // 7. 首次启动转换前可能需要先进行一次“哑”读取以清空可能存在的旧数据 }4.2 实现转换中读取的核心代码逻辑这是整个驱动的精华部分必须严格遵循时序。我们采用状态机或中断的方式来实现。// 状态机变量 volatile uint32_t adc_raw_values[4]; // 存储四个通道的结果 volatile uint8_t current_channel 0; volatile enum {ADC_IDLE, ADC_CONVERTING, ADC_READING} adc_state ADC_IDLE; // 启动一次转换所有通道同步 void ADS8584S_StartConversion(void) { HAL_GPIO_WritePin(GPIOA, PIN_CONVST, GPIO_PIN_RESET); // CONVST 下降沿 // 保持低电平至少需要满足 t_CONVST_LOW 时间通常很短几十纳秒即可 delay_ns(50); // 根据具体MCU速度调整或使用NOP指令 HAL_GPIO_WritePin(GPIOA, PIN_CONVST, GPIO_PIN_SET); // CONVST 上升沿 // 此后ADS8584S会拉高BUSY开始转换 adc_state ADC_CONVERTING; } // 在BUSY为高期间读取数据的函数 // 此函数应在检测到BUSY变高后尽快被调用 void ADS8584S_ReadDuringConversion(void) { if(adc_state ! ADC_CONVERTING) { return; // 状态保护 } // 1. 拉低CS选中芯片 HAL_GPIO_WritePin(GPIOA, PIN_CS, GPIO_PIN_RESET); // 需要满足 t_CS_SU 时间通常很短 delay_ns(10); // 2. 拉低RD开始读数据 HAL_GPIO_WritePin(GPIOA, PIN_RD, GPIO_PIN_RESET); // 需要满足数据访问时间 t_RD_ACCESS delay_ns(30); // 等待数据稳定在总线上 // 3. 从数据端口读取数据假设按通道顺序读取通过地址线A0,A1选择此处简化 // 注意此时读取的是上一次转换的结果 for(int ch 0; ch 4; ch) { // 模拟通过地址线选择通道实际ADS8584S并行模式可能需配合A0,A1 // 此处简化假设连续读4次得到4个通道数据 adc_raw_values[ch] DATA_PORT-IDR 0xFFFF; // 读取16位数据 // 如果需要切换通道地址在此操作 } // 4. 拉高RD结束读周期 HAL_GPIO_WritePin(GPIOA, PIN_RD, GPIO_PIN_SET); // 需要满足 t_RD_HIGH 时间 delay_ns(10); // 5. 拉高CS释放总线 HAL_GPIO_WritePin(GPIOA, PIN_CS, GPIO_PIN_SET); // 关键必须确保在BUSY下降沿到来之前CS已经保持高电平至少 t_SU_CSBSY 时间。 // 这个时间通常需要几十纳秒。最安全的做法是一旦读取完成立即拉高CS不要拖延。 adc_state ADC_READING; // 标记读取完成等待转换结束 } // BUSY引脚下降沿中断服务程序或轮询检测 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin PIN_BUSY_PIN) { if(HAL_GPIO_ReadPin(GPIOA, PIN_BUSY) GPIO_PIN_RESET) { // BUSY下降沿转换完成 if(adc_state ADC_READING) { // 此时adc_raw_values[]中存储的是刚刚完成的那次转换的数据 // 可以进行数据处理... process_adc_data(adc_raw_values); // 立即启动下一次转换以最大化吞吐率 ADS8584S_StartConversion(); // 状态机复位等待下一次BUSY变高后再次调用ReadDuringConversion adc_state ADC_CONVERTING; } else { // 错误处理在BUSY下降沿时上一次的数据还未读取完。 // 这可能是因为读取操作太慢未能在t_SU_CSBSY前释放CS。 handle_error(); } } else { // BUSY上升沿转换开始 // 可以在此处或稍后延迟一点调用 ReadDuringConversion // 但注意刚上电第一次转换时读取的是无效数据可能需要丢弃 } } }4.2.1 时序把控的精髓上面的代码框架揭示了几个关键点读取时机在BUSY变高转换开始后应尽快启动读取操作。理论上在BUSY为高的任何时间读取都是安全的但尽早读取可以为后续操作留出更多时间裕量。CS释放时机这是最容易出错的地方。CS必须在BUSY下降沿之前的t_SU_CSBSY时间查手册典型值几十纳秒就变为高电平并保持。因此读取操作必须足够快并且在读取完成后立即拉高CS绝不能等到BUSY快变低了才行动。首次转换处理系统上电或复位后第一次转换期间读取操作得到的是寄存器中的随机值或默认值。通常的做法是启动第一次转换后在BUSY高期间不进行读取或者读取后丢弃该数据。从第二次转换开始再启用“转换中读取”流程。4.3 吞吐率计算与优化假设我们设置OSR4从手册查得tCONV约为11μs。传统模式转换后读取假设读取4个通道数据需要2μs。则总周期为 11μs 2μs 13μs。单通道吞吐率约为 1 / 13μs ≈ 76.9kSPS。但这是对单个通道而言因为是同步采样四个通道同时完成所以系统整体数据产出率是76.9kSPS per channel。转换中读取模式读取时间被隐藏。总周期近似等于tCONV 11μs。单通道吞吐率提升至 1 / 11μs ≈ 90.9kSPS。吞吐率提升了约18%。在OSR更高、转换时间更长或者控制器读取较慢的情况下提升效果会更加显著。优化建议使用DMA直接存储器访问来搬运ADC数据进一步解放CPU减少读取操作的时间抖动。如果使用FPGA可以设计一个精准的状态机用计数器严格满足所有建立保持时间实现最优控制。将BUSY信号连接到控制器的外部中断引脚或定时器输入捕获引脚实现精准的事件触发避免轮询带来的延迟和不确定性。5. 常见问题、调试技巧与实测心得理论很美好但调试过程总是会遇到各种问题。下面是我在多个项目中总结的一些“坑”和解决方法。5.1 数据错乱或读数全为0症状读取的数据随机变化或者固定为0x0000或0xFFFF。排查思路电源与基准首先用示波器测量AVDD、DVDD和基准电压REFIN/REFOUT是否稳定、无毛刺。基准电压必须是精确的2.5V吗对于ADS8584S内部基准典型值就是2.5V外部基准也需匹配。电压不准会导致增益误差。控制信号时序这是最常见的问题。使用示波器同时抓取CONVST、BUSY、CS、RD和一条数据线如DB15的波形。检查CONVST脉冲宽度是否满足最小值要求是否在BUSY为高时又发出了新的CONVST这会被忽略。检查CS和BUSY的关系重点看BUSY下降沿附近。CS是否在t_SU_CSBSY之前就变高并保持如果CS在BUSY下降沿时还为低数据极有可能损坏。示波器要放大看这个边沿。数据总线冲突确保在非读取时段控制器连接数据总线的引脚设置为高阻输入模式。如果控制器输出和ADC输出冲突会导致电流过大、电平异常甚至损坏IO口。过采样配置引脚确认OS[2:0]的上拉/下拉电阻焊接牢固电平符合预期。用万用表测量引脚电压。5.2 噪声性能未达预期症状即使使用了高OSRADC输出的噪声仍然很大或者SNR测试结果远低于手册值。排查思路模拟输入滤波检查前端RC滤波器。电阻电容的精度和类型很重要。优先使用C0G/NP0材质的电容其容值随温度、电压变化小。薄膜电阻也是好选择。确保差分输入路径上的电阻对称。接地与布局这是高频、高精度电路的“命门”。单点接地强烈推荐使用单一的、完整的接地平面。将模拟地AGND和数字地DGND在芯片下方通过最短路径连接在一起。避免形成地环路。电源去耦检查那4个1μF的AVDD去耦电容是否真的“就近”放置。电容的接地端到芯片AGND引脚的回路要尽可能短而粗。可以用示波器探头尖和接地弹簧在AVDD引脚上测量高频噪声。敏感走线模拟输入线要远离数字线尤其是时钟、SPI、并行总线。如果必须交叉请垂直交叉。在模拟输入线周围铺铜并接地可以提供屏蔽。参考源噪声如果使用内部基准确保REFCAPA/B和REFIN/REFOUT的10μF电容已正确安装且质量良好低ESR的X7R或X5R陶瓷电容。如果问题依旧可以尝试切换到外部超低噪声基准如REF5025并配上RC滤波看是否有改善。信号源本身你的测试信号源足够干净吗可以用一个干净的电池或基准电压源产生一个直流信号测试其直方图分布。如果此时噪声仍然大问题就在板子上如果噪声变小问题可能来自前级信号调理电路。5.3 吞吐率达不到理论值症状即使使用了转换中读取实际测得的采样率仍然低于1 / tCONV。排查思路软件开销计算一下你的中断服务程序、数据处理和存储代码的执行时间。这些操作如果放在转换间隙BUSY为低的时间进行而这个时间很短例如OSR0时只有2μs那么MCU可能来不及在下一个CONVST触发前完成所有任务。解决方法将耗时操作移到后台或者使用双缓冲区DMA乒乓缓冲确保数据搬运不占用核心转换周期。CONVST脉冲间隔用示波器测量连续两个CONVST下降沿之间的时间。这个时间必须大于等于tCONV。如果你设置的时间间隔小于tCONVADC会忽略后来的触发导致实际采样率下降。BUSY高电平时间实测BUSY高电平时间是否与手册中对应OSR的tCONV一致如果显著偏长可能是电源不稳或负载过重导致转换速度变慢。5.4 通道间串扰或增益失配症状当一个通道输入满量程信号时其他通道的读数会有微小变化。排查思路同步采样优势ADS8584S是同步采样ADC四个通道的采样保持器在同一时刻CONVST下降沿捕获信号理论上串扰很小。问题可能出在外部。前端电路隔离检查每个通道的输入RC滤波器是否独立运放输出如果有是否相互独立共用的电源是否退耦良好PCB布局四个通道的模拟输入走线是否彼此平行且靠得太近应尽量分开或用地线隔离。个人实操心得 调试这类高性能ADC一台带宽足够的示波器至少200MHz和一套好的探头包括接地弹簧是必不可少的。不要只看逻辑分析仪的结果模拟域的微小毛刺才是精度的杀手。在焊接完板子后我习惯先不焊ADC芯片用万用表和示波器把所有的电源、地、基准电压网络都检查一遍确保没有短路、开路电压值正确。焊上芯片后先配置在最简单的模式OSR0不使用转换中读取用直流信号验证基本功能。然后再一步步启用高级功能。每次只改变一个变量并记录下性能的变化。最后关于转换中读取的时序我建议先用一个较慢的、保守的时序让它跑起来然后再逐步收紧时间参数直到逼近手册给出的最小值同时用示波器严密监控CS和BUSY下降沿的关系找到稳定工作的极限点并留出至少20%的时序裕量。

相关新闻