1. 项目概述与核心价值
在电力电子、电机驱动、精密测量这些对时间精度有“变态”级要求的领域,工程师们常常要和纳秒甚至皮秒级别的误差较劲。传统的PWM和捕获模块,其分辨率受限于系统时钟周期,在百兆赫兹级别的时钟下,一个计数周期就是10纳秒,这对于追求极致效率与性能的现代电源和伺服系统来说,往往成了瓶颈。TI的C2000系列DSP,特别是TMS320x2806x这类器件,其杀手锏之一就是集成了高分辨率脉宽调制(HRPWM)和高分辨率捕获(HRCAP)模块。这俩兄弟一个负责“精准地打出去”,一个负责“精准地量回来”,把时间控制的精度提升了一个数量级。
简单来说,HRPWM的核心是微边沿定位器(MEP)。你可以把它想象成一把游标卡尺上的副尺。主尺的刻度是系统时钟周期(比如10ns),而MEP能在这个大刻度里再进行精细的划分,实现皮秒级别的边沿位置调整。这样一来,PWM的占空比和周期就能以远高于系统时钟频率的分辨率进行设置,对于优化开关电源的纹波、提高逆变器的输出波形质量至关重要。
而HRCAP则是HRPWM的“镜像”技术,它用类似的MEP逻辑来测量外部输入脉冲的宽度。传统捕获模块的误差在±1个时钟周期,而HRCAP通过内部校准,可以将每个边沿的捕获精度提升到典型值±300皮秒以内。这使得它能够胜任电容触摸检测(测量微小的RC时间常数变化)、电机转速的瞬时测量、超声波测距等对时间抖动极其敏感的应用。
本文将以TMS320x2806x为蓝本,抛开手册式的罗列,深入寄存器层面,结合我实际在数字电源和电机控制项目中的调试经验,为你拆解HRPWM与HRCAP的配置精髓、实战中的“坑”以及如何让它们稳定发挥出极限性能。无论你是正在评估C2000用于新项目,还是已经在使用但对其高分辨率功能一知半解,相信这篇“寄存器级”的实战指南都能让你豁然开朗。
2. HRPWM模块深度解析与寄存器实战
HRPWM并非一个完全独立的外设,它是增强型PWM(ePWM)模块的一个“高精度选装包”。理解这一点很重要,意味着你首先得搭建好ePWM的基础框架——时基、计数模式、比较逻辑等,然后再在这个基础上开启HRPWM的“精修”功能。
2.1 核心寄存器地图与功能分组
手册里的寄存器列表看起来繁杂,但按功能归类后就很清晰。HRPWM相关的寄存器主要分为三组:
时基与比较寄存器的高分辨率扩展:这是在原有ePWM寄存器基础上增加的“影子”或“高分辨率”部分。
TBPHSHR:高分辨率相位寄存器。当你想让多个PWM模块不仅频率同步,而且相位对齐也能做到高精度时,它就是关键。TBPRDHR:高分辨率周期寄存器。用于实现高分辨率周期模式(Type 1 ePWM支持),允许周期值本身也有小数部分,实现更精细的频率调节。CMPAHR:高分辨率比较寄存器A。这是最常用的寄存器,用于控制PWMxA输出的边沿(上升沿、下降沿或双边)的精细位置,从而实现高分辨率占空比。
HRPWM专用控制寄存器:这组寄存器是HRPWM功能的“大脑”。
HRCNFG:配置寄存器。所有HRPWM的核心模式选择都在这里,是配置的起点。HRMSTEP:MEP步进值寄存器。存放了硬件自动缩放所需的“比例因子”,通常由TI提供的软件频率优化器(SFO)库函数自动更新。HRPCTL:高分辨率周期控制寄存器。主要用于使能高分辨率周期模式及相关同步功能。
镜像寄存器:如
CMPAHRM,TBPRDHRM等。这些是用于在特定同步事件(如PWM同步信号)发生时,将高分辨率值从影子寄存器安全地传输到活动寄存器的中间缓冲区。在大多数应用场景下,我们直接操作影子寄存器即可,硬件会在合适的时刻(由HRLOAD位定义)自动完成到镜像再到活动寄存器的加载,但理解其存在对于调试复杂同步系统很有帮助。
2.2 HRCNFG配置寄存器:模式选择的艺术
HRCNFG寄存器是HRPWM的“总开关”和“模式选择器”,每一位的设置都直接决定了HRPWM的行为。我们逐位分析其实战意义:
EDGMODE[1:0](边沿模式):这是第一个要决定的。它选择哪个边由MEP控制。
00:禁用HRPWM。这是复位默认值,如果你配置了半天没效果,首先检查这里。01:MEP控制上升沿。这是最常用的模式之一。在这种模式下,PWM的下降沿由传统的CMPA寄存器(整数部分)决定,而上升沿的精确位置则由CMPAHR(小数部分)微调。适用于需要精确控制开通时刻(如同步整流的开通延迟)的场景。10:MEP控制下降沿。与上一种相反,上升沿由CMPA整数部分固定,下降沿由CMPAHR微调。适用于需要精确控制关断时刻(如为了减小死区时间或特定谐波消除)的场景。11:MEP控制双边沿。此模式仅用于高分辨率相位控制(CTLMODE=1)或高分辨率周期控制(HRPE=1)。在这种高级模式下,CMPAHR或TBPHSHR控制的是双边沿的精细移动,用于实现相移或周期微调。
CTLMODE(控制模式):决定MEP受谁控制。
0:占空比/周期控制模式(默认)。MEP由CMPAHR(控制边沿)或TBPRDHR(控制周期)控制。这是实现高分辨率占空比的标准模式。1:相位控制模式。MEP由TBPHSHR寄存器控制。此模式用于实现多个PWM通道之间超高精度的相位同步,在多相交错并联的电源设计中极其有用。
HRLOAD[1:0](装载模式):决定
CMPAHR影子寄存器的值何时被加载到有效寄存器中。这个选择会影响PWM更新的实时性和安全性。00:在TBCTR = 0时装载。这是最安全、最常用的方式,确保在新的PWM周期开始时更新占空比,避免周期中间出现毛刺。01:在TBCTR = TBPRD时装载。在增计数模式下,这与CTR=0效果相同;在增减计数模式下,则在周期峰值时装载,适用于需要在周期对称点更新参数的算法。10:在CTR=0或CTR=PRD时装载。为增减计数模式提供了更大的灵活性。11:保留。不要使用。
SELOUTB(B输出选择):一个很实用的位。当置1时,ePWMxB输出的是ePWMxA信号的反相。这常用于生成一对互补的PWM信号,而无需占用两个独立的比较寄存器
CMPA和CMPB,简化了控制逻辑。AUTOCONV(自动转换使能):这是简化软件复杂度的关键。
0:禁用。你需要自己在软件中计算高分辨率值。公式类似于:CMPAHR = (小数部分(PWM占空比 * PWM周期) * MEP比例因子) << 8 + 0x80。其中0x80是四舍五入的偏移量。这种方式繁琐且容易出错。1:使能(强烈推荐)。硬件会自动使用HRMSTEP寄存器中的比例因子,对你写入CMPAHR/TBPRDHR/TBPHSHR的小数值进行缩放。你只需要关心目标占空比或相位的小数部分(Q8格式,即0-255对应0-1),硬件帮你完成剩下的乘法。这大大降低了编程负担。
SWAPAB(交换输出):简单粗暴地交换ePWMxA和ePWMxB的输出引脚。在PCB布线错误或需要快速切换驱动通道时,这个位可以救命,避免了重新焊接的麻烦。
实操心得:HRCNFG配置顺序我的习惯配置流程是:先确定应用需求(是调占空比还是调相位?),然后设置
EDGMODE和CTLMODE。接着,务必使能AUTOCONV=1,并设置HRLOAD为00(除非有特殊同步需求)。最后根据硬件连接决定是否启用SELOUTB或SWAPAB。这个顺序能避免很多初期调试时的灵异现象。
2.3 HRMSTEP寄存器与SFO库:精度校准的核心
HRMSTEP寄存器存放着MEP比例因子(MEP_ScaleFactor)。这个值不是固定的,它会随着芯片的工艺、工作电压和温度(PVT)变化而漂移。这就是为什么需要软件频率优化器(Software Frequency Optimizer, SFO)库的原因。
SFO库函数(如SFO())是一个后台任务,它会周期性地运行,通过内部逻辑测量MEP的实际步进时间,并动态更新HRMSTEP寄存器的值。当AUTOCONV=1时,硬件就利用这个最新的、校准过的比例因子来正确解释你写入CMPAHR的小数值。
实战要点:
- 必须链接SFO库:在你的工程中,必须包含TI提供的SFO库文件(例如
sfotl_f28004x.lib,具体型号不同库名不同),并调用SFO()函数。通常将其放在一个低优先级的后台循环或定时器中断中,以1-10Hz的频率运行即可。 - 检查SFO状态:
SFO()函数会返回一个状态值(如SFO_INCOMPLETE,SFO_ERROR,SFO_FINISHED)。在初始化HRPWM后,应等待其返回SFO_FINISHED,确保比例因子已就绪,再开始输出PWM。 - 理解误差:即使有SFO,HRPWM的精度也不是无限的。数据手册会给出一个“MEP精度”指标,例如±150ps。这意味着边沿的实际位置可能在目标位置的±150ps范围内抖动。在设计对时序极其苛刻的电路(如氮化镓GaN器件的驱动)时,必须将这个误差纳入考虑。
2.4 高分辨率周期模式与HRPCTL寄存器
默认的HRPWM(Type 0)只支持高分辨率占空比。而TMS320x2806x的某些ePWM模块是Type 1,支持高分辨率周期模式,由HRPCTL.HRPE位使能。
- HRPE(高分辨率周期使能):
0:禁用,模块作为Type 0 ePWM工作。1:使能。此时,TBPRDHR寄存器生效,PWM周期(TBPRD)也可以拥有高分辨率的小数部分。同时,EDGMODE必须设置为11(双边沿控制)。
重要限制:当HRPE=1时,时基计数器模式仅支持增计数(TBCTL.CTRMODE = 2)和增减计数(TBCTL.CTRMODE = 3),不支持单纯的减计数模式。这是因为高分辨率周期调节的逻辑在减计数模式下无法实现。
- TBPHSHRLOADE:这是一个强大的同步功能。当多个ePWM模块需要以高分辨率相位严格对齐时(例如多相并联变换器),除了设置常规的相位加载(
TBCTL.PHSEN),还需要将此位置1。这样,在同步事件(SYNCIN或软件同步)发生时,不仅整数相位寄存器TBPHS会被加载,高分辨率相位寄存器TBPHSHR的值也会被同步加载,确保亚纳秒级的相位对齐精度。
3. HRCAP模块深度解析与捕获实战
如果说HRPWM是“神射手”,那么HRCAP就是“神枪手”。它的任务是以超高精度测量外部脉冲的宽度。其核心同样依赖于MEP技术,但方向是相反的:测量输入边沿在MEP“游标卡尺”上的精确位置。
3.1 HRCAP时钟架构与模式选择
HRCAP的精度基石是HCCAPCLK。理解它的来源至关重要:
- 来源选择由
HCCTL.HCCAPCLKSEL控制:0来自SYSCLKOUT;1来自PLL2CLK(通常频率更高)。 - 关键点:如果选择
PLL2CLK,HCCAPCLK将与系统时钟SYSCLK异步。这意味着捕获计时与CPU核心的运行不同步,在读取捕获计数器时需要特别注意时序,最好配合DMA使用,避免软件读取引入的不确定性抖动。 HCCAPCLK的频率必须在数据手册规定的范围内(例如98MHz至120MHz)。超出范围可能导致校准失败或测量误差增大。
HRCAP有两种工作模式,由HCCTL.HCRES位选择:
- 普通捕获模式:精度为±1个
HCCAPCLK周期。例如,120MHz时钟下,精度约为±8.33ns。此模式无需校准库,软件开销小。 - 高分辨率捕获模式:精度可达典型值±300ps(每个边沿)。必须使用TI提供的HCCal校准库。在此模式下,一个HRCAP通道和一个指定的ePWM模块(通常是编号最大的那个,如ePWM8)必须完全专用于校准,不能用于实际应用功能。
3.2 捕获计数器、寄存器与中断策略
HRCAP的核心是一个16位计数器HCCOUNTER,由HCCAPCLK驱动。其工作逻辑如下:
- 检测到边沿(上升或下降)时,
HCCOUNTER的当前值被锁存到对应的捕获寄存器。 - 锁存完成后,
HCCOUNTER立即复位到0,并开始为下一个脉冲宽度计数。 - 因此,实际的脉冲宽度 = 捕获寄存器值 + 1。这个“+1”对应的是计数器从0到1所经历的那个
HCCAPCLK周期。
捕获寄存器有两组,构成一个2级深度的FIFO:
HCCAPCNTRISE0/1:存储低电平脉宽(上一个下降沿到当前上升沿)。HCCAPCNTFALL0/1:存储高电平脉宽(上一个上升沿到当前下降沿)。
中断策略是HRCAP编程的灵魂。手册强烈建议不要同时使能上升沿(RISE)和下降沿(FALL)中断。你应该根据测量需求二选一:
- 使用上升沿中断:在中断服务程序(ISR)中,你可以读取到两个完整低脉宽(
HCCAPCNTRISE0和HCCAPCNTRISE1)和一个完整高脉宽(HCCAPCNTFALL1)的有效数据。适合测量周期信号,尤其是占空比变化大的情况,因为你总能捕获到完整的周期信息。 - 使用下降沿中断:在ISR中,你可以读取到两个完整高脉宽(
HCCAPCNTFALL0和HCCAPCNTFALL1)和一个完整低脉宽(HCCAPCNTRISE0)的有效数据。适合捕获高电平很短的脉冲(如超声波回波),因为你有更充裕的时间(直到下一个上升沿到来之前)去读取数据。
踩过的坑:首次捕获数据无效这是新手最容易困惑的地方。上电或软复位后,
HCCOUNTER从0开始自由运行。第一个捕获事件锁存的是计数器从启动到该边沿的累计值,这不是一个有效的脉冲宽度。因此,前两次捕获的数据必须丢弃。具体来说:
- 使用上升沿中断:丢弃第一次中断的
HCCAPCNTRISE0和第二次中断的HCCAPCNTRISE1。- 使用下降沿中断:丢弃第一次中断的
HCCAPCNTFALL0和第二次中断的HCCAPCNTFALL1。 从第三次中断开始,数据才稳定可靠。务必在初始化后主动产生或等待两个无效脉冲后再开始正式测量。
3.3 HCCal校准库函数使用详解
要使用高分辨率模式,必须调用HCCal库。这个库是闭源的(HCCal_Type0_V1.lib),但提供了清晰的API。
第一步:校准Uint16 HRCAP_Cal(Uint16 HRCAPModule, Uint16 PLLClk, volatile struct EPWM_REGS *ePWMModule);
HRCAPModule:用于校准的HRCAP模块号(如1代表HRCAP1)。此模块在程序运行期间将一直用于校准,不能用于实际信号捕获。PLLClk:HCCAPCLK来源,0为SYSCLK,1为PLLCLK。ePWMModule:指向用于校准的ePWM模块寄存器组的指针(如&EPwm8Regs)。该ePWM模块在整个应用运行期间也不能再用于其他PWM输出。- 返回值:0(校准中),1(错误,检查时钟配置),2(校准完成)。必须在初始化阶段调用此函数并���待返回2,后续在后台定期调用(如1Hz)以补偿温漂。
第二步:测量校准完成后,其他HRCAP模块(非校准专用)即可用于高精度测量。库提供了四个核心函数,它们将原始的计数器值和校准参数结合,返回Q16格式的定点数结果���高16位为整数部分,低16位为小数部分,表示HCCAPCLK周期数)。
LowPulseWidth0():返回围绕HCCAPCNTRISE0的低脉冲宽度。在上升沿中断中调用,获取刚结束的低电平时间。HighPulseWidth0():返回围绕HCCAPCNTFALL0的高脉冲宽度。在下降沿中断中调用,获取刚结束的高电平时间。HighPulseWidth1():返回围绕HCCAPCNTFALL1的高脉冲宽度。在上升沿中断中调用,获取前一个高电平时间。PeriodWidthRise0():返回从上一个上升沿到当前上升沿的周期(HCCAPCNTRISE0 + HCCAPCNTFALL1)。在上升沿中断中调用。PeriodWidthFall0():返回从上一个下降沿到当前下降沿的周期(HCCAPCNTFALL0 + HCCAPCNTRISE0)。在下降沿中断中调用。
示例:在上升沿中断中计算频率和占空比
// 假设使用HRCAP2进行测量,HRCAP1和EPWM8用于校准 volatile float measured_freq_Hz, measured_duty_percent; __interrupt void hrcap2_isr(void) { Uint32 high_width_q16, low_width_q16, period_q16; // 读取高、低脉冲宽度和周期(Q16格式) high_width_q16 = HighPulseWidth1((Uint16 *)&HRCAP2Regs); // 前一个高电平 low_width_q16 = LowPulseWidth0((Uint16 *)&HRCAP2Regs); // 刚结束的低电平 period_q16 = PeriodWidthRise0((Uint16 *)&HRCAP2Regs); // 完整周期 // 转换为实际时间(假设HCCAPCLK = 120MHz, 周期为8.333... ns) // Q16数转换为浮点数: value_float = (float)value_q16 / 65536.0 // 时间 = (Q16值 / 65536) * (1 / HCCAPCLK频率) float hccapclk_period_ns = 1.0 / 120.0e6 * 1.0e9; // 8.3333 ns float high_time_ns = ((float)high_width_q16 / 65536.0) * hccapclk_period_ns; float period_ns = ((float)period_q16 / 65536.0) * hccapclk_period_ns; measured_freq_Hz = 1.0e9 / period_ns; measured_duty_percent = (high_time_ns / period_ns) * 100.0; // 清除中断标志 HRCAP2Regs.HCICLR.bit.RISE = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP10; // 假设HRCAP2在PIE组10 }4. 典型应用场景配置指南与避坑大全
4.1 场景一:数字电源的精确占空比控制(HRPWM)
目标:在500kHz开关频率下,实现优于12位的占空比分辨率(步进小于0.025%)。配置要点:
- ePWM基础配置:设置时基为增计数模式,周期
TBPRD对应500kHz。死区模块、动作限定器等按需配置。 - HRPWM配置:
HRCNFG.EDGMODE = 01(MEP控制上升沿)。通常我们精确控制开关管的开通时刻。HRCNFG.CTLMODE = 0(占空比控制)。HRCNFG.AUTOCONV = 1(使能自动转换,必须!)。HRCNFG.HRLOAD = 00(零周期点装载,最安全)。- 调用
SFO()库并等待初始化完成。
- 软件计算:假设目标占空比为D(0.0到1.0),
TBPRD为PRD。- 计算比较值整数部分:
CMPA = (Uint16)(D * PRD)。 - 计算比较值小数部分(Q8格式,0-255):
CMPAHR = (Uint16)((D * PRD - (float)CMPA) * 256.0)。 - 由于
AUTOCONV=1,你只需要将计算出的CMPAHR值写入寄存器,硬件会自动用HRMSTEP缩放。
- 计算比较值整数部分:
避坑指南:
- SFO未就绪:在SFO返回
SFO_FINISHED前就更新CMPAHR,会导致占空比严重错误。务必添加状态检查。 - 影子寄存器未生效:写入
CMPAHR后,占空比没有立即变化?检查HRLOAD设置的事件点是否已发生(例如,是否要等到下一个周期开始)。调试时,可以临时使用立即装载模式(但生产代码不推荐,可能引起毛刺)。 - 精度达不到预期:检查系统时钟和ePWM时钟分频。HRPWM的最终精度(ps/LSB)取决于
HRMSTEP值和系统时钟周期。在给定的温度和电压下,这是一个固定范围,数据手册会给出最差情况值。不要期望超出数据手册指标的精度。
4.2 场景二:多相交错并联的相位同步(HRPWM高分辨率相位)
目标:三相交错并联Buck变换器,各相开关频率200kHz,相位互差120度,且相位差精度需达到纳秒级。配置要点:
- 主模块(ePWM1)配置:作为时钟源,配置好200kHz周期。
HRCNFG按常规占空比模式配置。 - 从模块(ePWM2, ePWM3)配置:
- 时基模式与主模块相同。
TBCTL.PHSEN = 1,允许相位寄存器加载。HRCNFG.EDGMODE = 11(双边沿控制,用于相位移动)。HRCNFG.CTLMODE = 1(相位控制模式)。HRCNFG.AUTOCONV = 1。HRPCTL.TBPHSHRLOADE = 1(关键!使能高分辨率相位同步加载)。HRPCTL.HRPE = 0(本例仅需相位高分辨,不启用周期高分辨)。
- 相位设置:
- 计算相位延迟对应的计数器和MEP值。对于120度相位差,延迟 = (1/3) * 周期。
- 整数部分写入
TBPHS寄存器。 - 小数部分(Q8格式)写入
TBPHSHR寄存器。
- 同步:通过主模块的同步输出(SYNCOUT)触发从模块的同步输入(SYNCIN)。当同步事件发生时,从模块会同时加载
TBPHS和TBPHSHR,实现精确的相位对齐。
4.3 场景三:电容式触摸按键检测(HRCAP)
目标:检测RC充电时间的微小变化,识别触摸事件。配置要点:
- 硬件连接:使用一个GPIO驱动RC网络,该网络的中点连接至HRCAP输入引脚。通过GPIO输出一个已知宽度的脉冲给RC电路充电,然后切换为高阻态,用HRCAP测量电容放电到阈值电压的时间。
- HRCAP配置:
- 选择高分辨率捕获模式(
HCCTL.HCRES = 1)。 - 配置
HCCAPCLK为最高允许频率(如120MHz)以获得最佳时间分辨率。 - 选择下降沿中断(
HCCTL.FALLINTE = 1),因为通常测量放电时间(一个下降沿到下一个上升沿之间的低电平时间?这里需要根据电路调整,核心是测量脉冲宽度)。实际上,触摸导致电容变化,会改变充电/放电时间,从而改变捕获到的脉冲宽度。 - 初始化并运行
HRCAP_Cal()。
- 选择高分辨率捕获模式(
- 软件流程:
- GPIO输出脉冲启动充电。
- 切换GPIO为输入(高阻),电容开始通过电阻放电。
- HRCAP捕获放电时间(即从GPIO变高阻到电压降至输入逻辑阈值的时间)。
- 在中断中调用
LowPulseWidth0()或HighPulseWidth0()(取决于你测量的是高电平还是低电平时间)获取高精度宽度值。 - 与无触摸时的基准值比较,差值超过阈值则判定为触摸。
避坑指南:
- 校准通道占用:务必确认你的硬件设计。用于校准的HRCAP(例如HRCAP1)和ePWM(例如ePWM8)的引脚不能再作他用。PCB布局时就要规划好。
- 中断服务程序(ISR)效率:HRCAP在最高速下,中断可能非常频繁。ISR必须极其精简,只做必要的读取和标志设置,将复杂的计算(如Q16到浮点转换、滤波、判断)移到后台主循环中。考虑使用DMA将捕获寄存器值直接搬运到内存,进一步减轻CPU负担。
- 信号噪声:HRCAP的精度极高,也意味着它对噪声极其敏感。确保被测信号干净,PCB布局时HRCAP输入引脚应远离噪声源(如开关节点),并考虑添加适当的RC滤波(但要注意滤波会引入延迟,影响测量绝对值)。
- 时钟异步问题:如果
HCCAPCLK来自PLL2(与系统时钟异步),在ISR中连续读取多个16位寄存器(如HCCAPCNTRISE0和HCCAPCNTFALL1)时,可能会因为异步时钟域在读取间隙发生计数器更新,导致读到不匹配的值(例如,一个值是更新前的,另一个是更新后的)。解决方案是:要么使用DMA,要么在读取前暂时禁用捕获,读完后恢复,但这会丢失脉冲。更好的办法是确保HCCAPCLK与系统时钟同源,或者使用硬件FIFO和DMA来规避此问题。
5. 调试技巧与���见问题排查
调试HRPWM和HRCAP,示波器是必不可少的,但更需要策略。
5.1 HRPWM输出异常排查
- 无高分辨率效果:首先检查
HRCNFG.EDGMODE是否被设置为00(禁用)。其次,用示波器放大观察PWM边沿,在改变CMPAHR值时,边沿应该有细微移动(可能只有几百皮秒)。如果看不到,检查AUTOCONV是否使能,以及HRMSTEP寄存器值是否为非零(SFO是否成功运行)。 - 输出完全不对或没有输出:回归基础。检查ePWM模块的时钟是否使能、时基计数器是否在运行、输出引脚是否已正确映射(GPIO MUX配置)、动作限定器(AQ)是否配置了正确的动作(如置高、清零)。
- 占空比更新有毛刺:确认
HRLOAD设置在CTR=0或CTR=PRD。避免在计数器运行过程中更新活动寄存器。检查影子寄存器到活动寄存器的加载事件是否与你写入寄存器的时刻太近,导致加载了半新半旧的值。
5.2 HRCAP测量不准排查
- 测量值跳动大:
- 检查校准:确认
HRCAP_Cal()被定期调用且返回成功。温度或电压剧烈变化时,需要更频繁地校准。 - 检查信号质量:用示波器观察HRCAP输入引脚,看是否有振铃、过冲或噪声。添加一个小电容(如10pF)到地可能有助于滤除高频噪声。
- 检查时钟:确认
HCCAPCLK频率在数据手册规定范围内。频率过低会降低分辨率,过高可能导致内部电路不稳定。
- 检查校准:确认
- 捕获不到中断:
- 检查输入引脚GPIO是否配置为HRCAP功能,而非普通输入。
- 检查HRCAP模块时钟
HRCAPCLKEN是否使能。 - 检查PIE中断配置是否正确:外设级中断使能(
HCCTL.RISEINTE/FALLINTE)、PIE组内中断使能、CPU级IER和全局中断使能。 - 使用
HCIFRC寄存器软件强制产生一个中断,测试中断通路是否畅通。
- 测量值恒为0或极小:可能是
HCCOUNTER没有正确复位/启动。检查HCCTL寄存器中是否有使计数器停止的控制位被误设置。确认输入信号有正常的边沿跳变。
5.3 软件层面的常见错误
- 忘记EALLOW保护:HRPWM和HRCAP的许多关键寄存器(如
HRCNFG,HRMSTEP,HRPCTL,HCCTL等)受EALLOW保护。在修改它们之前,必须调用EALLOW;,修改后调用EDIS;。EALLOW; HRPWM1Regs.HRCNFG.bit.EDGMODE = 1; // 配置上升沿MEP控制 HRPWM1Regs.HRCNFG.bit.AUTOCONV = 1; EDIS; - 数据类型和计算溢出:在计算
CMPAHR等Q8格式的小数部分时,注意浮点运算和定点运算的转换。使用Uint16类型存储寄存器值,但在计算时可能需要float或Uint32中间变量来避免溢出。 - 库函数链接错误:确保工程正确链接了
SFO库和HCCal库。这两个库文件通常位于C2000Ware安装目录下的libraries\calibration文件夹中。链接器搜索路径要设置正确。
深入理解并熟练运用TMS320x2806x的HRPWM和HRCAP模块,能够将你的数字电源、电机控制或精密测量项目的性能推向一个新的高度。这需要耐心地阅读手册、仔细地配置寄存器、严谨地编写代码,并借助示波器进行细致的验证。一旦打通整个流程,你会发现这种皮秒级别的控制与测量能力,将成为你解决复杂工程问题的利器。