Tiva™ ADC高级功能实战:硬件采样平均、差分采样与数字比较器详解
1. 项目概述从“能用”到“好用”的ADC进阶之路在嵌入式系统开发尤其是涉及传感器信号采集、电池电压监控或精密仪器测量的项目中模数转换器ADC的性能往往是决定系统精度和可靠性的关键瓶颈。很多开发者包括我自己在早期项目里常常满足于让ADC“跑起来”——配置一个通道触发采样然后读取FIFO里的数据。这确实能工作但当你需要处理微弱的传感器信号、抑制工频干扰或者需要系统在无人值守时自动判断某个信号是否超限时就会发现基础的单次采样模式力不从心。这时深入挖掘ADC模块的高级功能就成了从“功能实现”迈向“性能优化”和“系统智能化”的必经之路。Tiva™ C系列微控制器以TM4C123GH6ZRB为代表内置的ADC模块其强大之处远不止于一个12位的逐次逼近寄存器SAR转换器。它集成了硬件采样平均、差分采样、内部温度传感器以及数字比较器等高级特性。这些功能并非摆设而是TI工程师为应对真实世界复杂模拟信号处理需求而设计的实用工具。硬件采样平均能有效提升信噪比让你在嘈杂的电气环境中依然能捕捉到稳定的信号差分采样则能直接测量两个点的电势差完美适配电桥式传感器如应变片、压力传感器而数字比较器更像一个内置的“硬件看门狗”能自动监控信号范围无需CPU频繁轮询极大节省了系统开销并提升了响应实时性。本文将结合我多年在工业数据采集设备上的实战经验为你深入解析Tiva™ ADC的这几项核心高级功能。我不会仅仅复述数据手册的寄存器描述而是会重点拆解“为什么需要这些功能”、“如何配置它们”以及“在实际项目中可能踩到哪些坑”。无论你是正在调试一个高精度电子秤还是设计一个需要监控多路电池电压的储能系统相信这些内容都能为你提供直接的参考和启发。2. 硬件采样平均用速度换取精度的艺术在嵌入式信号采集中噪声是无处不在的敌人。这些噪声可能来自电源纹波、数字电路的开关噪声、甚至空间电磁干扰。它们叠加在我们的目标模拟信号上导致单次ADC转换结果存在随机波动。硬件采样平均Hardware Oversampling Averaging就是一种经典的、在硬件层面实施的“以量换质”策略。2.1 核心原理与吞吐率权衡Tiva™ ADC的硬件采样平均电路其本质是一个内置的累加器和除法器。当使能该功能后ADC模块会在一次“逻辑采样”触发下连续进行多次例如4次、8次、16次等物理转换然后将这些转换结果进行算术平均最终将这一个平均值存入采样序列发生器的FIFO中。这个过程完全由硬件自动完成对软件透明。其核心控制寄存器是ADCSAC。该寄存器的SAC字段Bits 2:0决定了过采样和平均的倍数可选值从1x即关闭平均到64x。例如设置为0x2代表4x过采样即连续进行4次转换并取平均。这里存在一个至关重要的权衡精度与速度的互换。假设ADC模块的原始转换速率是1Msps每秒百万次采样。当你启用4x硬件平均后由于一次“有效采样”需要完成4次物理转换那么数据存入FIFO的速率即有效吞吐率将下降为原来的1/4即250ksps。如果启用16x平均吞吐率则降至62.5ksps。这个关系是线性的吞吐率 原始转换速率 / 平均次数。注意这里的“原始转换速率”受限于ADC时钟频率和采样保持时间。在TM4C123上ADC时钟最高为16MHz完成一次12位转换需要多个ADC时钟周期。实际最大采样率需查阅数据手册电气特性章节通常远低于时钟频率。那么精度提升了多少从理论上看对N个独立且含有高斯白噪声的采样值进行平均可以将信噪比SNR提升10*log10(N) dB。例如4x平均可提升约6dB相当于噪声有效值减半64x平均可提升约18dB。在实际项目中这对于提取被噪声淹没的微弱直流或低频信号非常有效。2.2 配置实战与寄存器详解配置硬件采样平均非常简单通常只需在ADC初始化流程中配置完采样序列后对ADCSAC寄存器进行一次写操作。// 假设使用ADC0模块 // 步骤1: 启用ADC0时钟略 // 步骤2: 配置GPIO为模拟输入略 // 步骤3: 配置采样序列发生器例如序列发生器0单次采样软件触发略 // 步骤4: 配置硬件采样平均为4倍过采样 HWREG(ADC0_BASE ADC_O_SAC) 0x2; // SAC 0x2 对应 4x 硬件平均 // 步骤5: 使能采样序列发生器并开始采样略关键点在于理解ADCSAC寄存器的行为全局性每个ADC模块ADC0, ADC1只有一个硬件平均电路。这意味着该模块下所有使能的采样序列发生器SS0, SS1, SS2, SS3共享这个平均设置。你不能为序列0设置4x平均同时为序列1设置8x平均。这是一个重要的设计约束在规划多通道、不同精度需求的采样任务时需要统筹考虑。与FIFO的关系平均后的结果作为一个数据占用FIFO的一个单元。无论你设置了多少倍平均FIFO的深度例如序列发生器0的FIFO深度为8指的是平均后数据的存储深度而非原始采样次数。中断时机如图13-6所示当平均计算完成数据被存入FIFO后如果配置了相应的中断使能位如ADCIM寄存器中的IE1位对应FIFO半满或第一个数据进入等条件中断才会产生。中断标志对应的是“平均后的数据就绪”而不是“某一次原始转换完成”。2.3 实战心得与避坑指南适用场景判断硬件平均最适合处理低频或直流信号。对于高频信号平均操作可能会平滑掉信号本身的快速变化导致波形失真。在需要捕捉信号细节如音频、振动波形的应用中应慎用或仅使用较低的过采样倍数如2x, 4x。吞吐率计算与系统设计务必根据你的系统需求反向计算可用的平均倍数。例如你需要以10kHz的速率监控4路信号采用轮询扫描模式。如果ADC原始最大采样率为500ksps分配到每路信号的理论最大采样率为125ksps。若你想对每路信号进行16x平均以获得更好的稳定性那么每路有效采样率将降至7.8ksps无法满足10kHz的总需求。此时可能需要降低平均倍数或采用更高性能的MCU。电源与参考电压稳定性硬件平均主要抑制随机噪声。如果噪声来源于电源或参考电压的缓慢漂移低频噪声平均的效果会大打折扣。确保模拟电源VDDA, GNDA和参考电压VREFA VREFA-干净、稳定是发挥平均功能效用的前提。在PCB布局时务必遵循数据手册的指导使用独立的模拟电源走线并添加足够的去耦电容。初始化顺序建议在禁用采样序列发生器ADCACTSS寄存器对应ASENn位清零的情况下配置ADCSAC寄存器。这样可以避免在配置过程中ADC可能正在执行平均操作而导致不可预知的行为。配置完成后再使能序列发生器。3. 差分采样直接测量“差值”的利器在很多传感器应用中我们关心的并非某个引脚对地的绝对电压而是两个点之间的电压差。典型的例子是惠斯通电桥输出的差分信号或者电流采样电阻两端的压降。使用两个独立的ADC通道进行单端采样然后在软件中相减是一种方法但存在两个问题一是两个通道的采样存在时间差对于动态信号会引入误差二是两个通道的偏移和增益误差会叠加影响最终差分结果的精度。Tiva™ ADC内置的差分采样模式则是在硬件层面直接解决这个问题的方案。3.1 差分采样原理与配对规则在差分采样模式下ADC内部会同时连接两个指定的输入通道一个正输入端VIN一个负输入端VIN-并对它们的电压差进行一次性转换。转换结果是一个12位有符号数的补码形式以无符号数0x800十进制2048代表差分电压VIND VIN - VIN- 0。VIND 0结果范围在0x801到0xFFF之间。VIND 0结果范围在0x000到0x7FF之间。VIND 0结果为0x800。这里有一个非常重要的硬件限制差分输入对是固定的不能随意组合。如输入资料中表13-3所示ADC模块将相邻的偶数/奇数通道预定义为差分对。例如差分对0使用模拟输入通道0AIN0, 偶数作为VIN通道1AIN1, 奇数作为VIN-。差分对1使用通道2AIN2作为VIN通道3AIN3作为VIN-。以此类推。你无法将AIN0和AIN3配置为一个差分对。这个限制源于芯片内部模拟多路复用器的物理连接。在硬件设计阶段就必须根据这个配对规则来规划传感器信号应该连接到哪个GPIO引脚。3.2 配置流程与电压范围计算配置差分采样主要涉及两个寄存器ADCSSMUXn和ADCSSCTLn。假设我们想使用采样序列发生器0的第一个采样步进Step 0来测量差分对0AIN0和AIN1的电压差。// 1. 禁用采样序列发生器0安全配置习惯 HWREG(ADC0_BASE ADC_O_ACTSS) ~ADC_ACTSS_ASEN0; // 2. 配置采样序列0的触发源为处理器软件触发略 // HWREG(ADC0_BASE ADC_O_EMUX) ...; // 3. 为序列0的Step 0选择输入源差分对0 // ADCSSMUX0寄存器的MUX0字段Bits 3:0用于Step 0。对于差分采样这里写入的是“差分对编号”。 HWREG(ADC0_BASE ADC_O_SSMUX0) 0x0; // 选择差分对0 (AIN0 AIN1) // 4. 配置Step 0的控制位关键是要置位D0位以启用差分采样 uint32_t ssctl_config 0; ssctl_config | ADC_SSCTL0_D0; // 启用差分采样 ssctl_config | ADC_SSCTL0_END0; // 假设这是序列中唯一的一步标记结束 // 还可以配置其他位如IE0中断使能、TS0温度传感器等 HWREG(ADC0_BASE ADC_O_SSCTL0) ssctl_config; // 5. 使能采样序列发生器0 HWREG(ADC0_BASE ADC_O_ACTSS) | ADC_ACTSS_ASEN0; // 6. 软件触发采样 HWREG(ADC0_BASE ADC_O_PSSI) | ADC_PSSI_SS0; // 7. 等待转换完成轮询或中断然后从ADCSSFIFO0读取数据 while(!(HWREG(ADC0_BASE ADC_O_RIS) ADC_RIS_INR0)) {} // 等待原始中断标志 uint32_t diff_result HWREG(ADC0_BASE ADC_O_SSFIFO0);读取到的diff_result是一个12位数据存储在32位寄存器的低12位。需要将其转换为实际的电压差。转换公式为V_diff ( (int32_t)diff_result - 0x800 ) * (VREF / 4096)其中VREF是差分参考电压VREFD VREFP - VREFN。如果使用内部参考VREFP连接VDDA通常是3.3VVREFN连接GNDA0V那么VREF 3.3V。注意这里的(diff_result - 0x800)需要当作有符号数处理。3.3 共模电压差分采样的“隐形守护者”差分采样一个极易被忽视但至关重要的概念是共模电压。它指的是差分输入两端电压的平均值VINCM (VIN VIN-) / 2。ADC正常工作有一个前提VIN和VIN-各自的电压都必须落在VREFP和VREFN之间通常是0V到3.3V。即使它们的差值VIND在允许范围内但如果它们的共模电压VINCM太高或太低导致其中一端电压超出了[VREFN, VREFP]的范围转换结果就会饱和失真输出0x000或0xFFF失去意义。理想情况下为了获得最大的差分输入动态范围即VIND可以从-VREF变化到VREF应尽量让输入共模电压VINCM等于参考共模电压VREFCM (VREFP VREFN)/2。对于单电源3.3V系统VREFCM就是1.65V。这意味着如果你的差分信号是围绕1.65V上下波动的那么你可以测量到最大±1.65V的差分电压。如果你的信号是围绕2.5V波动的那么为了避免正输入端VIN超过3.3V允许的差分电压正摆幅就会受到限制。实战建议在设计传感器调理电路时务必使用运放等电路将传感器的输出共模电压调整到VREFCM附近。这不仅是为了避免饱和也是为了获得最佳的线性度和精度。4. 数字比较器解放CPU的硬件“哨兵”在监控类应用中我们常常需要判断某个ADC通道的电压是否超过了设定的阈值。最朴素的做法是让ADC不断采样然后CPU读取结果并与软件中设定的阈值进行比较。这种方式会持续占用CPU资源并且在发生越限事件到CPU读取并做出反应的这段时间存在延迟。ADC模块内置的数字比较器Digital Comparator功能就是为了将CPU从这种简单的轮询比较中解放出来。4.1 工作原理与核心概念你可以将每个数字比较器DC想象成一个独立的、可编程的“硬件比较单元”。它直接连接到ADC转换器的输出端。当一次ADC转换完成后其数字结果会同时被送往FIFO和如果配置了指定的数字比较器。数字比较器将这个结果与用户预先通过ADCDCCMPn寄存器设置的两个阈值COMP0和COMP1进行比较从而将整个输入范围划分为三个区域低值带转换结果 COMP0中值带COMP0 转换结果 COMP1高值带转换结果 COMP1通过配置ADCDCCTLn寄存器你可以指定数字比较器在哪个“值带”内工作以及以何种“模式”来响应。4.2 四种工作模式深度解析数字比较器提供了四种工作模式分别适用于不同的监控场景。理解它们的区别是正确应用的关键。持续触发模式只要ADC结果落在设定的值带内每一次转换都会产生一个中断或触发事件。这就像是一个严格的哨兵只要目标在警戒区内它就持续鸣笛。适用于需要实时、不间断报告状态的应用但可能产生大量中断。单次触发模式只有当当前ADC结果落在设定值带内而前一次结果不在该值带内时才会产生一次中断/触发。这就像是检测“进入事件”。例如监控电压是否超过阈值仅在电压从正常值首次超过阈值时报警一次非常适合用于过压或欠压检测避免在持续超限期间产生中断风暴。迟滞持续触发模式此模式只能用于低值带或高值带。一旦ADC结果进入设定的值带如高值带就会开始持续产生中断/触发。这个“触发状态”会一直保持直到ADC结果穿越中值带进入相反的值带如从高值带进入低值带迟滞条件才会被清除。之后只有当信号再次进入原值带才会重新开始持续触发。这种模式结合了“进入检测”和“状态保持”非常适合需要锁定某种故障状态直到件完全解除的场景。迟滞单次触发模式同样只用于低或高值带。它只在信号首次进入设定值带且迟滞条件已被清除即信号之前处于相反值带或中值带时产生一次中断/触发。之后即使信号仍在该值带内也不会再触发直到它离开并再次进入。这提供了最强的抗抖动能力只有在信号稳定地跨越阈值边界时才报告一次事件。4.3 完整配置示例电压窗口监控假设我们需要监控AIN0通道的电压当电压低于1.0V低电压警告或高于2.5V过压警告时需要产生处理器中断。我们使用数字比较器0DC0来实现。第一步计算阈值假设VREFP 3.3V,VREFN 0V。 ADC码值 (输入电压 / 3.3V) * 4096低阈值COMP0 (1.0 / 3.3) * 4096 ≈ 1241 (0x4D9)高阈值COMP1 (2.5 / 3.3) * 4096 ≈ 3103 (0xC1F)我们希望电压低于1.0V时低值带报警高于2.5V时高值带报警。因此我们将COMP0和COMP1设置为这两个值。中值带1.0V ~ 2.5V是正常范围。第二步配置ADC采样序列我们需要配置一个采样序列例如SS0定期对AIN0采样并将其输出导向数字比较器0。// 1. 禁用SS0 HWREG(ADC0_BASE ADC_O_ACTSS) ~ADC_ACTSS_ASEN0; // 2. 配置SS0为软件触发单次采样 HWREG(ADC0_BASE ADC_O_EMUX) (HWREG(ADC0_BASE ADC_O_EMUX) ~ADC_EMUX_EM0_M) | ADC_EMUX_EM0_PROCESSOR; // 3. 配置SS0的Step 0采样AIN0并设置其输出到数字比较器0 HWREG(ADC0_BASE ADC_O_SSMUX0) 0; // MUX0 0, 选择AIN0 // 在ADCSSOP0寄存器中设置S0DCOP位将Step 0的结果输出到数字比较器 HWREG(ADC0_BASE ADC_O_SSOP0) ADC_SSOP0_S0DCOP; // 在ADCSSDC0寄存器中指定使用哪个比较器。S0DCSEL字段选择数字比较器。 HWREG(ADC0_BASE ADC_O_SSDC0) 0; // S0DCSEL 0, 选择DC0 // 4. 配置SS0控制位END位标记结束 HWREG(ADC0_BASE ADC_O_SSCTL0) ADC_SSCTL0_END0; // 5. 使能SS0 HWREG(ADC0_BASE ADC_O_ACTSS) | ADC_ACTSS_ASEN0;第三步配置数字比较器0// 1. 设置比较阈值 HWREG(ADC0_BASE ADC_O_DCCMP0) (3103 16) | 1241; // COMP1 3103, COMP0 1241 // 2. 配置比较器控制寄存器 (ADCDCCTL0) uint32_t dcctl_config 0; // 我们希望低值带和高值带都能触发中断 // 配置中断功能工作在低值带 (CIC0x0)单次触发模式 (CIM0x1) // 同时也配置触发功能工作在高值带 (CTC0x3)单次触发模式 (CTM0x1) // 注意这里为了演示同时配置了中断和触发。实际应用中通常只选一种。 dcctl_config | (0x0 8); // CIC 0x0: 中断功能监控低值带 dcctl_config | (0x1 4); // CIM 0x1: 中断功能为单次触发模式 dcctl_config | (0x3 12); // CTC 0x3: 触发功能监控高值带 dcctl_config | (0x1 13); // CTM 0x1: 触发功能为单次触发模式 dcctl_config | ADC_DCCTL0_CIE; // 使能比较器中断功能 // dcctl_config | ADC_DCCTL0_CTE; // 如需触发功能使能此位 HWREG(ADC0_BASE ADC_O_DCCTL0) dcctl_config; // 3. 在ADC中断掩码寄存器中使能数字比较器中断 // 首先需要确定DC0中断对应哪个采样序列的DC中断位。假设DC0映射到SS0。 // ADCIM寄存器中的DCINSS0位对应SS0的数字比较器中断。 HWREG(ADC0_BASE ADC_O_IM) | ADC_IM_DCONSS0; // 4. 在NVIC中使能ADC0中断此处略需根据具体中断号配置第四步中断服务程序当电压低于1.0V或高于2.5V时数字比较器会触发中断。在ADC0的中断服务程序ISR中需要检查ADCDCISC寄存器来确定是哪个比较器产生了中断并进行处理。void ADC0_Handler(void) { uint32_t dc_status HWREG(ADC0_BASE ADC_O_DCISC); if (dc_status ADC_DCISC_DCINT0) { // DC0中断 // 检查ADC_RIS寄存器的INRDC位确认是数字比较器中断 if (HWREG(ADC0_BASE ADC_O_RIS) ADC_RIS_INRDC) { // 进一步判断是低值带还是高值带触发可以通过读取ADC结果与阈值比较或设置标志位。 uint32_t adc_value HWREG(ADC0_BASE ADC_O_SSFIFO0) 0xFFF; if (adc_value 1241) { // 低电压处理 handle_undervoltage(); } else if (adc_value 3103) { // 高电压处理 handle_overvoltage(); } } // 清除DC0中断标志 HWREG(ADC0_BASE ADC_O_DCISC) ADC_DCISC_DCINT0; } // 清除ADC模块原始中断标志如果还有其他中断源需要处理 HWREG(ADC0_BASE ADC_O_ISC) ADC_ISC_IN0; // 清除SS0中断标志 }4.4 避坑指南与高级技巧中断冲突数据手册中有一个非常重要的警告任何时刻只允许将一个ADCIM寄存器中的DCONSSn位置位。DCONSS0对应采样序列0的数字比较器中断使能。如果你使能了多个例如DCONSS0和DCONSS1将会屏蔽ADCRIS寄存器中的INRDC位导致所有数字比较器中断都无法产生。这是一个很容易踩的坑。最佳实践是如果使用数字比较器中断最好将其关联到一个专用的采样序列发生器上并且只使能那一个序列的DCONSSn位。阈值设置COMP1必须大于等于COMP0。如果设置COMP1小于COMP0行为是未定义的可能导致不可预测的中断。与PWM的联动数字比较器的触发输出可以直接连接到PWM模块用于生成特定的波形或进行保护动作如在过流时立即关闭PWM输出。这实现了纯硬件的快速响应闭环延迟极短对于电机控制、电源保护等场景至关重要。配置时需要正确设置ADCTSSEL寄存器来选择PWM模块。迟滞模式的应用迟滞模式对于消除阈值附近的信号抖动例如由于噪声导致电压在阈值上下频繁波动非常有效。它确保了只有在信号稳定地越过阈值并“深入”新区域后状态才会改变避免了误报警。5. 内部温度传感器系统自检与校准的帮手Tiva™ MCU内部集成了一个温度传感器它本质上是一个输出电压随结温变化的PN结。其输出VTSENS通过一个固定的模拟通道连接到ADC模块。这个功能非常实用主要有两个用途一是监测芯片内部温度防止过热损坏或工作在低温极限之外二是为其他模块如休眠模块的RTC提供温度补偿的参考。5.1 使用与计算使用温度传感器非常简单只需在配置采样序列时将对应采样步进的ADCSSCTLn寄存器中的TSn位置位即可。例如在SS0的Step 0中启用温度传感器采样HWREG(ADC0_BASE ADC_O_SSCTL0) | ADC_SSCTL0_TS0; // 启用温度传感器采样 HWREG(ADC0_BASE ADC_O_SSCTL0) | ADC_SSCTL0_END0; // 标记结束读取到的ADC码值ADCCODE需要转换为温度。转换公式为TEMP (°C) 147.5 - ( (75 * (VREFP - VREFN) * ADCCODE) / 4096 )这个公式来源于数据手册提供的线性关系。对于典型的3.3V内部参考VREFP - VREFN 3.3V公式可以简化为TEMP ≈ 147.5 - (ADCCODE * 0.0604)5.2 注意事项精度内部温度传感器主要用于监测温度趋势和进行相对粗略的测量精度通常在±2°C到±5°C。它不适合需要高精度温度测量的应用。如果需要高精度必须外接专用的温度传感器芯片。自发热影响当CPU高速运行或外设特别是模拟模块工作时芯片本身会产生热量导致测得的温度高于环境温度。在解读温度读数时需要考虑这个因素。为了获得更接近环境温度的值可以在测量前将MCU置于低功耗休眠模式一段时间让芯片温度与环境平衡。校准公式中的系数147.5, 75是典型值每个芯片可能存在个体差异。对于要求稍高的应用可以在一个已知的精确温度点例如室温25°C进行一次测量计算出实际的ADC码值然后反推出一个校正系数对公式进行微调可以提升测量的一致性。6. 常见问题排查与调试心得在实际项目中调试ADC高级功能时会遇到一些典型问题。以下是我总结的排查清单和经验硬件采样平均无效噪声依然很大检查电源和地这是最常见的原因。用示波器仔细检查模拟电源引脚VDDA, GNDA上的噪声。确保使用了磁珠或0欧电阻将模拟电源与数字电源隔离并靠近引脚放置了10uF钽电容和0.1uF陶瓷电容进行去耦。检查输入信号信号源本身是否干净传感器供电是否稳定可以在信号进入MCU前增加一个RC低通滤波器如1kΩ 0.1uF截止频率约1.6kHz能有效滤除高频噪声。检查配置确认ADCSAC寄存器已正确写入并且采样序列的配置如采样保持时间允许ADC完成多次转换。过短的采样保持时间可能导致转换不准确。差分采样结果不准或跳变检查共模电压使用万用表或示波器同时测量差分输入的两个引脚对地的电压。确保它们都在0V到3.3V或你使用的VREFP之间并且其平均值共模电压最好在参考电压中点附近。检查配对规则确认你使用的两个通道是合法的差分对如AIN0和AIN1AIN2和AIN3。连接错了通道会导致无法预测的结果。检查ADCSSCTLn的D位是否在配置采样步进时置位了Dn位忘记置位此位ADC会以单端模式采样第一个通道偶数通道而忽略第二个通道。数字比较器不产生中断检查ADCIM寄存器这是最关键的步骤。确保只使能了一个DCONSSn位例如DCONSS0并且该位确实被置1。检查ADCDCCTLn寄存器确认CIE中断使能位已置位并且CIC中断比较带选择和CIM中断模式选择字段配置正确。检查阈值COMP0/COMP1确认设置的值是合理的12位ADC码值0-4095并且COMP1 COMP0。检查采样序列配置确认ADCSSOPn寄存器中对应的SnDCOP位已置位将ADC结果送到了数字比较器并且ADCSSDCn寄存器中对应的SnDCSEL字段选择了正确的比较器编号。检查全局中断确认ADC模块的中断在NVIC中已使能且优先级设置正确。使用调试器在中断服务函数入口设置断点同时监控ADCRIS和ADCDCISC寄存器的值看中断标志是否被置起。如果标志置起但没进中断问题在NVIC或全局中断开关如果标志没置起问题在ADC或比较器配置。内部温度传感器读数异常检查参考电压温度计算公式依赖于(VREFP - VREFN)。如果你使用了外部参考电压确保其准确且稳定。使用内部参考时确保VDDA电压正常。等待稳定在使能ADC或从低功耗模式唤醒后内部带隙参考电压和温度传感器需要一段时间才能稳定。数据手册通常会给出一个稳定时间例如几十微秒。在首次采样前插入一个短暂的延时。多次平均温度传感器的输出也可能有噪声可以结合硬件采样平均功能例如16x或32x来获得更稳定的读数。多序列发生器配置冲突优先级仲裁当多个采样序列发生器同时就绪时由ADCSSPRI寄存器决定它们的执行顺序。高优先级的序列会抢占低优先级的序列。如果低优先级序列总是无法完成检查是否被高优先级序列频繁打断。硬件平均共享再次强调一个ADC模块内的所有序列共享同一个硬件平均电路。如果序列0设置了64x平均那么序列1、2、3在执行时也会进行64x平均无论它们的配置如何。这可能会严重影响其他序列的吞吐率。在复杂的多通道采样应用中需要精心规划序列的触发方式和平均配置。调试ADC是一个需要耐心和细致观察的过程。我的习惯是在软件初始化后先用最简单的单次采样、软件触发模式读取一个已知电压如通过电阻分压得到的1.65V验证ADC基础功能是否正常。然后再逐步、逐个地使能高级功能并验证其行为是否符合预期。利用调试器的实时内存查看和寄存器查看功能可以极大地提高效率。记住一个稳定、干净的模拟供电和接地平面是所有高级ADC功能得以发挥效能的基石在PCB设计阶段就必须给予最高优先级的考虑。

相关新闻