CC13x2/CC26x2 AUX ADC与模拟外设:事件驱动低功耗设计实战

📅 2026/7/26 21:21:37 👁️ 阅读次数 📝 编程学习
CC13x2/CC26x2 AUX ADC与模拟外设:事件驱动低功耗设计实战

1. 项目概述:深入CC13x2/CC26x2的模拟信号链心脏

在嵌入式物联网和无线传感节点设计中,模拟信号的精准采集与处理是连接物理世界与数字世界的桥梁。无论是监测环境温湿度、检测电池电量,还是实现电容触摸感应,其核心都离不开一个高效、可靠的模数转换器。TI的CC13x2/CC26x2系列无线MCU,作为低功耗领域的明星产品,其强大之处不仅在于优秀的射频性能,更在于其AUX(辅助)域内集成的一套高度灵活、低功耗的模拟外设子系统。这套子系统并非一个孤立的ADC模块,而是一个包含ADC、比较器、参考电压源和电流源的完整信号链解决方案,专为电池供电的常开传感应用而优化。

很多开发者初次接触这类MCU的ADC时,可能会直接调用高阶API或驱动库,虽然能快速实现功能,但往往对底层机制一知半解。当遇到采样精度不稳、功耗高于预期,或者需要实现复杂的、由外部事件触发的采样序列时,就会感到束手无策。实际上,充分理解AUX ADC及其配套外设的工作原理与配置细节,是解锁其全部潜力、实现极致能效和灵活性的关键。本文将从一个资深嵌入式工程师的视角,拆解CC13x2/CC26x2 AUX域模拟外设的核心原理、配置要点和实战应用,特别是其独特的事件驱动架构和低功耗模式下的使用技巧,让你不仅能“用起来”,更能“用得巧”、“用得省”。

2. AUX ADC核心架构与工作原理深度解析

CC13x2/CC26x2的AUX ADC是一个12位的逐次逼近型模数转换器。SAR ADC的工作原理可以类比于天平称重:它内部有一个数模转换器和一个比较器。转换开始时,DAC输出一个中间量程的电压(比如满量程的一半),与输入电压进行比较。如果输入电压更高,则保留最高位为1,并让DAC输出增加下一个权重(如1/4满量程)的电压再次比较;如果更低,则最高位置0,并减去该权重的电压。如此逐位逼近,最终得到一个最接近输入电压的数字码。这种方式在速度、精度和功耗之间取得了很好的平衡,非常适合中等速度、中等精度的嵌入式传感应用。

2.1 输入通道与信号调理:第一道关卡

AUX ADC的模拟输入并非直接连接所有GPIO。它专门连接了AUXIO19至AUXIO26这8个具有模拟功能的I/O引脚,以及一些内部的芯片电压(如电源监测点)。这是一个重要的硬件设计细节,意味着你在进行PCB布局和引脚分配时,必须将待采样的模拟信号连接到这些指定的引脚上。

输入信号在进入ADC核心之前,会经过一个默认的缩放环节。默认情况下,输入电压会被按比例缩小(系数为1408/4095)。这样做的目的是为了扩大ADC的有效输入电压范围,使其能够安全地测量可能高于ADC参考电压的信号。例如,如果参考电压是固定的1.4V,经过缩放后,实际能测量的引脚电压最高可以更高。然而,这个缩放是可以被禁用的。禁用后,ADC将以全分辨率测量未经缩放的输入电压,但代价是输入电压范围会变小,一旦超过范围就可能损坏ADC。

重要提示:禁用输入缩放是一个需要极度谨慎的操作。你必须确保输入信号的幅度绝对在ADC允许的、未缩放情况下的最大输入电压范围内。这个范围在芯片的数据手册中有明确规定,超出此范围可能导致ADC永久性损坏。在驱动库中,通常会提供相应的配置参数来安全地切换缩放模式。

2.2 参考电压选择:测量的基准线

ADC的测量精度和范围,根本上取决于其参考电压的稳定性和准确性。AUX ADC的参考电压模块非常灵活,支持两种主要模式:

  1. 固定参考电压:例如,使用芯片内部产生的稳定电压源(如ADCREF)。这种方式简单,参考电压精度由芯片内部保证,适合大多数通用场景。
  2. 相对参考电压:参考电压可以是电源电压VDDS的一个比例。这在电池供电应用中特别有用,因为你可以测量一个与电源电压成比例的电阻分压信号,从而间接、且不受电池电压波动影响地测量你关心的物理量(例如,通过测量一个固定在VDDS和GND之间的电阻分压点来监测电池电压)。

参考电压模块需要在ADC复位期间(ADI_4_AUX.ADC0.RESET_N = 0)进行配置。为了节能,在同步采样模式下,如果配置的采样周期长于参考电压模块的上电时间,你可以在采样间隙关闭该模块。这需要在ADCREF0.REF_ON_IDLE寄存器中进行精细控制。

2.3 同步与异步采样模式:速度与功耗的权衡

这是AUX ADC设计中的一个精髓,直接决定了采样行为的时序和功耗。

  • 同步采样模式:这是最常用的模式。当ADC触发事件到来时,ADC才开始对输入信号进行采样,采样持续一个由SMPL_CYCLE_EXP寄存器配置的可编程时间,采样结束后立即启动转换。这种模式的优势在于,它允许ADC的采样开关有足够的时间对高阻抗的信号源进行充分充电,从而保证采样精度。例如,当你通过一个很大的串联电阻(如1MΩ)去测量一个电压时,必须使用足够长的采样时间,让采样电容上的电压稳定到信号电压。你可以根据信号源阻抗和采样电容大小来计算所需的最小采样时间。
  • 异步采样模式:在此模式下,ADC会持续不断地对输入进行采样(采样电容周期性地连接至输入)。当ADC触发事件到来时,它停止当前的采样周期,并立即对采样电容上保持的电压进行转换。这种模式消除了由触发延迟带来的采样时间抖动(Jitter),对于需要非常精确的等间隔采样应用(如某些音频或振动分析)有益。但其代价是持续采样会带来更高的静态电流消耗。

选择哪种模式,取决于你的应用对精度、功耗和时序确定性的要求。对于绝大多数间歇性工作的低功耗传感器,同步模式是更优的选择。

2.4 时钟源与功耗管理:系统的脉搏

ADC内核需要一个24 MHz的时钟来完成采样和转换操作。这个时钟可以来自内部高频RC振荡器或外部24 MHz晶体振荡器。为了获得最低抖动的采样性能(尤其是在异步模式下),必须确保系统高频时钟源来自外部晶体。

这里有一个至关重要的低功耗约束:当ADC时钟被启用后,系统将无法进入待机或关机模式。因为电源管理单元会为了维持ADC时钟而请求高频时钟源保持活动。这意味着,如果你的应用需要ADC在深度睡眠期间工作,就必须仔细规划。一种常见的低功耗策略是让传感器控制器来操作ADC,因为AUX域可以在主CPU睡眠时独立运行;另一种策略是采用极短的工作周期,快速采样后立即关闭ADC并允许系统进入睡眠。

2.5 触发机制:让采样“智能”起来

AUX ADC的启动不是只能靠软件轮询,它支持强大的事件驱动触发。你可以配置一个特定的事件源(如定时器溢出、GPIO边沿、比较器输出等)来触发一次ADC采样序列。配置分为两步:

  1. 通过AUX_ANAIF:ADCCTL寄存器选择事件源和极性(上升沿、下降沿或电平)。
  2. 如果将START_SRC设置为NO_EVENT,则切换为手动触发模式,通过写寄存器来启动。

触发事件到来后具体执行什么操作,则由前面提到的采样模式(同步/异步)决定。这种事件驱动机制是实现超低功耗的关键。例如,你可以配置一个低频时钟定时器每秒钟产生一个事件去触发ADC采样电池电压,采样完成后通过中断或DMA读取数据,然后整个系统继续睡眠。整个过程无需主CPU干预,功耗极低。

2.6 四元素FIFO与µDMA:高效的数据搬运工

ADC转换完成的结果会被存入一个深度为4的硬件FIFO。这个FIFO的设计巧妙之处在于:

  • 缓冲作用:允许ADC连续进行多次转换(例如在突发采样模式下),而CPU或DMA不必立即响应每一次转换完成中断,降低了实时性要求。
  • 事件接口:FIFO的状态(空、满、几乎满、溢出、下溢)都会产生事件,连接到AUX事件总线,可以被用来触发其他操作或中断。
  • µDMA集成:µDMA(微直接存储器访问)通道7被专门用于从ADC FIFO自动搬运数据到内存。你可以配置当FIFO“非空”或“几乎满”时触发一次DMA传输。这实现了“采集-搬运”的完全硬件自动化,将CPU从繁琐的数据搬运工作中彻底解放出来,使其能够处理更复杂的任务或进入更深的睡眠状态。

读取FIFO数据时需要注意,读出的原始样本值需要进行偏移和增益误差补偿,以得到准确的电压值。补偿所需的校准系数存储在芯片出厂时的工厂配置信息区(FCFG)。TI的DriverLib提供了相应的函数(如ADCCalibration())来自动完成这个补偿计算。

调试陷阱:在通过JTAG调试时,如果你在IDE的寄存器观察窗口中查看AUX_ANAIF:ADCFIFO寄存器,这个查看动作本身会触发一次FIFO的读取(pop),导致软件接下来无法读到这个样本。调试ADC数据流时,最好通过观察内存中的DMA目标缓冲区来查看数据。

3. 模拟信号链伙伴:COMPA/B比较器与参考DAC

AUX ADC很少单独工作,它与COMPA、COMPB比较器以及参考DAC构成了一个协同工作的模拟信号链。

3.1 COMPA:高性能连续时间比较器

COMPA是一个响应速度快的连续时间比较器,常用于需要快速判断的应用。

  • 应用场景:最典型的应用是电容触摸感应。它与ISRC(电流源)和TDC(时间数字转换器)协同工作。ISRC以一个恒定的电流对触摸电极的电容充电,同时COMPA的正输入端连接该电极,负输入端连接一个由ISRC或参考DAC产生的阈值电压(如0.8V)。当电容电压充电超过阈值时,COMPA输出翻转。TDC则精确测量从开始充电到COMPA翻转的时间,这个时间与电容值成正比,从而检测触摸。
  • 输入与参考:正负输入端均可灵活选择来自AUXIO引脚、ISRC输出或内部DAC。使用TI提供的DriverLib函数来切换多路复用器是至关重要的,这些函数实现了“先断后通”的切换逻辑,防止内部信号短路。
  • 低功耗模式支持:在低功耗和掉电模式下使用COMPA,需要使能LPMBIAS模块为其提供偏置电流。

3.2 COMPB:超低功耗时钟型比较器

COMPB是一个以32kHz时钟工作的比较器,功耗极低,专为持续监控慢变信号并唤醒系统而设计。

  • 核心价值:实现事件驱动的系统唤醒。例如,可以用它持续监控电池电压,一旦电压低于某个由参考DAC设定的阈值,就产生一个事件唤醒主CPU或传感器控制器,从而避免CPU频繁轮询带来的功耗。
  • 唤醒路径:COMPB的输出事件可以通过两条路径唤醒系统:
    • 直接唤醒:配置为AON域的直接唤醒事件,延迟最小,但无法在AON域中清除该事件标志。
    • 间接唤醒:事件先被同步到AUX事件总线,再触发AON事件。这引入了几个SCE时钟周期的延迟,但优点是主CPU被唤醒后可以清除事件标志,这样即使触发唤醒的信号电平依然存在,系统也能再次进入睡眠。
  • 低功耗配置:这是COMPB使用的难点。当系统CPU想在待机模式下使用COMPB时,需要一套精细的配置序列,涉及AUX操作模式切换、参考DAC配置、采样时钟控制等,确保在极低功耗下参考电压稳定,比较器能正常工作。具体步骤在技术参考手册中有详细描述,概括来说就是:在低功耗模式下建立参考电压,然后切换到掉电模式等待比较事件。

3.3 参考DAC:灵活的阈值发生器

参考DAC是一个8位DAC,主要任务是为COMPA和COMPB提供可编程的参考电压。

  • 工作原理:它使用一个可配置的采样时钟,周期性地对一个采样保持电容进行充电或刷新,以维持其上的电压。时钟分为建立阶段和保持阶段。在建立阶段,以较高频率快速将电容充电至目标电压;在保持阶段,可以降低刷新频率以节省功耗,仅维持电压不掉电。
  • 输出模式:可以驱动外部负载(需使能缓冲器)、COMPA_REF或COMPB_REF节点。驱动外部负载时,对负载的阻值和容性有具体要求(如电阻需远大于10MΩ)。
  • 校准与非线性:参考DAC存在非线性。为了获得精确的输出电压,需要使用存储在工厂配置区中的校准数据。TI的软件库通常封装了校准函数。
  • 低功耗序列:与COMPB类似,在系统待机模式下使用参考DAC也需要一套严格的配置序列,确保在掉电模式下DAC的采样保持电容能维持电压,同时功耗最低。

4. 实战配置:以事件驱动的电池电压监控为例

让我们通过一个完整的实战案例,将上述理论串联起来。假设我们需要设计一个功能:系统大部分时间处于待机模式,每秒用COMPB和参考DAC监控电池电压,当电压低于3.0V时唤醒主CPU进行报警;同时,每小时用ADC精确测量一次电池电压并记录。

系统设计思路

  1. 精密测量通道:使用ADC,通过电阻分压网络测量电池电压。采用同步采样模式,由RTC定时器事件触发。
  2. 阈值监控通道:使用COMPB和参考DAC。参考DAC设定一个对应3.0V的阈值电压。COMPB持续比较分压后的电池电压与阈值。
  3. 低功耗策略:RTC、COMPB、参考DAC在AUX域和AON域运行,主CPU睡眠。仅当COMPB触发唤醒或RTC触发每小时测量时,才短暂唤醒主CPU或传感器控制器。

关键配置步骤

4.1 硬件连接与初始化
  • 将电池电压通过一个高阻值分压器(例如,将3.6V分压到ADC满量程1.4V以内)连接到AUXIO23(ADC输入)和AUXIO24(COMPB正输入)。
  • 初始化系统时钟,确保ADC时钟源为24MHz晶体。
  • 配置AUX域电源和时钟管理,使其能在主CPU睡眠时运行。
4.2 配置参考DAC用于COMPB监控
// 伪代码,基于TI DriverLib风格 #include <ti/drivers/dpl/ADCDriver.h> #include <ti/drivers/dpl/AUXDriver.h> // 1. 申请DAC和COMPB资源信号量 semaphore_request(DAC_SEM); semaphore_request(COMPB_SEM); // 2. 配置DAC参考源(例如使用内部ADCREF) AUX_DAC_REF_SOURCE = AUX_DAC_REF_SOURCE_INTERNAL; // 3. 计算对应3.0V电池电压的DAC代码值(考虑分压比和DAC非线性校准) uint8_t dac_code = calculate_dac_code_for_voltage(3.0f); // 4. 配置DAC输出值,并连接到COMPB_REF AUX_DAC_VALUE_SET(dac_code); AUX_DAC_OUTPUT_SELECT(AUX_DAC_OUTPUT_COMPB_REF); // 5. 为低功耗模式配置DAC采样时钟(手动控制模式,长保持间隔) AUX_DAC_SAMPLE_CLOCK_CONFIG_MANUAL(); AUX_DAC_HOLD_INTERVAL_SET(0xFFFF); // 很长的保持间隔,节省功耗 // 6. 使能LPM偏置,然后使能DAC AUX_LPMBIAS_ENABLE(); AUX_DAC_ENABLE(); // 7. 等待DAC输出稳定(例如15us延时) delay_us(15); // 8. 配置COMPB:输入选择AUXIO24,参考选择DAC输出 AUX_COMPB_INPUT_SELECT(AUX_COMPB_INPUT_AUXIO24); AUX_COMPB_REF_SELECT(AUX_COMPB_REF_DAC); // 9. 配置COMPB输出极性(例如,当输入低于参考时产生高电平事件) AUX_COMPB_EVENT_POLARITY_SET(AUX_COMPB_EVENT_POLARITY_LOW); // 10. 将COMPB事件配置为间接唤醒源,连接到AON事件 AUX_EVENT_CONNECT(AUX_EVENT_COMPB, AON_EVENT_MCU_WAKEUP); // 11. 设置AUX操作模式为低功耗,然后请求进入掉电模式 AUX_OPERATIONAL_MODE_SET(AUX_OP_MODE_LOW_POWER); // ... 配置其他AUX唤醒源后 AUX_OPERATIONAL_MODE_REQUEST(AUX_OP_MODE_POWER_DOWN_LP); // 12. 主CPU进入待机模式 CPU_enter_standby();
4.3 配置ADC用于每小时精密测量
// 1. 申请ADC资源信号量 semaphore_request(ADC_SEM); // 2. 配置ADC:输入通道(AUXIO23)、参考电压(固定内部参考)、采样模式(同步) AUX_ADC_CONFIG config; config.input = AUX_ADC_INPUT_AUXIO23; config.reference = AUX_ADC_REF_FIXED; config.sampleMode = AUX_ADC_SAMPLE_MODE_SYNCHRONOUS; config.sampleCycle = 16; // 根据信号源阻抗设置合适的采样周期数 AUX_ADC_init(&config); // 3. 配置ADC触发源为RTC定时器事件(例如,RTC每3600秒产生一个比较事件) AUX_ADC_TRIGGER_SOURCE_SET(AUX_ADC_TRIGGER_RTC_CH2); // 4. 配置µDMA,将ADC FIFO数据自动搬运到内存缓冲区 // 设置DMA源为ADC FIFO,触发条件为FIFO非空,目标地址为数组 setup_dma_channel7(ADC_FIFO_ADDR, &adc_result_buffer[0], BUFFER_SIZE, DMA_TRIGGER_ADC_FIFO_NOT_EMPTY); // 5. 使能ADC转换完成中断或DMA传输完成中断,以便处理数据 AUX_ADC_INT_ENABLE(AUX_ADC_INT_DMA_DONE); // 6. 使能ADC AUX_ADC_enable(); // 7. 主任务或RTC中断服务程序中,等待DMA完成标志,读取缓冲区数据并补偿 while(1) { if (dma_complete_flag) { dma_complete_flag = false; for(int i=0; i<BUFFER_SIZE; i++) { float voltage = AUX_ADC_convert_raw_to_voltage(adc_result_buffer[i]); // 记录或处理voltage... } } // ... 其他任务或进入低功耗 }
4.4 低功耗协调与唤醒处理
  • COMPB唤醒处理:在AON事件中断服务程序或主循环开始处,检查AON唤醒标志。如果是COMPB唤醒,则读取当前ADC快速测量值确认,然后执行低电量处理流程(如报警)。处理完毕后,必须清除AON中的对应事件标志,否则系统无法再次进入睡眠。
  • RTC与ADC协调:RTC定时器事件同时触发ADC采样和唤醒传感器控制器或主CPU。CPU被唤醒后,由于ADC数据通过DMA自动搬运,CPU只需检查DMA完成标志并处理数据即可,处理速度快,可迅速返回睡眠。

5. 常见问题排查与调试心得

在实际开发中,你可能会遇到以下典型问题:

问题1:ADC采样值不稳定,跳动大。

  • 排查思路
    1. 检查信号源与接地:这是最常见的原因。确保模拟信号地(AGND)干净,电源去耦电容(通常为100nF和10uF组合)靠近MCU电源引脚放置。模拟信号走线远离数字信号、时钟线。
    2. 确认采样时间:如果信号源阻抗较高(如>10kΩ),默认的采样时间可能不足。增加SMPL_CYCLE_EXP的值,延长采样时间。计算时间常数 τ = R_source * C_sample,确保采样时间远大于5τ。
    3. 检查参考电压:测量ADCREF引脚(如果引出)的电压是否稳定。如果使用VDDS作为参考,需注意电源本身的纹波。
    4. 禁用输入缩放:如果输入信号幅度很小(接近ADC的LSB),尝试禁用输入缩放,以获得更高的分辨率,但务必确认输入电压绝对安全。
    5. 校准:确保在初始化时调用了ADC校准函数,对偏移和增益误差进行了补偿。

问题2:系统无法进入预期的低功耗状态。

  • 排查思路
    1. 检查ADC时钟:确认在希望进入待机前,ADC是否已完全关闭(ADC0.EN=0且时钟请求已释放)。查看AUX_SYSIF:ADCCLKCTL状态。
    2. 检查AUX操作模式AUX_SYSIF:OPMODEREQ是否已成功切换到LPPDPDA?检查OPMODE状态寄存器确认当前模式。
    3. 检查事件挂起:查看AUX_EVCTL:EVSTATxAON_EVENT:MCUWUSEL等事件状态寄存器,是否有未处理的事件阻止了睡眠?确保在唤醒处理后清除了所有相关事件标志。
    4. COMPB/DAC低功耗序列:如果使用了COMPB在待机下监控,请严格遵循技术参考手册19.5.4.2.3.2节和19.5.5.2.6节的配置序列,特别是DAC采样时钟的配置和模式切换的等待时间。

问题3:COMPB无法可靠唤醒系统。

  • 排查思路
    1. 信号同步问题:如果使用间接唤醒,COMPB事件需要被同步到AUX事件总线,再同步到AON域。这有最多3个SCE时钟周期的延迟。确保在配置为唤醒源后,等待足够的时间(例如,执行几条NOP指令)再让CPU进入睡眠。
    2. 阈值与迟滞:COMPB是简单比较器,没有内置迟滞。如果输入信号在阈值附近有噪声,可能会产生多次误触发。需要在软件中做去抖处理,或者在硬件上对输入信号进行滤波(RC低通滤波)。
    3. 参考DAC稳定性:在掉电模式下,DAC依靠采样保持电容维持电压。如果保持间隔设置过长,电容漏电可能导致电压下降,改变比较阈值。可以适当缩短HOLD_INTERVAL,或使用自动相位控制模式(如果负载允许)。

问题4:使用DriverLib函数切换模拟多路复用器时,信号异常。

  • 排查心得:TI提供的AUXADCSelectInput()AUXCompASelectInput()等函数内部实现了“先断后通”的硬件序列。绝对不要直接操作底层的ADI_4_AUX多路复用器寄存器来切换模拟信号路径,这可能导致两个电压源在瞬间短路,损坏IO引脚或内部电路。始终使用经过验证的DriverLib API。

调试技巧

  • 利用事件总线AUX_EVCTL:EVSTAT0-3寄存器是强大的调试工具。你可以实时查看所有AUX事件的状态,确认触发事件是否如预期产生。
  • 静态电流测量:在评估低功耗效果时,使用高精度万用表测量系统在不同状态下的静态电流。通过依次关闭外设模块(ADC、DAC、比较器、传感器控制器),可以定位功耗异常的来源。
  • 示波器观察:使用示波器观察ADC输入引脚、参考电压引脚、以及触发事件GPIO的波形,可以直观地验证时序关系、信号完整性和触发是否生效。

理解CC13x2/CC26x2的AUX模拟外设,尤其是其以事件总线为核心的低功耗设计哲学,是开发高性能、长续航物联网设备的关键。它要求开发者从传统的“轮询-处理”思维,转向“事件-响应-睡眠”的异步设计模式。开始时配置可能会显得繁琐,但一旦搭建好这个自动化的信号采集与监控框架,你的系统就能在极低的功耗基底上稳定运行,这正是电池供电设备所追求的终极目标。