TMS320F280015x CMPSS硬件保护实战:从比较器到EPWM的快速关断
2026/7/20 10:55:51 网站建设 项目流程

1. 项目概述与核心价值

在电机控制、数字电源或者任何需要快速响应模拟信号变化的实时控制系统中,硬件级的保护机制是确保系统可靠性的基石。想象一下,你的电机驱动器正在全速运行,电流传感器反馈的电压突然飙升,如果全靠软件去读取ADC、再做判断、最后关断PWM,这个延迟可能导致功率管瞬间烧毁。这时候,一个能直接“硬连线”到PWM生成模块的比较器就显得至关重要。TMS320F280015x这款实时微控制器内置的比较器子系统(CMPSS),正是为此而生的硬件利器。

简单来说,CMPSS就是一个集成了比较器、内部DAC(数模转换器)和数字滤波器的模块。它的核心任务非常直接:实时比较一个外部模拟输入信号和一个内部可编程的参考电压(由DAC产生),然后根据比较结果,直接输出一个数字信号(CTRIPx)去控制EPWM模块,实现纳秒级的快速关断或动作。这完全绕开了CPU,是真正的硬件保护。我最近在一个伺服驱动器的过流保护项目中深度使用了这个模块,感触颇深。官方手册虽然详尽,但寄存器列表看得人眼花缭乱,实际配置时哪些位是关键,如何与EPWM联动,这些实战细节往往需要反复调试才能摸清。

本文将围绕TMS320F280015x的CMPSS模块,结合一个具体的EPWM触发保护实例,拆解其工作原理、寄存器配置的每一个关键步骤,并分享我在调试过程中遇到的“坑”和解决技巧。无论你是正在评估F280015x用于新项目,还是正在调试现有的保护电路,相信这些从实践中得来的细节都能让你少走弯路。

2. CMPSS架构与核心工作机制解析

要玩转CMPSS,不能只停留在“配置寄存器”的层面,必须理解其内部的数据流和控制逻辑。我们可以把CMPSS想象成一个高度可配置的“模拟哨兵”。

2.1 核心信号通路与模块构成

一个完整的CMPSS实例包含两个独立的比较器通道:高比较器(COMPH)和低比较器(COMPL)。每个通道都拥有自己的一套“装备”:

  1. 模拟比较器:核心,负责执行Vp(同相端)与Vn(反相端)的电压比较。
  2. 内部12位DAC:为比较器的反相端(Vn)提供高精度的参考电压。这个DAC的值可以静态设置,也可以由一个“斜坡发生器”动态驱动,后者常用于实现逐周期电流限制等高级功能。
  3. 数字滤波器:比较器的原始输出是高速变化的,容易受噪声影响。数字滤波器通过一个可配置的采样窗口和阈值(多数表决逻辑),对原始信号进行消抖,产生稳定的数字输出CTRIPx
  4. 输出选择逻辑:这是灵活性的关键。你可以选择将滤波前的异步比较器输出、同步后的输出、滤波后的输出,或者滤波后并锁存的输出,作为最终的CTRIPx信号。这个选择决定了响应速度和抗噪能力的平衡。
  5. 斜坡发生器:一个由EPWM同步信号触发的计数器,可以递增或递减,其输出值可以直接作为内部DAC的输入,从而产生一个随时间线性变化的参考电压。

在我的项目中,主要用到了高比较器通道。外部电流采样信号经调理后送入CMPIN2P(即Vp),内部DAC设置为VDD/2(约1.65V)作为Vn。当电流过大,CMPIN2P电压超过1.65V时,比较器翻转。

2.2 与EPWM的联动机制:Trip-Zone的奥秘

CMPSS的输出CTRIPHCTRIPL并不是直接去控制一个GPIO,它的首要任务是连接到EPWM模块的Trip-Zone子模块。这是实现硬件级保护的核心链路。

每个EPWM模块都有多个TZ输入(如TZ1, TZ2, TZ3)。你可以通过GPIO多路复用器,将某个CMPSS的CTRIPOUTH信号映射到某个EPWM的TZ输入上。一旦TZ信号被触发,EPWM可以根据预先的配置,立即采取行动,例如:

  • 强制PWM输出为高电平(适合关断上管,开通下管)。
  • 强制PWM输出为低电平
  • 高阻态输出
  • 不动作(仅产生中断)。

这个动作是“原子级”的,无需CPU干预。在我的配置里,CTRIPOUTH被连接到EPWM7的TZ输入,并配置为“强制高”。这样,一旦过流发生,PWM7B(GPIO29)会立即被拉高,关断桥臂,实现保护。

关键理解CTRIPH是CMPSS模块内部的信号,而CTRIPOUTH是经过输出选择逻辑后,真正送到芯片引脚映射逻辑的信号。配置时,我们通常关心的是CTRIPOUTH的来源。

3. 从零开始:一个完整的CMPSS配置实例

下面,我将以“用CMPSS2的COMPH监控CMPIN2P,超阈值后触发EPWM7关断”为例,展示从寄存器配置到硬件连接的完整流程。我们假设系统时钟已配置,GPIO多路复用器(GPIO MUX)的基础概念已了解。

3.1 硬件连接与引脚复用规划

首先,根据芯片数据手册的引脚描述表,找到CMPIN2P对应的引脚。在F280015x上,CMPIN2P通常与ADCINA9等模拟引脚复用。我们需要通过CMPHPMXSEL这类寄存器(属于Comparator模块的输入选择寄存器,可能在CMPSS或ANALOG子系统相关章节)来选择其信号源。

在我的板子上,我将电流采样运放的输出连接到了ADCINA9引脚。因此,需要配置:

  • CMPHPMXSEL(可能位于CMPSSANALOG相关寄存器)设置为2,表示CMPIN2P信号来自ADCINA9引脚。
  • GPIO29配置为EPWM7B功能。
  • GPIO4配置为CTRIPOUTH功能,方便我们用示波器观察这个跳变信号。

3.2 关键寄存器配置详解(基于DriverLib风格)

直接操作寄存器地址容易出错,TI提供的DriverLib库函数极大地简化了配置。但理解寄存器每一位的含义,对于调试和解决复杂问题不可或缺。下面我用“寄存器位域+DriverLib函数”结合的方式说明。

步骤1:使能CMPSS模块并配置比较器首先是COMPCTL寄存器,这是大脑。

// 假设使用CMPSS2, DriverLib函数示例 CMPSS_configHighComparator(CMPSS2_BASE, CMPSS_INSRC_DAC, // 高比较器反相端输入源:内部DAC CMPSS_INV_INVERT, // 输出不反相 (COMPHINV=0) CMPSS_HYST_DISABLE); // 初始禁用迟滞 CMPSS_configLowComparator(CMPSS2_BASE, CMPSS_INSRC_DAC, CMPSS_INV_INVERT, CMPSS_HYST_DISABLE); CMPSS_enableModule(CMPSS2_BASE); // 设置COMPDACE=1,使能整个模块
  • COMPHSOURCE=0:至关重要。这表示高比较器的反相端(Vn)连接内部DAC,而不是外部引脚。这是我们使用内部参考电压的前提。
  • COMPHINV=0:输出不反向。即当Vp > Vn时,原始比较器输出为高。这符合我们的直觉:输入电压超过参考电压,触发保护。

步骤2:配置内部DAC参考值我们希望DAC输出VDD/2。对于12位DAC,满量程参考通常是VDDA(模拟电源,通常与VDD一致)。若VDDA=3.3V,则VDD/2=1.65V。DAC值计算公式为:DAC_Value = (Vdesired / VDDA) * 40951.65V / 3.3V * 4095 = 2047.5 ≈ 2047 (0x7FF)

// 设置高DAC的静态值 CMPSS_setDACValueHigh(CMPSS2_BASE, 2047); // 写入DACHVALS影子寄存器 // DriverLib内部会处理影子到活动寄存器的加载触发,通常我们选择SYSCLK触发(COMPDACHCTL.SWLOADSEL=0)

这里配置的是DACHVALS(影子寄存器)。DACSOURCE位默认为0,意味着DAC值来自影子寄存器DACHVALS,而非斜坡发生器。SWLOADSEL位决定了影子寄存器值加载到活动寄存器DACHVALA的时机(SYSCLK或EPWMSYNCPER),对于静态DAC,用SYSCLK即可。

步骤3:配置数字滤波器为了防止噪声引起误触发,必须启用滤波器。这涉及到CTRIPHFILCTLCTRIPHFILCLKCTL两个寄存器。

// 配置高比较器数字滤波器 CMPSS_configFilterHigh(CMPSS2_BASE, CMPSS_FILT_IN_COMPH, // 滤波输入源:高比较器输出 (FILTINSEL=0) 6, // 采样窗口大小 SAMPWIN = 6 (实际窗口=6+1=7个采样点) 4); // 表决阈值 THRESH = 4 (实际阈值=4+1=5) // 配置滤波器采样时钟预分频 // 假设系统时钟SYSCLK = 100MHz,我们希望滤波器采样频率为10MHz(周期100ns) // 预分频值 = SYSCLK / 期望采样频率 - 1 = 100MHz/10MHz - 1 = 9 CMPSS_setFilterClkPreScalerHigh(CMPSS2_BASE, 9); // 写入CTRIPHFILCLKCTL.CLKPRESCALE
  • SAMPWIN=6:表示滤波器会持续监测7个连续的采样点。
  • THRESH=4:表示需要在这7个采样点中,至少有5个点状态一致(例如都为高),滤波器的输出才会改变状态。这提供了很好的噪声免疫力。
  • 采样时钟:决定了滤波器的响应速度。100ns的采样周期,加上7个样本的窗口,意味着对于稳定的输入信号,滤波器输出延迟最大约为7 * 100ns = 700ns。这个延迟对于大多数电力电子保护(通常要求几微秒内响应)是可接受的。

步骤4:配置输出选择与连接EPWM这是将CMPSS与EPWM关联起来的关键一步,通过COMPCTL寄存器的CTRIPHSELCTRIPOUTHSEL位域控制。

// 选择CTRIPH和CTRIPOUTH的信号源为数字滤波器的输出 CMPSS_setOutputSignalHigh(CMPSS2_BASE, CMPSS_OUTPUT_FILTER, // CTRIPHSEL = 2, CTRIPH来自滤波器输出 CMPSS_OUTPUT_FILTER); // CTRIPOUTHSEL = 2, CTRIPOUTH也来自滤波器输出

这里我选择滤波器的输出(CMPSS_OUTPUT_FILTER)作为最终触发信号。你也可以选择CMPSS_OUTPUT_LATCH(锁存后的滤波器输出),其特点是需要软件或同步信号清零,适合需要保持故障状态直到被明确复位的场景。

步骤5:配置GPIO与EPWM Trip-Zone最后,需要将CTRIPOUTH信号路由到EPWM模块,并配置EPWM的Trip-Zone动作。

// 1. 配置GPIO4为异步CTRIPOUTH功能 (具体函数名需参考GPIO DriverLib) GPIO_setPinConfig(GPIO_4_CTRIPOUTH); // 2. 配置GPIO29为EPWM7B功能 GPIO_setPinConfig(GPIO_29_EPWM7B); // 3. 配置EPWM7的Trip-Zone子模块 EPWM_enableTripZoneSignals(EPWM7_BASE, EPWM_TZ_SIGNAL_CTRIPH); // 使能CTRIPH作为TZ源 EPWM_setTripZoneAction(EPWM7_BASE, EPWM_TZ_ACTION_EVENT_TZA, // 针对TZA事件(CTRIPH映射到此) EPWM_TZ_ACTION_HIGH); // 动作:强制输出高 (CBC模式) EPWM_enableTripZoneCBC(EPWM7_BASE); // 使能基于逐周期(Cycle-By-Cycle)的Trip保护

EPWM_TZ_ACTION_HIGH意味着当Trip事件发生时,EPWM7B会立即被强制输出高电平。在H桥驱动中,这通常意味着让对应桥臂的下管导通(如果PWM高电平代表上管开通),形成续流路径,这是安全的关断状态。

4. 调试与验证:示波器上的真相

配置完成后,如何验证?理论通了,硬件上未必一次成功。以下是我的调试 checklist:

  1. DAC输出验证:最基础的一步。暂时断开外部输入,将CMPIN2P通过一个高阻探头(如1MΩ)接到已知电压(如GND)。由于Vp < VnCTRIPOUTH(GPIO4)应始终为低。用示波器测量DACOUTH引脚(如果芯片引出)或通过ADC读取内部DAC电压寄存器(如果支持),确认其是否为设定的1.65V。我踩过的坑:曾忘记使能DAC模块的模拟部分(有时需要单独的DACCTL寄存器),导致DAC无输出,比较器永远不动作。

  2. 比较器基本功能验证:向CMPIN2P输入一个可调的直流电压。从0V缓慢调至3.3V。用示波器双通道同时监测输入电压和GPIO4 (CTRIPOUTH)。当输入电压超过1.65V时,GPIO4应从低电平跳变为高电平。跳变点是否精确在1.65V?这考验DAC的精度和比较器的失调电压。

  3. 滤波器功能验证:这是重点。向CMPIN2P输入一个叠加了高频毛刺的方波信号,或者直接用函数发生器产生一个在阈值附近抖动的信号。观察GPIO4的输出。如果没有滤波器,GPIO4会跟随毛刺频繁跳变;启用滤波器后,GPIO4应该变得干净、稳定,并且会有一定的延迟。通过改变SAMPWINTHRESH,可以直观看到滤波器抗干扰能力和响应延迟的变化。

  4. EPWM触发验证:连接好电机或负载,启动EPWM7输出正常的PWM波。用示波器同时监测GPIO29 (PWM7B) 和电流采样信号(或CMPIN2P输入)。人为制造一个过流条件(如突然堵转电机)。你应该看到,在电流信号超过阈值的瞬间,PWM7B波形立即从PWM波变为稳定的高电平,并且这个动作几乎无延迟。关键点:确认Trip动作是“CBC”模式还是“One-Shot”模式。CBC模式下,每个PWM周期都会重新检查Trip条件,如果故障消失,下一个周期PWM会自动恢复;One-Shot模式下,一旦触发,PWM将一直保持Trip状态直到软件干预。

5. 高级应用与避坑指南

5.1 斜坡发生器实现逐周期限流

静态DAC保护是固定阈值。更高级的应用是利用斜坡发生器实现动态阈值。例如,在峰值电流控制中,每个PWM周期开始时,DAC值从某个基准开始线性增加,当电流采样电压(CMPIN2P)超过这个上升的斜坡电压时,比较器翻转,立即关断本周期的PWM。这实现了精准的峰值电流控制。

配置要点:

  • 设置COMPDACHCTL.DACSOURCE = 1,让DAC值来自斜坡发生器。
  • 配置RAMPSOURCE,选择触发斜坡开始的EPWMSYNCPER信号(例如EPWM1的周期同步)。
  • 设置RAMPDIR = 1(递增模式)。
  • RAMPHREFS中设置斜坡的起始值,在RAMPHSTEPVALS中设置每个SYSCLK周期递增的步长。
  • 斜坡的结束值由比较器动作决定(当COMPHSTS变高时,RAMPHSTS会重新加载RAMPHREFA/S的值)。

5.2 常见问题排查速查表

现象可能原因排查步骤
CMPSS无任何反应,输出始终不变1. CMPSS模块未使能 (COMPCTL.COMPDACE=0)。
2. 内部DAC未正确配置或使能。
3. 输入引脚复用配置错误 (CMPHPMXSEL)。
4. 比较器输出极性配置反了 (COMPHINV)。
1. 检查COMPCTL使能位。
2. 测量或通过ADC回读DAC输出电压。
3. 核对数据手册引脚复用表,检查输入选择寄存器。
4. 交换VpVn输入,或翻转COMPHINV位测试。
触发动作延迟过大1. 数字滤波器参数 (SAMPWIN,THRESH,CLKPRESCALE) 设置过于保守。
2. 选择了CTRIPOUTHSEL=3(锁存输出)但未及时清除锁存。
1. 根据系统噪声水平和允许的延迟,减小滤波窗口或采样周期。
2. 检查COMPSTSCLR寄存器,确认是否需要配置同步清除或手动清除锁存。
EPWM未按预期被Trip1.CTRIPOUTH未正确映射到EPWM的TZ输入。
2. EPWM的Trip-Zone子模块未使能或动作未配置。
3. Trip-Zone工作在One-Shot模式且未复位。
1. 检查GPIO MUX配置,确认CTRIPOUTH信号路由。
2. 检查EPWM的TZSELTZCTL寄存器配置。
3. 如果是One-Shot模式,检查TZCLR寄存器或相关的中断服务程序是否清除了Trip标志。
在阈值点附近输出振荡1. 输入信号噪声过大。
2. 比较器迟滞 (COMPHYS) 未启用。
3. 滤波器阈值设置过低(如THRESH=0)。
1. 优化前端模拟电路,增加RC滤波。
2. 使能并设置合适的迟滞电压 (COMPHYSCTL)。
3. 增加THRESH值,提高表决门槛。

5.3 寄存器保护与软件锁

在系统初始化完成后,为了防止关键配置被意外修改(例如跑飞的指针),TI提供了COMPLOCK寄存器。你可以一次性锁住COMPCTLCOMPHYSCTLCOMPDACxCTLCTRIPxFILCTL等关键配置寄存器。一旦置位,只有系统复位才能解锁。这是一个重要的安全特性,建议在系统初始化尾声调用。

// 锁定关键CMPSS配置寄存器 CMPSS_lockConfig(CMPSS2_BASE);

6. 总结与心得

折腾完CMPSS和EPWM的联动,最大的体会是:硬件保护回路的设计,必须在理解芯片内部信号流的基础上,进行分层验证。不要试图一次性配置完所有功能然后上电测试,那样出了问题无从下手。

我的调试顺序通常是:DAC -> 裸比较器 -> 滤波器 -> Trip输出 -> EPWM动作。每一层都用示波器确认信号是否符合预期。特别是滤波器参数,它是在响应速度和抗噪能力之间的权衡,没有标准答案,必须结合自己板子的实际噪声情况来调整。手册上推荐的参数只是一个起点。

另一个心得是关于影子寄存器。CMPSS里大量使用了影子-活动寄存器对(如DACHVALS/DACHVALA,RAMPHREFS/RAMPHREFA)。在动态切换DAC值或斜坡参数时,一定要注意你写入的是影子寄存器,而生效可能需要在特定的同步事件(如EPWMSYNCPER)之后。理解SWLOADSELRAMPLOADSEL这些加载选择位,才能确保参数更新的时机精准可控。

最后,TMS320F280015x的CMPSS功能非常强大,远不止本文介绍的静态比较。它的斜坡发生器、两个比较器之间的交叉触发、与HRPWM的配合等,为构建复杂的模拟控制环路(如硬件实现的PID、斜坡补偿)提供了可能。当你吃透了基础的保护功能后,再去探索这些高级特性,会更有底气。希望这篇基于实战的梳理,能帮你更快地驯服这颗强大的实时微控制器,构建出既灵敏又可靠的硬件保护屏障。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询