模拟比较器与PWM模块原理及在Stellaris微控制器中的实现

发布时间:2026/7/27 15:15:42
模拟比较器与PWM模块原理及在Stellaris微控制器中的实现 1. 模拟比较器从基础原理到Stellaris实现在嵌入式硬件设计的工具箱里模拟比较器Analog Comparator是一个看似简单却至关重要的“守门员”。它的核心任务纯粹而直接实时比较两个模拟电压的大小并立刻给出一个非此即彼的数字判决——高电平或低电平。这个判决过程本质上是一个高速、开环的“裁决”行为。想象一下一个没有反馈回路的运算放大器它的输出不再试图去逼近某个中间值而是被驱动到电源轨的极限只为清晰地告诉你“V 大于 V-” 还是 “V- 大于 V”。这种将连续的模拟世界转化为绝对的数字判断的能力使其成为系统安全、电源监控、信号调理和事件检测中不可或缺的一环。在德州仪器TI的Stellaris LM3S2950这类微控制器中模拟比较器被集成为了一个功能完整的外设模块。它不再是分立元件而是成为了片上系统SoC的一部分这意味着我们可以通过软件寄存器对其进行精细的配置和控制极大地提升了设计的灵活性和集成度。模块通常包含多个独立的比较器单元LM3S2950有三个每个单元都可以灵活选择输入源外部引脚或内部可编程参考电压并自由配置输出目的地触发中断或直接驱动GPIO引脚。这种集成化设计让我们能够用几行代码就实现过去需要额外芯片和电路才能完成的功能。1.1 核心功能与典型应用场景解析模拟比较器的应用场景广泛其价值在于它提供了一种简单、快速、可靠的模拟信号阈值检测机制。过压与欠压保护OVP/UVP这是最经典的应用之一。将电源电压通过电阻分压后接入比较器的负输入端VIN-将一个稳定的基准电压可以是内部参考电压或外部精密基准源接入正输入端VIN。当电源电压正常时VIN- VIN比较器输出高电平一旦电源电压异常升高导致VIN- VIN比较器输出立即翻转为低电平。这个跳变可以触发微控制器的中断系统能在微秒级内执行关断或保护动作防止后级电路损坏。同理交换输入极性即可实现欠压保护。窗口比较器Window Comparator使用两个比较器可以构建一个窗口检测电路。一个比较器检测信号是否超过上限另一个检测是否低于下限。两个输出通过逻辑门组合可以判断信号是否处于一个安全的“窗口”之内。这在电池电量监测、传感器信号范围校验中非常有用。在Stellaris中我们可以利用两个独立的比较器单元和软件逻辑来实现这一功能。模拟信号到数字事件的转换例如在光电编码器或霍尔传感器应用中传感器输出的模拟正弦波信号需要被转换为方波脉冲以进行计数。将传感器信号接入一个比较器与一个设定的阈值如信号的平均值进行比较即可得到清晰的数字边沿用于精确测量转速或位置。唤醒低功耗系统在电池供电的设备中MCU可能处于深度睡眠状态以节省功耗。我们可以配置一个比较器持续监控某个关键信号如按键电压、传感器信号。当信号超过阈值时比较器输出的跳变可以直接作为唤醒源将MCU从睡眠中拉回实现极低功耗的待机与事件触发。在LM3S2950中比较器的输出不仅可以被软件读取还能直接映射到特定的GPIO引脚如C0o, C1o, C2o这意味着它可以直接驱动外部电路如LED指示灯或作为其他数字电路的输入无需CPU干预实现了纯硬件的快速响应路径。1.2 Stellaris LM3S2950模拟比较器模块架构LM3S2950的模拟比较器模块是一个相对独立且结构清晰的子系统。理解其架构是进行正确配置的前提。模块包含三个完全独立的比较器Comparator 0, 1, 2。每个比较器都是一个完整的比较单元拥有自己的正负输入引脚、控制逻辑和状态寄存器。它们共享一个内部可编程电压参考源这个参考源是一个精密的电阻阶梯网络Resistor Ladder可以通过ACREFCTL寄存器进行配置产生不同的参考电压供各个比较器使用。每个比较器的核心配置围绕两个主要寄存器展开控制寄存器ACCTLn这是“指挥官”。它决定比较器的行为模式包括输入源选择ASRCP正输入端VIN是用外部引脚Cx的电压还是使用模块共享的内部参考电压这个选择决定了比较的基准。输出极性控制CINV是否将比较结果反转这对于匹配不同的逻辑电平或简化电路设计很有用。例如默认VIN VIN-时输出1反转后则输出0。中断触发模式ISEN, ISLVAL配置在何种条件下产生中断。是输出为特定电平时电平触发还是在输出上升沿、下降沿或任意边沿时边沿触发这为软件提供了灵活的事件响应机制。状态寄存器ACSTATn这是“观察员”。它只有一个关键位——输出值位OVAL。软件通过读取这个位可以随时获知当前比较器的数字输出状态是1还是0。模块的中断系统由三个寄存器协同管理构成了一个标准的中断状态机原始中断状态寄存器ACRIS实时反映每个比较器的输出是否满足了中断触发条件无论中断是否被允许。这是一个“事实”记录器。中断使能寄存器ACINTEN软件通过设置此寄存器决定允许哪个比较器的中断请求能继续向上传递。这是一个“开关”。已屏蔽中断状态寄存器ACMIS这是最终提交给CPU的中断状态。它等于ACRIS ACINTEN。只有当中断被使能且触发条件发生时对应的位才会置1。向该位写1可以清除中断标志。重要提示在配置使用模拟比较器功能前有一个极易忽略但至关重要的硬件配置步骤。对于用作模拟输入Cx, Cx-的GPIO引脚必须禁用其数字输入功能。具体操作是清除该引脚在GPIO模块中对应的GPIODEN寄存器的位。如果不这样做数字输入缓冲器会试图对模拟电压进行采样可能导致引脚电流异常增大甚至影响模拟信号的准确性。这是混合信号设计中的一个常见陷阱。2. 内部可编程参考电压的配置与计算Stellaris模拟比较器模块的一个亮点是其集成的内部参考电压源。它省去了外部分压电路提高了集成度和可靠性。这个参考源本质上是一个连接在模拟电源AVDD和地之间的电阻分压网络并通过一个多路选择器MUX将不同的分压点引出。2.1 参考电压源结构详解如图15-3所示内部参考结构是一个电阻阶梯。关键的控制在于ACREFCTL寄存器的三个字段EN使能位第9位这是总开关。置1电阻阶梯上电参考电压源工作置0则完全断电以节省功耗。在初始化时必须先使能此位参考电压才会稳定。RNG范围位第8位此位选择电阻阶梯的总电阻值从而决定参考电压的范围。RNG0总电阻为31R。此时参考电压范围较高计算公式为VREF (VREF字段值 / 32) * AVDD。例如当AVDD为3.3VVREF16时VREF (16/32)*3.3V 1.65V。其可用范围大约是0.85V到2.448V对应VREF值约8到23。RNG1总电阻为23R。此时参考电压范围较低且包含0V计算公式为VREF (VREF字段值 / 24) * AVDD。同样AVDD3.3VVREF12时VREF (12/24)*3.3V 1.65V。其可用范围是0V到2.152V对应VREF值0到15。VREF电压选择字段第3-0位这是一个4位字段值从0到15。它控制着多路选择器连接到电阻阶梯的哪个抽头。不同的RNG模式下相同的VREF值对应的实际电压不同。2.2 配置实例与计算过程假设我们的系统AVDD为3.3V我们需要为比较器0配置一个1.65V的内部参考电压且希望参考电压范围能包含0V即选择RNG1模式。确定VREF值根据公式VREF (VREF字段值 / 24) * 3.3V 1.65V。 解方程VREF字段值 (1.65V * 24) / 3.3V 12。 因此VREF字段应设置为12二进制1100。组合寄存器值EN 1使能参考源RNG 1选择23R模式范围0-2.152VVREF 12二进制1100寄存器ACREFCTL的其他位均为保留位必须写0。 所以ACREFCTL寄存器的值应为EN在位9RNG在位8VREF在位3-0。 计算(19) | (18) | 12 0x200 | 0x100 | 0xC 0x30C。因此我们需要向ACREFCTL寄存器写入0x0000030C这里的高位是保留位通常为0。写入后内部参考电压源就会稳定输出1.65V可供所有比较器选用。实操心得内部参考的精度与稳定性片内电阻阶梯的绝对精度通常一般可能误差在±5%到±10%且受温度影响。对于需要高精度阈值比较的应用如精密电源监控建议使用外部精密基准电压源如TL431、REF30xx系列连接到比较器的外部输入引脚。内部参考更适合对精度要求不高的场景如电池粗略电量指示、非关键信号的过载检测等。3. 模拟比较器的完整配置流程与代码实现理解了原理和寄存器后我们来完成一个完整的配置示例将比较器0配置为使用内部1.65V参考电压作为正端输入负端接外部引脚C0-输出不反转并使其能产生中断。3.1 配置步骤拆解以下是基于Stellaris外设驱动库DriverLib风格的手动寄存器操作流程使能外设时钟任何外设在使用前必须让系统控制器为其提供时钟。模拟比较器模块的时钟由RCGC1寄存器控制。// 假设使用系统控制寄存器基址 #define SYSCTL_RCGC1_R (*((volatile uint32_t *)0x400FE104)) // 使能模拟比较器模块时钟ACMP0在RCGC1的位20 SYSCTL_RCGC1_R | 0x00100000; // 插入少量延时等待时钟稳定 __asm__ volatile(nop); __asm__ volatile(nop);配置GPIO引脚将用作模拟输入的引脚此处是C0-对应的GPIO引脚配置为模拟功能。找到C0-对应的GPIO端口和引脚根据数据手册LM3S2950的C0-对应某个GPIO引脚例如PF2。将该引脚的方向设置为输入GPIODIR寄存器相应位清0。关键一步禁用该引脚的数字输入功能即清除GPIODEN寄存器中对应的位。这是为了避免数字输入缓冲器干扰模拟信号。通常不需要设置上下拉GPIOPUR/GPIOPDR因为模拟输入阻抗很高。// 假设C0-对应PF2 #define GPIO_PORTF_DEN_R (*((volatile uint32_t *)0x4002551C)) // 禁用PF2的数字输入 GPIO_PORTF_DEN_R ~(12);配置内部参考电压如前所述配置ACREFCTL寄存器产生1.65V参考。#define ACMP_ACREFCTL_R (*((volatile uint32_t *)0x4003C010)) ACMP_ACREFCTL_R 0x0000030C; // EN1, RNG1, VREF12 // 等待参考电压稳定通常需要几个微秒 for(volatile int i0; i100; i);配置比较器0控制寄存器这是核心配置。设置ASRCP字段为1选择内部参考电压作为正端输入VIN。设置CINV为0输出不反转。设置ISEN和ISLVAL以配置中断。例如设置ISEN0x0电平触发ISLVAL1当输出为高电平时产生中断。必须设置ASRCP位这是手册中强调的步骤在启用比较器功能前必须完成。#define ACMP_ACCTL0_R (*((volatile uint32_t *)0x4003C024)) // ASRCP1 (内部参考), ISEN0 (电平), ISLVAL1 (高电平触发), CINV0 // 位10-9是ASRCP值为1。位3-2是ISEN值为0。位4是ISLVAL值为1。 ACMP_ACCTL0_R (19) | (14); // 0x0400 | 0x0010 0x0410使能比较器中断在模块级中断使能寄存器中开启比较器0的中断。#define ACMP_ACINTEN_R (*((volatile uint32_t *)0x4003C008)) ACMP_ACINTEN_R | (10); // 使能比较器0中断同时别忘了在NVIC嵌套向量中断控制器中使能模拟比较器模块的中断通道并编写对应的中断服务函数ISR。读取比较器状态在中断服务函数或主循环中可以通过读取ACSTAT0寄存器的OVAL位来获取当前输出值。#define ACMP_ACSTAT0_R (*((volatile uint32_t *)0x4003C020)) uint32_t comparator_output (ACMP_ACSTAT0_R 1) 0x01; // 读取OVAL位位13.2 一个完整的初始化函数示例void AnalogComparator0_Init(void) { // 1. 使能时钟 SYSCTL_RCGC1_R | 0x00100000; // 使能ACMP时钟 volatile uint32_t delay SYSCTL_RCGC1_R; // 空读确保时钟稳定 // 2. 配置C0-引脚假设为PF2为模拟输入 // 使能GPIOF时钟 SYSCTL_RCGC2_R | 0x00000020; delay SYSCTL_RCGC2_R; // 清除PF2的DIGITAL ENABLE GPIO_PORTF_DEN_R ~(12); // 确保PF2方向为输入复位后默认即为输入 // 3. 配置内部参考电压为1.65V ACMP_ACREFCTL_R 0x0000030C; // EN1, RNG1, VREF12 for(delay0; delay1000; delay); // 简单延时等待稳定 // 4. 配置比较器0内部参考为正端电平触发高电平触发中断 ACMP_ACCTL0_R (19) | (14); // ASRCP01, ISLVAL1 // 5. 使能模块内比较器0中断 ACMP_ACINTEN_R | (10); // 6. 配置NVIC假设ACMP中断号为14 NVIC_EN0_R | (114); // 在NVIC中使能中断 // IntRegister(INT_ACOMP0, AnalogComparator0_ISR); // 注册中断函数需具体实现 } // 中断服务函数示例 void AnalogComparator0_ISR(void) { // 读取并清除中断标志 uint32_t int_status ACMP_ACMIS_R; ACMP_ACMIS_R int_status; // 写1清除对应位 if(int_status 0x01) { // 检查是否是比较器0中断 uint32_t output_state (ACMP_ACSTAT0_R 1) 0x01; // 根据output_state执行相应操作例如触发ADC采样、改变GPIO状态等 if(output_state) { // 比较器输出为高VIN VIN- // 执行相关任务... } else { // 比较器输出为低VIN VIN- // 执行相关任务... } } }4. PWM模块数字世界模拟化的核心引擎如果说模拟比较器是将模拟量转化为数字判决那么脉冲宽度调制PWM则是其逆向过程——用数字方法精确地控制模拟量。PWM的核心思想是生成一个固定频率的方波并通过改变方波中高电平所占的时间比例即占空比来等效一个模拟电压的平均值。占空比越大平均电压越高占空比越小平均电压越低。这种技术完美地桥接了微控制器的数字输出与外部模拟执行器如电机、LED、加热丝之间的鸿沟。Stellaris LM3S2950的PWM模块是一个功能强大且灵活的定时器系统专为复杂的电机控制和功率转换应用而设计。它远不止是简单的定时器输出比较而是一个包含同步、死区、故障保护等高级功能的完整信号生成引擎。4.1 PWM模块架构与核心组件模块由三个相同的**PWM发生器块Generator Block和一个输出控制块Output Control Block**构成。每个发生器块能独立产生两路PWM信号PWMxA和PWMxB因此总共可提供6路独立的PWM输出。每个PWM发生器块是其心脏包含以下关键子模块16位计数器Timer这是PWM信号的节拍器。它有两种基本工作模式递减计数模式Down Mode计数器从装载值LOAD递减到0然后立即重载周而复始。此模式产生边沿对齐的PWM波形信号边沿发生在计数器为0或LOAD的时刻。递增/递减计数模式Up/Down Mode计数器从0递增到LOAD然后递减回0如此循环。此模式产生中心对齐的PWM波形信号变化对称地分布在计数周期两侧。这种模式能显著减少电机驱动中的谐波噪声是三相逆变器驱动的首选。两个PWM比较器Comparator A/B每个比较器持续将计数器的当前值与一个用户设定的比较值CMPA, CMPB进行比较。当匹配发生时会产生一个短暂的高脉冲。在递增/递减模式下匹配事件会区分“向上匹配”和“向下匹配”。PWM信号发生器Signal Generator这是逻辑控制中心。它接收来自计数器零点和装载点和比较器匹配点的事件脉冲并根据用户预先在PWMnGENA和PWMnGENB寄存器中设定的“动作表”来驱动两路PWM输出PWMA和PWMB的电平。例如可以设定“在计数器向上计数匹配CMPA时将PWMA置高在计数器向下计数匹配CMPA时将PWMA置低”从而生成一个中心对齐、占空比由CMPA决定的PWM波。死区发生器Dead-Band Generator这是驱动半桥或全桥功率电路的安全卫士。它接收信号发生器送来的一路原始PWM信号生成两路互补的、带有可编程延迟的PWM信号。一路在原始信号上升沿后延迟开启另一路在原始信号下降沿后延迟开启。这个“延迟”就是死区时间确保同一桥臂的上管和下管不会因为开关速度不同而出现同时导通的“直通”现象从而烧毁功率器件。中断选择器允许用户选择计数器事件零、装载、匹配A/B上/下中的任何一个或组合作为中断源从而在PWM波形的特定位置精确触发CPU中断用于更新比较值实现闭环控制或执行其他任务。输出控制块则负责最后的信号路由与修饰。它可以独立启用或禁用每一路PWM输出到引脚。对任何一路输出进行极性反转将主动高变为主动低。配置故障输入Fault信号如何快速禁用指定的PWM输出实现硬件级保护。同步多个PWM发生器的计数器确保多路信号之间的严格相位关系。4.2 PWM信号生成机制深度解析理解动作表是灵活运用PWM发生器的关键。以生成一对中心对齐、互补的PWM信号为例常用于半桥驱动假设计数器工作在递增/递减模式。我们需要定义PWMA和PWMB在以下六个事件发生时的动作计数器0Zero计数器LOAD向上计数匹配CMPACMPA Up向下计数匹配CMPACMPA Down向上计数匹配CMPBCMPB Up向下计数匹配CMPBCMPB Down。对于PWMA控制上管在CMPA Up事件时动作设置为“驱动为高”Drive High。在CMPA Down事件时动作设置为“驱动为低”Drive Low。其他四个事件动作设置为“无操作”Do Nothing。对于PWMB控制下管我们希望它与PWMA互补在CMPA Down事件时即PWMA变低时动作设置为“驱动为高”。在CMPA Up事件时即PWMA变高时动作设置为“驱动为低”。其他事件“无操作”。这样我们就用CMPA一个参数同时控制了两路信号的占空比且它们天然互补。然后将PWMA送入死区发生器生成最终带死区延迟的两路桥臂驱动信号。同步与更新机制在复杂的多相控制如三相电机中保持各相PWM的同步至关重要。PWM模块提供了两种更新比较值CMPA/B和装载值LOAD的模式立即更新新写入的值在当前计数周期结束后计数器归零时立即生效。这可能导致不同发生器块的值在不同周期更新引起相位抖动。同步更新新写入的值先被缓存。当软件触发一个全局同步信号通过PWMSYNC寄存器时所有配置为同步更新的发生器块会在各自的下一个计数器归零时刻统一采用新值。这保证了所有PWM通道在同一时刻平滑切换到新的调制模式对于矢量控制等算法至关重要。5. PWM模块配置实战生成带死区的互补PWM让我们以控制一个直流有刷电机的H桥为例配置PWM发生器0产生一对频率为20kHz占空比50%且带有1us死区时间的互补PWM信号PWM0和PWM1。假设系统时钟为50MHz。5.1 参数计算与寄存器配置计算装载值LOAD确定频率 PWM频率由计数器时钟和装载值决定。计数器时钟一般为系统时钟分频后的PWM时钟。假设我们使用不分频即PWM时钟系统时钟50MHz。 在递增/递减模式下一个完整的PWM周期是计数器从0到LOAD再到0的过程共计2 * LOAD个时钟周期。 因此PWM频率Fpwm Fpwm_clk / (2 * LOAD)。 我们需要Fpwm 20kHz所以LOAD Fpwm_clk / (2 * Fpwm) 50,000,000 / (2 * 20,000) 1250。 装载值PWM0LOAD应设置为1250。计算比较值CMPA确定占空比 占空比定义为高电平时间与整个周期时间的比值。在中心对齐模式下高电平时间对应于计数器从LOAD - CMPA计数到LOAD再向下计数到LOAD - CMPA的这一段区间。 更直观的公式是占空比 CMPA / LOAD。 我们需要50%占空比所以CMPA LOAD * 0.5 1250 * 0.5 625。 比较值PWM0CMPA应设置为625。计算死区时间参数 死区时间由两个寄存器PWM0DBRISE上升沿延迟和PWM0DBFALL下降沿延迟控制其值代表延迟的时钟周期数。 我们需要1us的死区时间。系统时钟周期Tclk 1 / 50MHz 0.02us。 因此死区时钟周期数DB_COUNT 1us / 0.02us 50。 我们将PWM0DBRISE和PWM0DBFALL都设置为50。5.2 配置流程与代码void PWM_Generator0_Init(void) { // 1. 使能PWM模块和对应GPIO端口的时钟 SYSCTL_RCGC0_R | 0x00100000; // 使能PWM模块时钟 SYSCTL_RCGC2_R | 0x00000020; // 使能GPIOF时钟假设PWM0,1在PF0,PF1 volatile uint32_t delay SYSCTL_RCGC2_R; // 2. 配置GPIO引脚为PWM功能 // 假设PWM0对应PF0PWM1对应PF1 GPIO_PORTF_AFSEL_R | 0x03; // 使能PF0和PF1的备用功能 GPIO_PORTF_PCTL_R (GPIO_PORTF_PCTL_R 0xFFFFFF00) | 0x00000055; // 配置PF0,1为PWM功能 GPIO_PORTF_DEN_R | 0x03; // 使能数字功能 GPIO_PORTF_DIR_R | 0x03; // 设置为输出方向 // 3. 配置PWM发生器0 // 先禁用发生器以便配置 PWM0_CTL_R ~0x00000001; // 清除PWM0ENABLE位假设PWM0_CTL_R是PWM0控制寄存器地址 // 配置计数器模式为递增/递减并设置同步更新模式可选 PWM0_CTL_R (0x0 0); // 模式递增/递减模式。如果需要立即更新此位为0。 // 配置装载值和比较值 PWM0_LOAD_R 1250 - 1; // 装载值注意有些硬件要求写入N-1 PWM0_CMPA_R 625 - 1; // 比较器A值 // 比较器B本例未使用可设为0或LOAD // 配置死区控制 PWM0_DBCTL_R | 0x00000001; // 使能死区发生器 PWM0_DBRISE_R 50 - 1; // 上升沿延迟 PWM0_DBFALL_R 50 - 1; // 下降沿延迟 // 配置动作发生器PWM0GENA和PWM0GENB // 对于PWMA上管在CMPA Up时置高CMPA Down时置低 PWM0_GENA_R (0x3 0) | (0x2 4); // 位[3:0]对应CMPA Up动作0x3(驱动高)位[7:4]对应CMPA Down动作0x2(驱动低) // 对于PWMB下管我们希望与PWMA互补但通过死区发生器实现这里PWMB可以配置为与PWMA相同或常低由死区发生器生成互补信号。 // 更常见的做法是将发生器配置为生成互补对模式。许多PWM模块有直接生成互补对的模式。 // 以Stellaris为例可以通过配置PWM0_GENB_R来让PWMB直接作为PWMA的互补输出在死区前。 // 假设我们配置PWMB在CMPA Down时置高CMPA Up时置低与PWMA反相。 PWM0_GENB_R (0x2 0) | (0x3 4); // CMPA Up动作0x2(驱动低)CMPA Down动作0x3(驱动高) // 4. 配置输出控制块 // 使能PWM0和PWM1输出 PWM_ENABLE_R | 0x0003; // 使能PWM0和PWM1输出位 // 如果需要反相输出低电平有效在此配置PWMINVERT寄存器 // 5. 重新使能PWM发生器0 PWM0_CTL_R | 0x00000001; // 置位PWM0ENABLE }注意事项死区生成的两种方式上述代码展示了一种方式配置两路独立的PWM信号PWMA和PWMB为互补关系然后让其中一路通过死区发生器。另一种更简洁的方式是PWM模块通常提供“互补对”模式。在此模式下只需配置一路PWMA的动作并启用死区发生器模块会自动生成PWMA和其互补信号PWMB带死区。需要查阅具体数据手册中PWMnCTL寄存器的“MODE”位或类似功能。6. 模拟比较器与PWM的协同应用案例将模拟比较器和PWM结合可以构建高效的闭环控制系统。一个典型的应用是基于电流斩波的步进电机微步驱动。场景我们使用PWM驱动一个步进电机驱动芯片如DRV8825来微步控制电机。为了限制电机绕组电流我们通常在绕组上串联一个小的采样电阻将电流转化为电压。实现方案PWM角色PWM发生器产生频率固定的PWM信号控制电机驱动芯片的电流调节端。占空比决定了目标电流值。模拟比较器角色将采样电阻两端的电压代表实际电流放大后接入模拟比较器的一个输入端例如C0-。另一个输入端C0连接一个由DAC或PWM滤波产生的可编程阈值电压这个阈值对应我们设定的目标电流峰值。闭环控制流程初始时PWM输出一个占空比电机绕组电流开始上升。当电流采样电压超过比较器设定的阈值电压时比较器输出翻转例如从低变高。这个翻转信号可以连接到PWM模块的故障输入Fault引脚或者触发一个高优先级中断。如果使用故障引脚可以配置PWM输出控制块使得当Fault信号有效时立即强制相关的PWM输出进入安全状态低电平从而关闭功率管电流开始下降。当电流下降到阈值以下比较器输出恢复Fault解除PWM自动恢复输出。这就形成了一个硬件实现的、响应速度极快的峰值电流限制环也称为“斩波”控制。如果使用中断在比较器中断服务程序中软件可以迅速修改PWM的占空比或直接禁用PWM输出实现电流调节。虽然速度比硬件Fault慢但更灵活可以实现更复杂的控制算法如PID。这种硬件比较器PWM故障保护的组合实现了对电流的实时、无延迟监控是保护功率电路和电机免受过流损坏的关键技术。软件则可以在更高的层次上调整电流阈值通过改变DAC输出或内部参考电压和PWM占空比实现速度、位置等闭环控制。7. 常见问题排查与调试技巧在实际开发中模拟比较器和PWM模块可能会遇到一些典型问题。以下是一些排查思路模拟比较器无输出或输出不稳定检查时钟与电源确认已通过RCGC1寄存器使能了模拟比较器模块时钟并等待了足够的时间通常几个时钟周期让时钟稳定。检查模拟电源AVDD是否稳定、干净。验证GPIO配置这是最常见的问题。务必确认用作模拟输入Cx, Cx-的引脚已禁用数字输入清除GPIODEN对应位。同时确保没有意外使能了内部上拉/下拉电阻。确认内部参考已使能如果使用内部参考检查ACREFCTL寄存器的EN位是否已置1并等待了足够的稳定时间数据手册会给出典型值通常几微秒到几十微秒。检查输入电压范围确保待比较的电压在芯片允许的模拟输入电压范围内通常为0V到AVDD。超出范围可能导致比较器工作异常或损坏。注意噪声与滞后比较器对输入噪声很敏感在阈值附近微小的噪声可能导致输出频繁抖动。如果应用允许可以考虑在软件中增加去抖逻辑如连续多次读取确认或者如果芯片支持启用比较器的内置迟滞功能某些型号有。PWM无输出或频率/占空比不对时钟与分频首先确认PWM模块的时钟已使能RCGC0寄存器。然后检查PWM时钟分频器配置PWMnCTL中的分频位。错误的时钟源或分频系数是导致频率不对的首要原因。输出使能确认PWMENABLE寄存器中对应PWM输出位的使能位已经置1。同时检查对应的GPIO引脚是否已正确配置为PWM功能AFSEL置1PCTL选择正确。发生器使能确认PWMnCTL寄存器中的ENABLE位或类似功能位已置1。在配置过程中建议先清除此位配置完所有参数后再置位。装载值与比较值关系在递减模式下确保比较值CMPA/B小于或等于装载值LOAD。如果比较值大于装载值则永远不会发生匹配事件PWM输出可能常高或常低。在递增/递减模式下比较值也应介于0和LOAD之间。动作生成器配置仔细检查PWMnGENA/B寄存器的配置。每个事件Zero, Load, CMPA Up/Down, CMPB Up/Down对应的动作无操作、驱动高、驱动低、翻转是否正确。一个错误的动作设置会导致波形完全不符合预期。死区时间异常如果死区时间看起来无效或不对检查PWMnDBCTL是否已使能并确认PWMnDBRISE和PWMnDBFALL的值是否基于正确的PWM时钟周期计算。过长的死区时间会导致有效占空比严重缩小。中断无法触发中断使能链检查三个层级的使能1) 外设模块级中断使能如ACINTEN或PWMnINTEN2) 中断控制器级使能如NVIC中的对应中断号3) 全局中断使能CPSR中的I位通常由__enable_irq()函数打开。中断标志清除在中断服务函数中必须清除对应的中断标志位通常是向ACMIS或PWMnISC寄存器的相应位写1。如果忘记清除中断会持续触发导致系统卡死。触发条件确认中断触发条件边沿、电平设置是否符合实际信号变化。例如如果配置为上升沿触发但信号始终为高则不会进入中断。调试时最有效的工具是示波器和逻辑分析仪。用示波器观察比较器的输入引脚电压和输出引脚如果使能了输出到引脚波形可以直观判断比较器是否在工作。用逻辑分析仪同时抓取PWM输出、故障引脚、以及关键的GPIO控制信号可以清晰地分析时序问题特别是死区时间是否准确插入。在软件中通过读取ACSTATn或PWMnCOUNT等状态寄存器的值也能帮助判断模块的内部状态。