
1. 项目概述在嵌入式系统开发中实时监控模拟信号是否超出预设范围是一个高频需求。无论是电源电压的过压欠压保护还是电机温度的过热预警都需要系统能够快速、准确地响应。传统做法是让CPU不断读取ADC转换结果然后进行软件比较判断这就像让一个保安一刻不停地盯着仪表盘不仅效率低下还严重消耗了宝贵的处理器资源让系统难以处理其他更复杂的任务。Tiva™ TM4C123BH6ZRB微控制器内置的ADC模块其真正的威力远不止于将模拟电压变成一个数字值。它集成了一个常被开发者忽略的“硬件哨兵”——数字比较器单元。这个单元允许你设定一个或两个阈值之后ADC的每一次转换结果都会自动与这些阈值进行比较一旦条件满足可以直接触发中断或驱动其他外设如PWM整个过程完全由硬件完成CPU无需介入。这相当于给ADC装上了自动报警器只有当“警情”发生时才需要通知CPU来处理从而将CPU从繁琐的轮询中彻底解放出来。今天我们就来深入拆解Tiva™ TM4C123BH6ZRB的ADC数字比较器从工作原理、寄存器配置到实战应用手把手带你掌握这项能极大提升系统实时性和效率的硬核技术。无论你是正在设计一个需要精密监控的电源还是一个对响应速度有苛刻要求的电机控制系统这篇文章都能为你提供清晰的实现路径和避坑指南。2. 数字比较器核心原理与设计思路2.1 从软件轮询到硬件自动化的演进在深入寄存器之前我们有必要先理解数字比较器要解决的根本问题。假设我们需要监控一个锂电池的充电电压安全范围是3.0V到4.2V。使用传统的ADCCPU方案流程大致如下CPU配置ADC进行一次转换。CPU等待转换完成或通过中断获知。CPU从ADC数据寄存器读取数字值。CPU将数字值转换为电压值或直接比较数字值。CPU判断该电压值是否低于3.0V或高于4.2V。如果越界CPU执行保护动作如关闭充电MOSFET。循环回到步骤1。这个过程里步骤3到6完全由软件完成即使电压一直正常CPU也在不断地进行“读取-判断”这个循环我们称之为“忙等待”或“轮询”。对于多任务系统这无疑是巨大的浪费。数字比较器的设计思路是将步骤4到6的判断逻辑硬件化。其核心组件是一个数字比较电路和两个可编程的寄存器COMP0与COMP1。ADC转换完成后的数字值会直接送入这个比较电路与COMP0和COMP1中预设的值进行比较硬件电路会立即得出该值处于“低区间”、“中区间”还是“高区间”的结论。这个结论会驱动两个独立的状态机一个用于产生处理器中断另一个用于产生触发信号例如去控制PWM。只有当比较结果符合你预先设定的“报警条件”时硬件才会产生中断或触发信号从而通知CPU或触发其他外设动作。2.2 核心概念三区间划分与操作模式数字比较器的逻辑基石是将整个ADC量程0-4095对应0-VREF电压划分为三个区间低区间 (Low-Band)转换值 COMP0中区间 (Mid-Band)COMP0≤ 转换值 ≤COMP1高区间 (High-Band)转换值 COMP1这里的COMP0和COMP1就是用户通过ADCDCCMPn寄存器设定的两个阈值。你可以将COMP0和COMP1设为相同的值这样中区间就退化为一条线系统只有“低于阈值”和“高于等于阈值”两个状态常用于简单的越限报警。定义了区间之后我们需要定义“在什么情况下触发动作”。这就是四种操作模式的用武之地Always模式只要转换值落在你设定的目标区间低、中、高之一内每一次转换都会触发中断/触发信号。这适用于需要持续监控信号是否保持在某个范围内的场景但要注意可能产生密集的中断。Once模式仅当转换值进入你设定的目标区间时触发一次中断/触发信号。如果信号持续停留在该区间不会再次触发。这适用于检测信号边沿事件例如电压首次超过阈值。滞回Always模式 (Hysteresis-Always)这是Always模式的增强版加入了滞回逻辑。一旦信号进入目标区间只能是低或高区间并触发即使信号短暂回到中区间触发信号也会保持有效直到信号进入相反的区间高区间触发则需进入低区间清除反之亦然才会清除。这能有效防止信号在阈值附近抖动时产生一连串的触发/关闭脉冲非常适合驱动继电器、报警灯等需要稳定输出的场合。滞回Once模式 (Hysteresis-Once)这是Once模式的增强版。仅当信号进入目标区间只能是低或高区间且滞回条件未被置位时触发一次。触发后滞回条件置位即使信号回到中区间也不会清除直到它进入相反区间。这用于检测信号稳定地跨越某个阈值并保持且仅报告一次事件。注意滞回模式Hysteresis-Always/Hysteresis-Once只能用于低区间或高区间不能用于中区间。因为滞回逻辑需要一个“相反的区间”来清除状态而中区间没有逻辑上的“相反区间”。如果你尝试为CIC/CTC字段配置中区间0x1并同时选择滞回模式硬件行为将是未定义的。2.3 输出功能中断与触发数字比较器可以驱动两种输出它们有各自独立的状态机但共享同一套比较逻辑和ADC数据中断 (Interrupt)向处理器内核发出中断请求。你需要配置ADCIM寄存器来允许数字比较器中断通过某个采样序列器的中断线送达NVIC。在中断服务程序(ISR)中你可以读取ADCDCISC寄存器来判断是哪个比较器产生了中断并进行相应处理如记录日志、改变系统状态。触发 (Trigger)产生一个硬件触发信号可以直接输出到其他外设最典型的就是PWM模块。例如当电压过高时数字比较器可以立即触发PWM发生器进入故障状态关闭输出这个响应是纳秒级的比任何软件中断都要快对于实现硬实时保护至关重要。这两种功能可以单独启用也可以同时启用。例如你可以配置比较器在电压过高时同时产生触发立即关闭PWM和中断通知CPU记录故障事件。3. 寄存器详解与配置实战理解了原理我们来看如何通过寄存器来实现它。数字比较器的配置主要涉及三个寄存器组范围寄存器、控制寄存器和操作寄存器。3.1 核心寄存器功能解析1. ADC数字比较器范围寄存器 (ADCDCCMP0 - ADCDCCMP7)这是设定“哨兵”警戒线的寄存器。每个比较器共8个都有一个独立的ADCDCCMPn寄存器。COMP0 (位[15:0])定义第一个比较值即区间划分的下限。COMP1 (位[31:16])定义第二个比较值即区间划分的上限。关键规则COMP1的值必须大于等于COMP0。如果COMP1COMP0硬件行为不可预测。通常我们会根据要监控的电压阈值反向计算出对应的ADC数字值。公式为ADC值 (电压 / VREF) * 4095。假设VREF为3.3V要监控4.2V的上限则COMP1 (4.2 / 3.3) * 4095 ≈ 5220这超过了12位ADC的满量程4095因此你需要确保监控电压不超过ADC的参考电压。2. ADC数字比较器控制寄存器 (ADCDCCTL0 - ADCDCCTL7)这是“哨兵”的行为准则手册每个比较器一个。CIE位 (位0)比较器中断使能。置1则启用该比较器的中断功能。CTE位 (位1)比较器触发使能。置1则启用该比较器的触发功能。CIC字段 (位[3:2])选择中断功能的监控区间。0x0: 低区间 (值 COMP0)0x1: 中区间 (COMP0 ≤ 值 ≤ COMP1)0x3: 高区间 (值 COMP1)CTC字段 (位[5:4])选择触发功能的监控区间。编码含义同CIC字段。CIM字段 (位[9:8])选择中断功能的操作模式。0x0: Always0x1: Once0x2: Hysteresis-Always0x3: Hysteresis-OnceCTM字段 (位[13:12])选择触发功能的操作模式。编码含义同CIM字段。3. ADC采样序列操作寄存器 (ADCSSOP0 - ADCSSOP3)这个寄存器决定了ADC转换结果的去向。每个采样序列共4个都有一个ADCSSOPn寄存器其中的SnDCOP位例如对于序列0是S0DCOP位控制着该序列的转换结果是否要送给数字比较器。如果SnDCOP位被置1则该采样序列的转换结果不会进入其对应的FIFOADCSSFIFOn而是直接路由到由ADCSSDCn寄存器指定的数字比较器进行比较。如果SnDCOP位为0则转换结果正常进入FIFO可供CPU读取同时如果配置了也会送给数字比较器不这里有个关键点一个ADC转换结果要么去FIFO要么去数字比较器不能同时去两个地方除非你配置了两个采样点一个去FIFO一个去比较器。这是为了确保数据路径清晰避免冲突。4. ADC采样序列数字比较器选择寄存器 (ADCSSDC0 - ADCSSDC3)当ADCSSOPn中的SnDCOP位被置1时ADCSSDCn寄存器指定该采样序列的转换结果具体送给哪一个数字比较器0-7。这样你可以灵活地将不同ADC通道如温度、电流、电压的采样结果分别路由到不同的硬件比较器进行独立监控。3.2 配置流程与代码示例假设我们要用ADC0的序列采样器0SS0来监控通道0AIN0的电压并使用数字比较器0在电压超过2.5V假设VREF3.3V时产生中断。以下是基于TivaWare库函数的配置步骤和要点解析。步骤1系统与ADC模块初始化这是任何ADC应用的基础确保时钟和GPIO正确配置。#include stdint.h #include stdbool.h #include inc/hw_memmap.h #include inc/hw_types.h #include driverlib/sysctl.h #include driverlib/gpio.h #include driverlib/adc.h #include driverlib/pin_map.h int main(void) { // 1. 配置系统时钟PLL必须使能并工作在ADC支持的频率如16MHz晶振配置为80MHz系统时钟 SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); // 2. 使能ADC0和GPIO端口A假设AIN0在PA0的时钟 SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // 3. 配置PA0为模拟输入功能禁用数字功能 GPIOPinTypeADC(GPIO_PORTA_BASE, GPIO_PIN_0); // 注意GPIOPinTypeADC函数内部已经处理了AFSEL和DEN寄存器并可能配置了AMSEL。 // 更底层的做法是直接操作寄存器但库函数更安全便捷。 }步骤2配置采样序列器我们需要配置SS0使其在软件触发下对单个通道AIN0进行采样。// 4. 在配置前先禁用采样序列器0 ADCSequenceDisable(ADC0_BASE, 0); // 5. 配置采样序列器0单次采样优先级0默认最高软件触发 ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_PROCESSOR, 0); // 6. 配置序列器0的第0步采样AIN0使用片内温度传感器不这里我们采样外部通道。 // ADC_CTL_TS表示温度传感器ADC_CTL_CH0表示通道0ADC_CTL_IE表示采样结束产生中断如果使能ADC_CTL_END表示这是序列的最后一步。 // 注意我们这里先不使用序列器中断而是用数字比较器中断。所以先不加ADC_CTL_IE。 ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0 | ADC_CTL_END); // 7. 使能采样序列器0 ADCSequenceEnable(ADC0_BASE, 0);步骤3配置数字比较器这是核心步骤。我们要计算2.5V对应的ADC值并配置比较器0在“高区间”的“Once”模式下产生中断。// 8. 计算比较阈值 (COMP1)。我们只用一个阈值所以设COMP00COMP1阈值。 // 公式: ADC值 (Vin / Vref) * 4095 // 假设Vref 3.3V, Vin 2.5V uint32_t ui32Comp1Value (uint32_t)((2.5 / 3.3) * 4095.0 0.5); // 四舍五入 // 设置COMP00, COMP1计算值 ADCDCCMPSet(ADC0_BASE, 0, 0, ui32Comp1Value); // 9. 配置数字比较器0的控制寄存器 // 使能中断(CIE)不使能触发(CTE0)。 // 中断监控区间高区间 (CIC ADC_COMP_TRIG_HIGH) // 中断操作模式Once模式 (CIM ADC_COMP_TRIG_MODE_ONCE) // 触发功能我们不用CTC和CTM可以保持为0或任意值。 uint32_t ui32Config ADC_DCCTL_CIE | // 使能比较器中断 ADC_DCCTL_CIC_HIGH | // 高区间触发中断 ADC_DCCTL_CIM_ONCE; // Once模式 ADCDCCTLSet(ADC0_BASE, 0, ui32Config); // 10. 配置采样序列器0将其转换结果路由到数字比较器0而不是FIFO // 设置S0DCOP位为1 HWREG(ADC0_BASE ADC_O_SSOP0) | ADC_SSOP0_S0DCOP; // 11. 指定采样序列器0使用数字比较器0 HWREG(ADC0_BASE ADC_O_SSDC0) 0; // 写入0表示使用比较器0 // 12. 在ADC中断屏蔽寄存器中允许数字比较器中断通过SS0的中断线传递 // 注意原文强调一次只能设置一个DCONSSn位。这里我们设为SS0。 HWREG(ADC0_BASE ADC_O_IM) ADC_IM_DCONSS0; // 13. 在NVIC中使能ADC0 SS0的中断 ADCIntEnable(ADC0_BASE, 0); // 使能序列器0中断数字比较器中断共用此线 IntEnable(INT_ADC0SS0); IntMasterEnable();步骤4编写中断服务程序当电压超过2.5V时硬件会产生中断。void ADC0SS0_Handler(void) { uint32_t ui32Status; // 读取ADC中断状态并清除 ui32Status ADCIntStatus(ADC0_BASE, 0, true); ADCIntClear(ADC0_BASE, 0); // 检查是否是数字比较器中断 if (ui32Status ADC_DCINSS0) { // 具体是哪个比较器触发的需要读ADCDCISC寄存器 uint32_t ui32DCStatus HWREG(ADC0_BASE ADC_O_DCISC); if (ui32DCStatus ADC_DCISC_DCINT0) { // 数字比较器0触发了中断 // 执行你的保护或处理逻辑例如点亮LED设置故障标志 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1); // 点亮PF1 LED假设已配置 // 清除数字比较器中断状态位 HWREG(ADC0_BASE ADC_O_DCISC) | ADC_DCISC_DCINT0; } } // 注意这里也可能收到普通的序列采样结束中断但因为我们没使能序列器中断(ADC_CTL_IE)且数据去了比较器所以通常不会发生。 }步骤5启动采样最后在主循环中你需要定期或由其他事件触发启动ADC转换。while(1) { // 触发一次ADC采样序列0 ADCProcessorTrigger(ADC0_BASE, 0); // 等待转换完成这里可以用中断也可以忙等。由于我们用了比较器中断这里简单延时即可 // 更优的做法是设置一个定时器来周期性触发ADC采样。 SysCtlDelay(SysCtlClockGet() / 10); // 延时约100ms }实操心得在配置ADCSSOPn和ADCSSDCn时一个常见的疏忽是忘记在ADCSequenceStepConfigure中移除ADC_CTL_IE和ADC_CTL_END位中的ADC_CTL_IE。如果你配置了序列器中断ADC_CTL_IE同时又让数据去了比较器SxDCOP1可能会产生混乱的中断状态。我的建议是当使用数字比较器时采样序列配置中只使用ADC_CTL_CHx和ADC_CTL_END中断完全交给数字比较器单元管理。4. 四种操作模式的波形与场景深度解析只看文字描述可能难以理解四种模式的区别我们结合波形图和具体应用场景来深入分析。假设我们监控一个电压信号COMP0设为1500约1.2VCOMP1设为2500约2.0V。4.1 Always模式持续监控器波形特征只要ADC值落在目标区间内输出中断或触发信号就持续为高电平有效。低区间操作信号值一旦低于1500输出立即变高并保持直到信号值升至1500或以上才变低。高区间操作信号值一旦高于2500输出立即变高并保持直到信号值降至2500或以下才变低。中区间操作信号值在1500至2500之间时输出为高。应用场景“使能”监控例如监控一个使能信号的电平。只有当使能信号在有效电压范围内中区间时后续电路才能工作。你可以用Always模式监控中区间输出信号直接作为后续电路的使能门控。简单报警灯驱动当温度超过安全值高区间时直接点亮报警LED直到温度降回安全范围。注意事项如果信号在阈值附近有微小抖动噪声会导致输出信号频繁跳变形成“毛刺”。这在驱动机械继电器时是致命的会迅速损坏触点。因此Always模式适用于信号干净、稳定的场合或者输出跳变无关紧要的场景。4.2 Once模式边沿事件检测器波形特征仅在ADC值进入目标区间的那一刻产生一个单脉冲输出。之后即使信号一直停留在该区间输出也保持低电平。低区间操作信号从≥1500下降到1500的瞬间输出一个高脉冲。高区间操作信号从≤2500上升到2500的瞬间输出一个高脉冲。中区间操作信号从低区间或高区间进入中区间的瞬间输出一个高脉冲。应用场景启动/停止事件记录记录电机启动电流从0上升进入工作区间或停止电流下降到0的时刻。阈值穿越计数统计电源电压超过某个阈值的次数。每次超过只记录一次事件避免因信号波动重复计数。注意事项Once模式对噪声非常敏感。阈值附近的一个噪声毛刺就可能导致一次误触发。因此它通常需要与前级硬件滤波或软件去抖逻辑结合使用。4.3 滞回Always模式抗抖动卫士波形特征结合了Always模式的持续性和滞回的抗抖动性。以高区间操作为例信号首次超过COMP1(2500)输出变高。信号回落但只要没有低于COMP0(1500)即使回到了中区间1500-2500输出依然保持高电平。只有当信号低于COMP0(1500)进入低区间时输出才变低。之后信号必须再次超过COMP1(2500)输出才会重新变高。应用场景继电器/报警器控制这是最经典的用法。假设用高区间控制一个过热报警继电器。温度超过2500COMP1时继电器吸合报警。温度开始下降但只要不低于1500COMP0继电器就保持吸合防止在临界点比如2490-2510之间因微小波动而频繁吸合释放“抖振”保护继电器寿命。只有当温度充分冷却到1500以下报警才解除。电源状态锁定输入电压过高时系统进入锁定的保护状态。即使电压稍有回落但仍处于危险水平保护状态维持直到电压彻底回落到安全阈值以下。配置要点必须将CIC或CTC字段配置为0x0低区间或0x3高区间。COMP0和COMP1之间的差值就是你的“滞回窗口”。这个窗口需要根据信号噪声幅度和系统响应要求来仔细设定。窗口太小抗噪能力弱窗口太大系统响应迟钝。4.4 滞回Once模式稳定的状态改变报告波形特征可以理解为带滞回功能的Once模式。同样以高区间操作为例初始状态信号在低区间滞回条件清除。信号首次超过COMP1(2500)输出一个高脉冲同时置位滞回条件。之后信号在COMP0和COMP1之间波动甚至回到低区间再进入高区间只要滞回条件未被清除即信号未进入低区间都不会再产生输出脉冲。只有当信号低于COMP0(1500)滞回条件被清除。信号**再次超过COMP1(2500)**时才会产生下一个输出脉冲。应用场景运行周期记录监控一个间歇性工作的设备。设备启动信号进入高区间时记录一次“开始”直到它完全停止信号进入低区间并再次启动才记录下一次“开始”。这确保了每个运行周期只被记录一次无视运行中的波动。防抖动的按钮状态检测如果ADC用于检测模拟电压的按钮按下时电压进入一个范围仅当首次进入时报告“按下”事件即使手指轻微抖动导致电压在该范围内变化也不重复报告直到完全释放电压回落到更低范围才重置状态准备检测下一次按下。5. 高级应用与实战避坑指南掌握了基本配置和模式我们可以探索一些更高级的应用组合并总结那些手册里不会写但实践中一定会踩的坑。5.1 多比较器与多通道协同监控Tiva™ TM4C123BH6ZRB有8个独立的数字比较器而ADC有4个采样序列器每个序列器可以采样多个通道。这提供了强大的灵活性。场景一个三相电机驱动板需要同时监控直流母线电压过压、欠压保护三相电流过流保护散热器温度过热保护方案设计分配采样序列使用SS0、SS1、SS2三个序列器。SS0以高速连续采样三相电流3个通道SS1以中速采样母线电压SS2以低速采样温度。分配数字比较器比较器0、1、2分别监控SS0采样的A、B、C相电流配置为高区间、滞回Always模式触发输出直接连接到PWM的故障输入实现硬件级过流保护纳秒级响应。比较器3监控SS1采样的母线电压配置为高区间过压和低区间欠压两个独立的监控逻辑不一个比较器只能监控一个区间。你需要两个比较器比如比较器3和4分别做过压和欠压保护。比较器5监控SS2采样的温度配置为高区间、Once模式产生中断通知CPU记录过热事件。路由配置通过ADCSSOPn和ADCSSDCn寄存器将SS0的三个采样步骤分别路由到比较器0、1、2将SS1的采样路由到比较器3和4可能需要SS1配置两个采样点或使用两个序列器将SS2的采样路由到比较器5。这样一个复杂的多参数监控系统就由硬件自动完成了CPU只需要处理最上层的逻辑和温度记录即可。5.2 常见问题排查与调试技巧问题1配置了数字比较器但永远不触发中断/触发。检查清单ADC时钟与PLL确认RCGCADC寄存器已使能ADC时钟并且系统PLL已配置并锁定在有效频率如16MHz晶振80MHz系统时钟。ADC对时钟有要求使用不支持的频率会导致异常。采样序列使能确认ADCACTSS寄存器中对应的ASENn位已置1。数据路由确认ADCSSOPn寄存器中的SnDCOP位已置1并且ADCSSDCn寄存器正确指向了目标比较器编号0-7。比较器使能确认ADCDCCTLn寄存器中的CIE中断或CTE触发位已置1。中断使能链路确认ADCIM寄存器中有且仅有一个DCONSSn位被置1例如DCONSS0。确认NVIC中对应的ADC序列中断如ADC0SS0_IRQn已使能。确认全局中断已开启IntMasterEnable()。阈值设置确认ADCDCCMPn中的COMP0和COMP1值设置合理且COMP1 COMP0。用万用表测量实际输入电压并反算ADC值确保信号确实能进入你设定的区间。操作模式与区间匹配检查CIC/CTC和CIM/CTM字段。确保滞回模式没有错误地配给了中区间。问题2中断触发过于频繁或出现误触发。可能原因信号噪声ADC输入信号噪声过大在阈值附近来回跳动。解决方案硬件在ADC输入端增加RC低通滤波电路。软件/配置使用滞回模式并合理设置COMP0和COMP1的差值形成噪声容限窗口。ADC配置启用ADC内部的硬件平均功能配置ADCSAC寄存器例如进行4次或8次采样取平均可以平滑噪声。COMP0/COMP1计算错误电压阈值换算为ADC值时存在浮点误差或计算错误。建议在代码中使用uint32_t类型进行整数运算并打印出设定的阈值进行验证。Once模式误解期望得到持续信号却用了Once模式。根据需求切换为Always或Hysteresis-Always模式。问题3同时使用FIFO和数字比较器时数据混乱。核心原则一个采样步骤的转换结果只能有一个目的地FIFO或数字比较器。这是由ADCSSOPn寄存器中每个采样步骤对应的SnDCOP位控制的。混合使用策略如果同一个通道既需要CPU读取又需要硬件比较你有两个选择使用两个采样步骤在同一个采样序列中为该通道配置两个连续的采样步骤。第一个步骤配置为去FIFOSnDCOP0第二个步骤配置为去数字比较器SnDCOP1。这样一次触发会进行两次转换分别处理。使用两个采样序列器用两个序列器采样同一个ADC通道一个序列器配置为去FIFO另一个配置为去数字比较器。两个序列器可以设置不同的触发源和优先级。问题4数字比较器中断状态无法清除。清除机制数字比较器的原始中断状态在ADCRIS寄存器的INRDC位。而需要清除的是ADCDCISC寄存器中对应的比较器中断位DCINTx。正确操作在中断服务程序中先读取ADCISC寄存器获取是哪个序列器中断线有效然后读取ADCDCISC寄存器判断是哪个比较器触发最后向ADCDCISC寄存器中对应的DCINTx位写1来清除它。清除ADCDCISC会自动清除ADCRIS中的INRDC位。// 在ADC0SS0的中断服务程序中 uint32_t ui32DCStatus HWREG(ADC0_BASE ADC_O_DCISC); if (ui32DCStatus ADC_DCISC_DCINT0) { // 处理比较器0事件... HWREG(ADC0_BASE ADC_O_DCISC) ADC_DCISC_DCINT0; // 写1清除 }切勿忘记清除操作否则会导致中断持续触发。5.3 性能优化与资源考量响应速度数字比较器的最大优势是速度。从ADC转换完成到触发信号输出延迟极短通常在几个时钟周期内。对于保护类应用过流、过压务必使用触发输出直接连接PWM的故障引脚实现硬件死区保护这比任何软件中断都快几个数量级。CPU开销合理规划后CPU开销几乎为零。中断仅在异常事件发生时产生。对于周期性监控你可以用定时器触发ADC采样整个“采样-比较-判断”链条都无需CPU参与。比较器资源只有8个独立比较器。在复杂系统中需要精心分配。对于不需要滞回功能的简单高低限判断可以考虑将COMP0和COMP1设为一个值这样用一个比较器就能实现“超限”判断节省资源。功耗数字比较器是纯数字电路在ADC工作时其功耗增加微乎其微。但在低功耗应用中如果不需要监控功能记得禁用不用的比较器CIE和CTE位清0并考虑停止ADC时钟。数字比较器是Tiva™ C系列微控制器ADC模块中一颗隐藏的明珠。它将程序员从繁琐的软件轮询中解放出来通过硬件实现了可靠、快速的信号监控。从简单的电压检测到复杂的多电机保护系统它都能游刃有余。关键在于理解其“区间划分”和“模式选择”的核心思想并熟练运用ADCDCCMPn、ADCDCCTLn、ADCSSOPn和ADCSSDCn这四个核心寄存器进行配置。