公司动态
TMS320F280015x CMPSS硬件保护实战:从比较器到EPWM的快速关断
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输入并配置为“强制高”。这样一旦过流发生PWM7BGPIO29会立即被拉高关断桥臂实现保护。关键理解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, // 输出不反相 (COMPHINV0) CMPSS_HYST_DISABLE); // 初始禁用迟滞 CMPSS_configLowComparator(CMPSS2_BASE, CMPSS_INSRC_DAC, CMPSS_INV_INVERT, CMPSS_HYST_DISABLE); CMPSS_enableModule(CMPSS2_BASE); // 设置COMPDACE1使能整个模块COMPHSOURCE0至关重要。这表示高比较器的反相端Vn连接内部DAC而不是外部引脚。这是我们使用内部参考电压的前提。COMPHINV0输出不反向。即当Vp Vn时原始比较器输出为高。这符合我们的直觉输入电压超过参考电压触发保护。步骤2配置内部DAC参考值我们希望DAC输出VDD/2。对于12位DAC满量程参考通常是VDDA模拟电源通常与VDD一致。若VDDA3.3V则VDD/21.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.SWLOADSEL0)这里配置的是DACHVALS影子寄存器。DACSOURCE位默认为0意味着DAC值来自影子寄存器DACHVALS而非斜坡发生器。SWLOADSEL位决定了影子寄存器值加载到活动寄存器DACHVALA的时机SYSCLK或EPWMSYNCPER对于静态DAC用SYSCLK即可。步骤3配置数字滤波器为了防止噪声引起误触发必须启用滤波器。这涉及到CTRIPHFILCTL和CTRIPHFILCLKCTL两个寄存器。// 配置高比较器数字滤波器 CMPSS_configFilterHigh(CMPSS2_BASE, CMPSS_FILT_IN_COMPH, // 滤波输入源高比较器输出 (FILTINSEL0) 6, // 采样窗口大小 SAMPWIN 6 (实际窗口617个采样点) 4); // 表决阈值 THRESH 4 (实际阈值415) // 配置滤波器采样时钟预分频 // 假设系统时钟SYSCLK 100MHz我们希望滤波器采样频率为10MHz周期100ns // 预分频值 SYSCLK / 期望采样频率 - 1 100MHz/10MHz - 1 9 CMPSS_setFilterClkPreScalerHigh(CMPSS2_BASE, 9); // 写入CTRIPHFILCLKCTL.CLKPRESCALESAMPWIN6表示滤波器会持续监测7个连续的采样点。THRESH4表示需要在这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. 调试与验证示波器上的真相配置完成后如何验证理论通了硬件上未必一次成功。以下是我的调试 checklistDAC输出验证最基础的一步。暂时断开外部输入将CMPIN2P通过一个高阻探头如1MΩ接到已知电压如GND。由于Vp VnCTRIPOUTHGPIO4应始终为低。用示波器测量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.COMPDACE0)。2. 内部DAC未正确配置或使能。3. 输入引脚复用配置错误 (CMPHPMXSEL)。4. 比较器输出极性配置反了 (COMPHINV)。1. 检查COMPCTL使能位。2. 测量或通过ADC回读DAC输出电压。3. 核对数据手册引脚复用表检查输入选择寄存器。4. 交换Vp和Vn输入或翻转COMPHINV位测试。触发动作延迟过大1. 数字滤波器参数 (SAMPWIN,THRESH,CLKPRESCALE) 设置过于保守。2. 选择了CTRIPOUTHSEL3锁存输出但未及时清除锁存。1. 根据系统噪声水平和允许的延迟减小滤波窗口或采样周期。2. 检查COMPSTSCLR寄存器确认是否需要配置同步清除或手动清除锁存。EPWM未按预期被Trip1.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. 滤波器阈值设置过低如THRESH0。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、斜坡补偿提供了可能。当你吃透了基础的保护功能后再去探索这些高级特性会更有底气。希望这篇基于实战的梳理能帮你更快地驯服这颗强大的实时微控制器构建出既灵敏又可靠的硬件保护屏障。