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)。每个通道都拥有自己的一套“装备”:
- 模拟比较器:核心,负责执行
Vp(同相端)与Vn(反相端)的电压比较。 - 内部12位DAC:为比较器的反相端(
Vn)提供高精度的参考电压。这个DAC的值可以静态设置,也可以由一个“斜坡发生器”动态驱动,后者常用于实现逐周期电流限制等高级功能。 - 数字滤波器:比较器的原始输出是高速变化的,容易受噪声影响。数字滤波器通过一个可配置的采样窗口和阈值(多数表决逻辑),对原始信号进行消抖,产生稳定的数字输出
CTRIPx。 - 输出选择逻辑:这是灵活性的关键。你可以选择将滤波前的异步比较器输出、同步后的输出、滤波后的输出,或者滤波后并锁存的输出,作为最终的
CTRIPx信号。这个选择决定了响应速度和抗噪能力的平衡。 - 斜坡发生器:一个由EPWM同步信号触发的计数器,可以递增或递减,其输出值可以直接作为内部DAC的输入,从而产生一个随时间线性变化的参考电压。
在我的项目中,主要用到了高比较器通道。外部电流采样信号经调理后送入CMPIN2P(即Vp),内部DAC设置为VDD/2(约1.65V)作为Vn。当电流过大,CMPIN2P电压超过1.65V时,比较器翻转。
2.2 与EPWM的联动机制:Trip-Zone的奥秘
CMPSS的输出CTRIPH或CTRIPL并不是直接去控制一个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(可能位于CMPSS或ANALOG相关寄存器)设置为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:配置数字滤波器为了防止噪声引起误触发,必须启用滤波器。这涉及到CTRIPHFILCTL和CTRIPHFILCLKCTL两个寄存器。
// 配置高比较器数字滤波器 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.CLKPRESCALESAMPWIN=6:表示滤波器会持续监测7个连续的采样点。THRESH=4:表示需要在这7个采样点中,至少有5个点状态一致(例如都为高),滤波器的输出才会改变状态。这提供了很好的噪声免疫力。- 采样时钟:决定了滤波器的响应速度。100ns的采样周期,加上7个样本的窗口,意味着对于稳定的输入信号,滤波器输出延迟最大约为
7 * 100ns = 700ns。这个延迟对于大多数电力电子保护(通常要求几微秒内响应)是可接受的。
步骤4:配置输出选择与连接EPWM这是将CMPSS与EPWM关联起来的关键一步,通过COMPCTL寄存器的CTRIPHSEL和CTRIPOUTHSEL位域控制。
// 选择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:
DAC输出验证:最基础的一步。暂时断开外部输入,将
CMPIN2P通过一个高阻探头(如1MΩ)接到已知电压(如GND)。由于Vp < Vn,CTRIPOUTH(GPIO4)应始终为低。用示波器测量DACOUTH引脚(如果芯片引出)或通过ADC读取内部DAC电压寄存器(如果支持),确认其是否为设定的1.65V。我踩过的坑:曾忘记使能DAC模块的模拟部分(有时需要单独的DACCTL寄存器),导致DAC无输出,比较器永远不动作。比较器基本功能验证:向
CMPIN2P输入一个可调的直流电压。从0V缓慢调至3.3V。用示波器双通道同时监测输入电压和GPIO4 (CTRIPOUTH)。当输入电压超过1.65V时,GPIO4应从低电平跳变为高电平。跳变点是否精确在1.65V?这考验DAC的精度和比较器的失调电压。滤波器功能验证:这是重点。向
CMPIN2P输入一个叠加了高频毛刺的方波信号,或者直接用函数发生器产生一个在阈值附近抖动的信号。观察GPIO4的输出。如果没有滤波器,GPIO4会跟随毛刺频繁跳变;启用滤波器后,GPIO4应该变得干净、稳定,并且会有一定的延迟。通过改变SAMPWIN和THRESH,可以直观看到滤波器抗干扰能力和响应延迟的变化。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. 交换 Vp和Vn输入,或翻转COMPHINV位测试。 |
| 触发动作延迟过大 | 1. 数字滤波器参数 (SAMPWIN,THRESH,CLKPRESCALE) 设置过于保守。2. 选择了 CTRIPOUTHSEL=3(锁存输出)但未及时清除锁存。 | 1. 根据系统噪声水平和允许的延迟,减小滤波窗口或采样周期。 2. 检查 COMPSTSCLR寄存器,确认是否需要配置同步清除或手动清除锁存。 |
| EPWM未按预期被Trip | 1.CTRIPOUTH未正确映射到EPWM的TZ输入。2. EPWM的Trip-Zone子模块未使能或动作未配置。 3. Trip-Zone工作在One-Shot模式且未复位。 | 1. 检查GPIO MUX配置,确认CTRIPOUTH信号路由。2. 检查EPWM的 TZSEL、TZCTL寄存器配置。3. 如果是One-Shot模式,检查 TZCLR寄存器或相关的中断服务程序是否清除了Trip标志。 |
| 在阈值点附近输出振荡 | 1. 输入信号噪声过大。 2. 比较器迟滞 ( COMPHYS) 未启用。3. 滤波器阈值设置过低(如 THRESH=0)。 | 1. 优化前端模拟电路,增加RC滤波。 2. 使能并设置合适的迟滞电压 ( COMPHYSCTL)。3. 增加 THRESH值,提高表决门槛。 |
5.3 寄存器保护与软件锁
在系统初始化完成后,为了防止关键配置被意外修改(例如跑飞的指针),TI提供了COMPLOCK寄存器。你可以一次性锁住COMPCTL、COMPHYSCTL、COMPDACxCTL和CTRIPxFILCTL等关键配置寄存器。一旦置位,只有系统复位才能解锁。这是一个重要的安全特性,建议在系统初始化尾声调用。
// 锁定关键CMPSS配置寄存器 CMPSS_lockConfig(CMPSS2_BASE);6. 总结与心得
折腾完CMPSS和EPWM的联动,最大的体会是:硬件保护回路的设计,必须在理解芯片内部信号流的基础上,进行分层验证。不要试图一次性配置完所有功能然后上电测试,那样出了问题无从下手。
我的调试顺序通常是:DAC -> 裸比较器 -> 滤波器 -> Trip输出 -> EPWM动作。每一层都用示波器确认信号是否符合预期。特别是滤波器参数,它是在响应速度和抗噪能力之间的权衡,没有标准答案,必须结合自己板子的实际噪声情况来调整。手册上推荐的参数只是一个起点。
另一个心得是关于影子寄存器。CMPSS里大量使用了影子-活动寄存器对(如DACHVALS/DACHVALA,RAMPHREFS/RAMPHREFA)。在动态切换DAC值或斜坡参数时,一定要注意你写入的是影子寄存器,而生效可能需要在特定的同步事件(如EPWMSYNCPER)之后。理解SWLOADSEL和RAMPLOADSEL这些加载选择位,才能确保参数更新的时机精准可控。
最后,TMS320F280015x的CMPSS功能非常强大,远不止本文介绍的静态比较。它的斜坡发生器、两个比较器之间的交叉触发、与HRPWM的配合等,为构建复杂的模拟控制环路(如硬件实现的PID、斜坡补偿)提供了可能。当你吃透了基础的保护功能后,再去探索这些高级特性,会更有底气。希望这篇基于实战的梳理,能帮你更快地驯服这颗强大的实时微控制器,构建出既灵敏又可靠的硬件保护屏障。