深入解析C2000 eHRPWM与eQEP:寄存器级电机控制实战
1. 项目概述:从寄存器到精准控制
在嵌入式电机控制的世界里,我们常常谈论算法、模型和性能指标,但真正让这些抽象概念在物理世界中“动”起来的,是那些隐藏在芯片深处、由一个个比特位构成的寄存器。它们就像是硬件与软件之间无声的翻译官,你的每一行代码,最终都转化为对这些寄存器的读写操作,从而精确地指挥着PWM波的生灭、编码器脉冲的计数。很多人觉得读芯片手册、配寄存器是枯燥的苦差事,但在我看来,这恰恰是区分“调参工程师”和“系统架构师”的关键门槛。你不真正理解TZCTL里那两位控制位为何能瞬间让电机刹车,或者QDECCTL如何将两路相位差90度的方波解算成精准的位置信息,就很难在系统异常时做出最迅速、最正确的反应。
本次分享,我将以TI C2000系列DSP中两个至关重要的外设——增强型高分辨率脉宽调制器(eHRPWM)和增强型正交编码器脉冲(eQEP)模块为核心,深入它们的寄存器腹地。我们不止步于手册的翻译,而是要弄明白:为什么Trip-Zone(故障区)需要“单次触发(One-Shot)”和“周期循环(Cycle-By-Cycle)”两种保护模式?正交解码的“4倍频”是如何在硬件中实现的,又为何能提升精度?我会结合多年在伺服驱动和机器人关节控制上的实战经验,带你走过配置流程中的每一个关键步骤,分享那些手册上不会写的“坑”与技巧。无论你是正在评估电机控制方案,还是已经深陷调试泥潭,希望这篇基于寄存器视角的解析,能为你点亮一盏灯。
2. eHRPWM模块深度解析:超越简单的占空比控制
eHRPWM远不止是一个产生PWM波的定时器。它是一个为高可靠性、高精度功率控制而生的复杂系统。理解它,需要从整体架构入手,再深入到每个关键子模块的寄存器配置逻辑。
2.1 核心架构与时间基准
一个eHRPWM模块的核心是它的时间基准计数器(TB)和比较器(CC)。TBCTR寄存器就像一个节拍器,在TBPRD(周期值)设定的范围内循环计数(递增、递减或增减计数)。CMPA和CMPB则是两个可以设定的“闹钟”。当TBCTR的值与CMPA或CMPB匹配时,就会触发动作,改变EPWMxA和EPWMxB这两个输出引脚的电平,从而生成PWM波。这种结构决定了PWM的频率由TBPRD和系统时钟决定,而占空比则由CMPx与TBPRD的比值决定。
实操心得一:影子寄存器与实时性细心的你会发现,
CMPA、CMPB甚至TBPRD通常都有对应的“影子寄存器”。以CMPA为例,你实际写入的是CMPA的影子寄存器,而硬件真正在使用的叫“活动寄存器”。CMPCTL[LOADAMODE]位决定了影子寄存器的值在何时(如TBCTR=0或TBCTR=TBPRD时)加载到活动寄存器。这个机制至关重要:它保证了在一个PWM周期内,比较值不会发生突变,从而避免了输出毛刺。在电机控制中,我们通常在电流环计算完成后更新CMPA的值,并设定在下一个PWM周期开始时(TBCTR=0)生效,这样既能保证控制算法的实时性,又能确保输出的平滑性。
2.2 Trip-Zone(故障区)子模块:系统的安全卫士
这是eHRPWM的“紧急制动”系统,也是工业应用可靠性的基石。它允许外部故障信号(如过流、过压、过热传感器的输出)直接通过TZ1~TZ6引脚输入,触发硬件级别的保护动作,其响应速度远快于软件中断。
2.2.1 两种保护模式:One-Shot与Cycle-By-Cycle
这是理解Trip-Zone的核心。手册里对TZSEL寄存器的配置,就是在为每个TZn引脚选择触发模式。
- One-Shot (OST) 模式:相当于“熔断器”。一旦使能的故障引脚出现有效电平(通常为低),eHRPWM模块会立即执行
TZCTL寄存器中设定的动作(如输出高阻),并且这个故障状态会被锁存。直到你通过软件向TZCLR[OST]位写1手动清除,PWM输出才会恢复正常。这种模式用于处理严重的、需要系统完全停机的故障,比如硬件短路、严重过载。 - Cycle-By-Cycle (CBC) 模式:相当于“自动复位断路器”。当故障发生时,同样会立即执行保护动作,但这个故障状态不会锁存。它会在当前PWM周期结束时(
TBCTR计数归零时)自动清除。如果此时故障信号已经消失,下一个PWM周期将正常输出;如果故障依然存在,则再次触发保护。这种模式常用于处理瞬态的、可恢复的过流,比如电机启动瞬间的冲击电流。它允许系统在故障出现时立即保护,又在故障消失后自动恢复,实现了“逐周期限流”。
| 特性 | One-Shot (OST) 模式 | Cycle-By-Cycle (CBC) 模式 |
|---|---|---|
| 触发动作 | 立即执行TZCTL定义的动作 | 立即执行TZCTL定义的动作 |
| 状态清除 | 手动清除 (TZCLR[OST]=1) | 自动清除 (TBCTR=0时) |
| 应用场景 | 严重、永久性故障(短路、致命错误) | 瞬时、可恢复故障(电流尖峰、限流保护) |
| 寄存器配置 | TZSEL寄存器中使能对应引脚的OSHTn位 | TZSEL寄存器中使能对应引脚的CBCn位 |
2.2.2 保护动作配置:TZCTL寄存器详解
故障发生后,输出引脚具体怎么动作,全靠TZCTL寄存器配置。每个PWM输出通道(EPWMxA和EPWMxB)都有2个控制位。
// 假设我们希望故障时,EPWMxA输出立即变为高阻态(安全断开),EPWMxB强制拉低(主动刹车) TZCTL &= 0xFFF0; // 先清除TZA和TZB字段 TZCTL |= (0 << 0); // TZA = 0: EPWMxA 高阻态 (High-impedance) TZCTL |= (2 << 2); // TZB = 2: EPWMxB 强制低电平 (Force to low)为什么这么配置?这取决于你的功率拓扑和安全策略。对于半桥或全桥驱动:
- 高阻态(High-Z):让上下桥臂的功率管全部关断,电机绕组电流通过续流二极管自然衰减。这是最通用、最安全的做法,避免直通风险。
- 强制高/低电平:在某些主动刹车场景下,你可能需要将电机绕组短路(比如将两端都拉低到地),实现快速能耗制动。但这要求你的硬件设计能承受短路电流,且软件必须确保不会形成上下桥臂直通。
避坑指南一:TZFLG标志位的清除顺序当故障触发后,
TZFLG寄存器中的OST、CBC或INT标志位会被置位。清除它们需要向TZCLR寄存器的对应位写1。这里有一个关键顺序:必须先清除TZFLG[INT](中断标志),再清除OST或CBC(事件标志)。因为如果你清除了事件标志但中断标志还在,系统可能不会产生新的中断;而如果先清除了事件标志,此时故障信号若仍存在,可能会立即再次置位事件标志,导致你无法清除中断标志。稳妥的做法是:
- 读取并保存故障源。
TZCLR |= (1 << 0);// 清除INT标志TZCLR |= (1 << 1);// 清除CBC标志 (如果是CBC故障)TZCLR |= (1 << 2);// 清除OST标志 (如果是OST故障)- 处理故障源(如关闭驱动、报警等)。
- 最后再重新使能PWM输出。
2.2.3 软件强制触发与调试:TZFRC寄存器
TZFRC寄存器允许你通过软件模拟一个故障事件,这对于系统测试和调试极其有用。你可以不连接真实的故障传感器,就验证你的Trip-Zone配置和中断服务程序是否正确。
// 软件强制触发一个Cycle-By-Cycle故障,用于测试 TZFRC |= (1 << 1); // 将CBC位置1,强制触发CBC事件 // 此时,TZFLG[CBC]会被置位,如果TZEINT[CBC]已使能,则会进入中断服务程序。 // 由于是CBC模式,当TBCTR归零后,故障状态会自动清除,PWM恢复。2.3 高分辨率PWM(HRPWM):突破数字精度的极限
标准的PWM分辨率受限于系统时钟频率和PWM载波频率。例如,系统时钟100MHz,PWM频率10kHz,那么一个周期内只有10000个计数点,分辨率约为0.01%。对于需要极精细电压调节的应用(如高性能电源、精密电机微步距控制),这不够用。HRPWM通过微边沿定位(MEP)技术,在传统的数字计数器边缘上,再插入一个由模拟延迟线实现的、精度更高的“微调”机制,可以将边沿定位精度提高至皮秒级。
2.3.1 HRPWM的核心寄存器
HRPWM的配置主要围绕三个寄存器:
CMPAHR:这是高分辨率比较值寄存器。它并不是独立工作的,而是作为标准CMPA寄存器的扩展。CMPA提供“粗调”( coarse step),CMPAHR提供“微调”( fine step)。例如,CMPA决定PWM波大致在哪个系统时钟周期翻转,而CMPAHR决定在这个时钟周期内,具体延迟多少个MEP步长后翻转。HRCNFG:配置寄存器,决定HRPWM的工作模式。EDGMODE:选择对哪个边沿进行高分辨率控制。01控制上升沿,10控制下降沿,11控制双边沿。通常我们只控制一个边沿(如上升沿用于占空比控制)来简化校准。CTLMODE:选择是CMPAHR控制边沿(占空比控制模式),还是TBPHSHR控制边沿(相位控制模式)。绝大多数应用是占空比控制。HRLOAD:选择CMPAHR影子寄存器的加载时机,必须与CMPCTL[LOADAMODE]保持一致,通常选择在TBCTR=0时加载。
2.3.2 HRPWM的校准与使用
HRPWM的精度依赖于对MEP延迟线的校准。因为模拟延迟线受工艺、电压、温度影响,其每一步的延迟时间并非绝对恒定。TI提供了基于SFO(Scale Factor Optimizer)软件的库函数来实时估算MEP步长与系统时钟周期的比例关系(MEP Scale Factor)。
基本使用流程如下:
- 初始化标准PWM:先像普通PWM一样,配置
TBPRD、CMPA、计数模式等。 - 使能HRPWM通道:根据硬件连接,使能对应PWM输出引脚的HRPWM功能(这通常在GPIO复用和PWM子模块使能时完成)。
- 配置HRCNFG:设置为占空比控制、单边沿模式、在
TBCTR=0时加载。 - 运行SFO库:在系统初始化后,调用SFO库函数(如
SFO())来实时计算和更新MEP比例因子。这个函数需要周期性地在后台运行(例如放在低速后台循环中)。 - 计算并写入高分辨率值:当你需要设定一个高精度占空比时,需要将目标占空比转换为
CMPA和CMPAHR的组合值。通常有现成的库函数(如HRPWM_setDuty)帮你完成这个计算,其内部逻辑是:- 目标时间 =
TBPRD* 目标占空比。 CMPA= 目标时间的整数部分(以系统时钟周期为单位)。CMPAHR= 目标时间的小数部分 / MEP步长时间(这个值由SFO函数提供)。
- 目标时间 =
实操心得二:HRPWM的“死区”挑战HRPWM通常用于控制桥式电路的同一个桥臂的上下管(即互补对称PWM)。这里必须引入死区时间防止上下管直通。传统的死区生成模块(DB)位于HRPWM模块之后。这意味着,如果你用HRPWM精细控制了主PWM的上升沿,那么经过死区模块后,互补PWM的下降沿也会相应移动,但这个移动是标准精度的。这可能导致两边沿的对称性出现微小偏差。对于要求极高的应用,可能需要更复杂的方案,例如使用两个HRPWM通道分别独立控制上下管,并软件计算死区补偿。
2.4 事件触发与中断管理:让CPU适时介入
eHRPWM可以在特定时间点(如TBCTR=0、TBCTR=TBPRD、TBCTR=CMPA等)产生中断,通知CPU进行新一轮的控制计算。这由事件触发(ET)子模块管理。
ETSEL:选择在哪个事件发生时触发中断。例如,INTSEL=1在TBCTR=0时触发,INTSEL=2在TBCTR=TBPRD时触发,INTSEL=4在TBCTR递增到CMPA值时触发。在电机FOC控制中,我们通常选择在TBCTR=0(周期开始)时触发中断,在此中断中进行电流采样和下一个周期的占空比计算。ETPS:事件预分频与计数器。INTPRD决定每N个事件产生一次中断(降低中断频率)。INTCNT是事件计数器,用于记录发生了多少次选定的事件。ETFLG&ETCLR:中断标志位和清除寄存器。进入中断服务程序后,必须手动清除ETFLG[INT]标志(通过向ETCLR[INT]写1),否则无法产生下一次中断。
// 配置在TBCTR=0时产生中断,且每个PWM周期产生一次 ETSEL &= ~(0x0007); // 清除INTSEL位域 ETSEL |= (1 << 0); // INTSEL = 1: 选择TBCTR=0事件 ETPS &= ~(0x0003); // 清除INTPRD位域 ETPS |= (1 << 0); // INTPRD = 1: 第一个事件就产生中断 ETSEL |= (1 << 3); // INTEN = 1: 使能中断生成 // 在中断服务程序中 if (ETFLG_BIT.INT == 1) { // 检查中断标志 // ... 执行控制算法 ... ETCLR |= (1 << 0); // 清除中断标志,允许下次中断产生 }3. eQEP模块深度解析:从脉冲到位置与速度
如果说eHRPWM是控制系统的“执行器”,那么eQEP就是系统的“眼睛”。它专门用于接口增量式光电或磁编码器,将电机转动的物理量转化为数字系统可以理解的位置和速度信息。
3.1 正交解码原理与硬件实现
增量式编码器输出两路相位差90度的方波(A相和B相)。eQEP的正交解码单元(QDU)的核心任务,就是根据这两路信号的相位关系判断方向,并生成计数脉冲。
方向判断:如图15-6和15-7所示,硬件内部有一个状态机,跟踪A、B相上一个边沿和当前边沿的状态。如果A相领先B相90度(即A的上升沿发生在B为低电平时),则判定为正转(顺时针),方向信号QDIR为高,位置计数器QPOSCNT递增。反之,B相领先则为反转,计数器递减。
4倍频:这是提升位置分辨率的关键。解码器不仅在两路信号的上升沿计数,也在下降沿计数。这样,编码器线数(每转的明暗刻线对数)为N,经过eQEP解码后,每转可获得4N个计数脉冲。例如,一个2500线的编码器,最终位置分辨率是10000 counts/rev。这个“4倍频”是在硬件中自动完成的,无需软件干预,极大地提高了精度。
配置寄存器QDECCTL:
QSRC:选择位置计数器输入模式。00-正交计数模式(最常用);01-方向计数模式(外部直接给方向和时钟);10-递增计数模式;11-递减计数模式。SWAP:交换A、B相输入。当编码器安装方向与软件定义的正方向相反时,无需改动硬件接线,只需将此位置1即可反转计数方向。XCR:外部时钟频率。用于选择输入信号的滤波和同步模式。
避坑指南二:噪声与输入滤波工业现场环境复杂,编码器信号易受干扰。eQEP输入引脚通常内置了可编程的数字滤波器(通过
QDECCTL和QEPCTL相关位配置)。你需要根据编码器信号的最大频率和预期的噪声特性来设置滤波采样窗口。设置过窄,可能滤不掉噪声,导致误计数���设置过宽,则会滤掉有效的高频脉冲,导致在高转速下丢失计数。一个经验法则是:滤波窗口时间应大于预期噪声脉冲宽度,但小于编码器输出最小脉冲间隔的1/2。例如,电机最高转速3000rpm,编码器1000线,4倍频后最大脉冲频率为 (3000/60)10004 = 200kHz,脉冲周期5us。那么滤波窗口可以设为2-3个系统时钟周期(假设系统时钟100MHz,即20-30ns)。这需要在信号质量和响应速度间做权衡。
3.2 位置计数器与控制单元(PCCU):核心数据源
这是eQEP的数据核心,QPOSCNT是一个32位的位置计数器,其计数行为由QDECCTL控制。
关键寄存器与功能:
QPOSCNT:实时位置值。可读可写,软件可以在任何时候将其复位或预设一个值。QPOSMAX:设置位置计数器的最大值。当QPOSCNT达到QPOSMAX时,可以产生中断或归零,用于实现“位置循环”或“多圈计数”的软件模拟。QPOSILAT:索引脉冲锁存器。当编码器的索引信号(Z相)QEPI到来时,QPOSCNT的当前值会被自动捕获到QPOSILAT中。这用于寻找机械零点。例如,在开机时让电机缓慢旋转,当QPOSILAT值发生变化时,说明索引信号出现,可以将此时的QPOSILAT值作为零点偏移量存储起来。QPOSSLAT:选通脉冲锁存器。功能与QPOSILAT类似,但由外部选通信号QEPS触发。这个信号可以接限位开关、光电传感器等,用于在特定机械位置捕获位置值。QPOSCMP:位置比较寄存器。可以设置一个位置比较值,当QPOSCNT等于QPOSCMP时,产生比较匹配中断。这在需要定位到特定点的应用中非常有用。
初始化与归零策略:
// 典型的eQEP初始化片段 EQep1Regs.QDECCTL.bit.QSRC = 0; // 正交计数模式 EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // 仿真挂起时,位置计数器继续运行 EQep1Regs.QEPCTL.bit.PCRM = 1; // 位置计数器在索引脉冲时复位 EQep1Regs.QEPCTL.bit.IEI = 1; // 在索引脉冲上升沿复位 EQep1Regs.QEPCTL.bit.SEI = 0; // 选通脉冲不触发复位 EQep1Regs.QPOSMAX = 0xFFFFFFFF; // 设置最大计数值(32位满量程) EQep1Regs.QEPCTL.bit.QPEN = 1; // 使能eQEP模块 // 寻找索引脉冲(零点) while(EQep1Regs.QFLG.bit.IEL == 0); // 等待索引事件标志 zero_offset = EQep1Regs.QPOSILAT; // 读取锁存的索引位置 // 此后,实际位置 = (QPOSCNT - zero_offset) & 0xFFFFFFFF3.3 速度测量:单位时间法与单位位移法
eQEP提供了两种硬件辅助的速度测量方法,对应着引言中提到的两个速度估计公式,完美解决了宽速度范围内的测量精度问题。
3.3.1 单位时间法(基于QPOSCNT)
这种方法对应公式 (1):v(k) = [x(k) - x(k-1)] / T。
- 原理:利用一个固定的定时器(
UTIME单元中的QUTMR)产生周期性的中断(例如每1ms一次)。在每次中断中,读取当前的位置计数器QPOSCNT,并与上一次中断时的位置值相减,得到在固定时间T内的位移ΔX。速度 = ΔX / T。 - 优点:高速下测量准确,计算简单。
- 缺点:低速时,ΔX可能小于1个最小位置单位(1个计数),导致速度计算为0,分辨率差。例如,1ms内位移不足1个计数,速度就测不出来。
相关寄存器:
QUPRD:设置单位定时器的周期值(决定T的大小)。QUTMR:单位定时器计数器,减计数到0时产生中断,并自动重载QUPRD。QEPCTL[UTE]:使能单位定时器。
3.3.2 单位位移法(基于QCAP)
这种方法对应公式 (2):v(k) = X / ΔT。
- 原理:利用正交边沿捕获单元(QCAP)。它捕获两个连续的正交脉冲边沿之间的时间间隔ΔT。已知每个脉冲对应的固定位移是X(例如,4倍频后,1个计数对应1/10000转),那么速度 = X / ΔT。
- 优点:低速时,脉冲周期长,ΔT大,用高精度定时器测量ΔT可以获得很高的速度分辨率。非常适合极低速甚至零速附近的测量。
- 缺点:高速时,脉冲周期极短,ΔT非常小,受定时器时钟分辨率限制,测量误差大。
相关寄存器:
QCAPCTL:配置捕获单元,如使能、选择捕获边沿(上升沿、下降沿、双边沿)。QCTMR:一个自由运行的32位定时器,时钟源为系统时钟。QCPRD:捕获周期寄存器。当捕获事件发生时,QCTMR的当前值被锁存到QCPRD中,同时QCTMR清零。QCPRD的值就是两个捕获事件之间的时间差ΔT(以系统时钟周期数为单位)。
如何选择与切换?高性能伺服驱动器通常采用混合策略:
- 在高速区域(例如,转速 > 额定转速的5%),使用单位时间法。在
QUTMR中断中计算速度。 - 在低速区域(转速 < 额定转速的5%),切换到单位位移法。使能QCAP,用
QCPRD计算速度。 - 切换逻辑需要在软件中实现。可以根据当前计算出的速度值,或者根据
QCPRD是否溢出(时间过长,速度过低)来判断。
// 伪代码示例:速度计算与模式切换 float speed_rpm; Uint32 delta_pos; Uint32 delta_time_ticks; if (current_speed > SPEED_THRESHOLD_HIGH) { // 高速区:使用单位时间法 disable_qcap(); enable_utimer(); // 在UTIME中断中: delta_pos = current_qposcnt - last_qposcnt; speed_rpm = (delta_pos * 60.0 * SYSCLKOUT_FREQ) / (ENCODER_LINES * 4 * QUTMR_PERIOD); last_qposcnt = current_qposcnt; } else { // 低速区:使用单位位移法 disable_utimer(); enable_qcap(); // 在QCAP中断中(或轮询QCPRD): if (EQep1Regs.QFLG.bit.CAPINT == 1) { delta_time_ticks = EQep1Regs.QCPRD; if (delta_time_ticks > 0) { // 每个QCAP事件对应1个位置计数(4倍频后的) speed_rpm = (60.0 * SYSCLKOUT_FREQ) / (ENCODER_LINES * 4 * delta_time_ticks); } EQep1Regs.QCLR.bit.CAPINT = 1; // 清除捕获中断标志 } }3.4 看门狗与错误诊断
eQEP内置了一个位置计数器看门狗QWDOG。当电机堵转或编码器线缆断开时,QPOSCNT会长时间不变化。看门狗定时器QWDTMR在每次QPOSCNT变化时被刷新。如果QPOSCNT在QWDPRD设定的时间内没有变化,QWDTMR就会溢出,并可以产生中断。这是检测运动异常的有效硬件手段。
// 配置位置看门狗,设定超时时间对应最大允许的静止时间 EQep1Regs.QWDPRD = 0xFFFF; // 设置看门狗周期值 EQep1Regs.QEPCTL.bit.WDE = 1; // 使能看门狗 // 在中断中处理看门狗超时 if (EQep1Regs.QFLG.bit.WDOG_INT == 1) { // 电机可能堵转或编码器故障 handle_error(); EQep1Regs.QCLR.bit.WDOG_INT = 1; // 清除标志 }4. 电机控制应用实战:寄存器配置的融合
理解了单个模块后,我们来看它们如何在典型的永磁同步电机(PMSM)磁场定向控制(FOC)中协同工作。
4.1 系统初始化流程
- 时钟与引脚配置:使能eHRPWM和eQEP模块的时钟,将对应的GPIO引脚复用为PWM输出功能和QEP输入功能。注意:eHRPWM的输出引脚通常有专门的高驱动能力模式,需要正确配置。
- eHRPWM初始化:
- 配置时间基准(
TBCTL,TBPRD)。 - 配置计数比较子模块(
CMPCTL,CMPA,CMPB),设置死区(DBCTL)。 - 配置Trip-Zone:根据硬件保护电路,设置
TZSEL选择故障源,TZCTL设定保护动作(如强制高阻),TZEINT使能故障中断。 - 配置事件触发,在
TBCTR=0时产生中断(ETSEL,ETPS)。 - 使能PWM输出(
AQCTL)。
- 配置时间基准(
- eQEP初始化:
- 配置解码模式(
QDECCTL)。 - 配��位置计数器模式(
QEPCTL),如索引脉冲复位。 - 配置输入信号滤波(
QDECCTL中的QAP,QBP,QIP,QSP)。 - 配置单位定时器
QUTMR用于高速测速,或配置捕获单元QCAPCTL用于低速测速。 - 使能eQEP模块(
QEPCTL.QPEN)。
- 配置解码模式(
- 中断配置:使能PWM周期中断、Trip-Zone故障中断、eQEP索引中断、看门狗中断等,并设置好中断向量。
4.2 FOC控制环中的寄存器交互
在一个典型的FOC电流环中(假设运行在10kHz):
- ADC触发:eHRPWM的
TBCTR=0事件(或TBCTR=CMPA事件)触发ADC开始采样相电流。 - 中断服务:eHRPWM周期中断产生。在中断服务程序中:
- 读取ADC结果,进行Clarke/Park变换。
- 读取eQEP的
QPOSCNT,计算或更新电角度(对于增量式编码器,需要通过位置计算电角度,并考虑极对数)。 - 执行电流PI调节器运算,得到新的电压矢量。
- 进行反Park变换和SVPWM调制,计算出新的
CMPA、CMPB值(可能还有CMPAHR用于HRPWM)。 - 将新的比较值写入
CMPA/CMPB的影子寄存器(CMPAHR亦然)。
- 硬件动作:在下一个PWM周期开始时(
TBCTR=0),影子寄存器的值加载到活动寄存器,新的PWM波形输出,驱动电机。 - 后台任务:在主循环中,周期性调用SFO函数更新HRPWM的MEP因子;处理eQEP看门狗、索引事件等非实时性任务;通过eQEP的单位定时器中断或捕获中断计算速度,用于速度环控制。
4.3 调试技巧与常见问题排查
PWM无输出:
- 检查
AQCTL寄存器,确认输出动作已使能(例如CAU=2,CAD=1分别代表TBCTR等于CMPA时置高和清零)。 - 检查
TZCTL寄存器,确认故障保护没有强制输出为高阻或固定电平。 - 用示波器检查PWM引脚,确认GPIO复用功能已正确开启。
- 检查
eQEP计数不准或方向反:
- 用示波器同时观察
QEPA和QEPB信号,确认其相位关系是否符合正转定义(A领先B)。 - 检查
QDECCTL[SWAP]位,尝试切换。 - 检查输入滤波
QDECCTL[QAP/QBP]的设置,过强的滤波可能滤掉有效脉冲。 - 在低速下手动转动电机,通过CCS的实时窗口观察
QPOSCNT的变化是否连续、单调。
- 用示波器同时观察
Trip-Zone误触发:
- 检查
TZSEL寄存器,确认是否误使能了未使用的故障引脚(悬空的引脚可能因噪声产生误触发)。 - 检查故障输入引脚的外部电路,是否有毛刺。可以考虑在软件中增加滤波逻辑,或者在
TZSEL中暂时禁用该故障源进行测试。 - 在调试阶段,可以先将
TZCTL配置为“Do nothing”(TZA=3,TZB=3),这样故障触发时PWM不受影响,方便你通过TZFLG寄存器观察故障标志,排查误触发原因。
- 检查
HRPWM输出抖动或线性度差:
- 确认SFO库函数被正确调用并运行。检查其返回的状态值,确保MEP校准成功。
- 检查
HRCNFG寄存器的HRLOAD位是否与CMPCTL[LOADAMODE]设置一致。 - 在CCS中,以高采样率捕获
EPWMxA和EPWMxB的波形,观察边沿的微小移动是否符合预期。抖动可能源于电源噪声或地线干扰,影响模拟延迟线的稳定性。
寄存器配置是嵌入式电机控制的基石,它要求开发者既要有清晰的软件逻辑,又要对硬件行为有深刻的理解。从eHRPWM的安全保护到eQEP的精确定位,每一个比特位的设置都影响着系统的性能、效率和可靠性。这份深入解析的目的,不仅是提供配置的“食谱”,更是希望揭示其背后的设计思想。当你下次面对一个新的电机控制芯片时,能够举一反三,快速抓住其PWM和编码器接口模块的设计精髓,从而写出更稳健、更高效的驱动代码。真正的掌控力,始于对寄存器每一个位的敬畏与理解。
