深入解析CC27xx LGPT1定时器:从PWM生成到电机控制实战

1. LGPT1:从基础定时器到复杂电机控制的核心引擎

在嵌入式系统开发中,定时器(Timer)是如同心脏般的存在。它不仅仅是简单的“计时器”,更是实现精确时序控制、波形生成、信号测量以及复杂外设驱动的基石。无论是让一个LED灯以特定频率闪烁,还是驱动一个精密的无刷直流电机(BLDC),其背后都离不开一个配置得当、功能强大的定时器模块。德州仪器(TI)的CC27xx系列无线微控制器(MCU)内置了低功耗通用定时器(Low-power General Purpose Timer, LGPT),其中LGPT1模块以其丰富的功能和灵活的配置,成为实现从基础定时到高级电机控制应用的利器。

很多开发者初次接触这类定时器时,面对动辄几十个寄存器、数百页的数据手册,往往会感到无从下手。寄存器手册虽然详尽,但更像是一本字典,告诉你每个“单词”(寄存器位)的意思,却很少串联起如何用这些“单词”写出完整的“句子”(实现特定功能)。本文将带你深入CC27xx LGPT1的寄存器世界,我们不止步于翻译手册,而是聚焦于如何将这些寄存器组合起来,解决实际问题。我们会从最基础的定时器原理讲起,逐步深入到PWM生成、输入捕获、死区控制以及关键的故障安全处理,并结合实际电机控制场景,拆解每一步的配置逻辑和避坑要点。无论你是正在评估CC27xx用于新项目,还是已经在调试中遇到了棘手的PWM波形问题,相信这篇详尽的解析都能为你提供清晰的路径。

2. LGPT1架构全景与核心寄存器分类解析

在深入每个寄存器之前,我们有必要先俯瞰LGPT1的整体架构。理解模块的组成部分和数据流向,是进行正确配置的前提。LGPT1并非一个简单的向上/向下计数器,它是一个集成了多个独立通道、支持同步、具备硬件保护机制的复杂外设。

2.1 LGPT1核心功能模块拆解

LGPT1的核心可以看作由以下几个逻辑单元协同工作:

  1. 时基单元:这是定时器的心脏,主要由计数器(CNTR)和目标值寄存器(TGT)构成。它根据预分频器(PRECFG)提供的时钟进行计数,决定了PWM的周期或定时的时间基准。
  2. 通道单元:LGPT1拥有多个独立的通道(例如C0, C1, C2)。每个通道都包含一个捕获/比较寄存器(CxCC)及其对应的管道寄存器(PCxCC),以及一个配置寄存器(CxCFG)。通道可以独立工作,实现输入捕获(测量脉冲宽度)或输出比较(生成PWM边沿)。
  3. 输出控制与调制单元:该单元将通道产生的动作事件(如比较匹配、清零、置位)映射到具体的物理输出引脚(OUT0, OUT1, OUT2)及其互补输出。它集成了死区时间发生器(DBCTL, DBDLY),这是电机驱动中防止上下桥臂直通的关键硬件。
  4. 故障处理与安全单元:包括故障输入检测(FAULT)和停车(PARK)逻辑。当外部故障信号(如过流、过温)有效时,该单元可以立即或安全地停止PWM输出,并将其强制驱动到预设的安全状态(如全部拉低),保护功率器件。
  5. 中断与触发单元:管理所有内部事件(计数器达到目标值、零值、捕获发生、比较匹配、故障等)的中断产生(IMASK, RIS, MIS)以及向其他外设(如ADC)发出触发信号(ADCTRG)。
  6. 控制与同步单元:通过CTL寄存器控制整个定时器的模式(如单次、连续、上下计数),并通过STARTCFG实现多个定时器之间的同步启动,对于多电机协同或复杂PWM序列生成至关重要。

2.2 寄存器地图的功能分组

面对长长的寄存器列表,我们可以按功能将其分组,化繁为简:

寄存器组核心寄存器主要功能
核心控制与状态CTL, CNTR, TGT, PRECFG设定工作模式、计数方向、时钟源、计数器当前值及周期值。
通道配置C0CFG, C1CFG, C2CFG配置每个通道的工作模式(捕获/比较)、触发边沿、控制哪个输出。
通道值寄存器C0CC/C0CCNC, C1CC/C1CCNC, C2CC/C2CCNC设置比较值或读取捕获值。“NC”版本读写时不清除中断标志。
管道寄存器PTGT/PTGTNC, PC0CC/PC0CCNC...用于在下一个周期更新目标值或比较值,实现无抖动(Jitter-free)的PWM参数更新。
输出与死区OUTCTL, IOCTL, DBCTL, DBDLY手动控制输出、配置输出极性、使能及配置死区时间。
故障与安全FAULT, PARK配置故障输入响应模式(立即停止、零值停止)和故障/调试时的输出安全状态。
中断管理IMASK, RIS, MIS, ICLR, ISET...使能、查询、清除各类中断事件。
DMA与ADC触发DMA, DMARW, ADCTRG配置DMA传输(用于批量更新比较值)和ADC采样触发事件。
描述与杂项DESC, DESCEX, STARTCFG, CHFILT, EMU提供模块信息、同步启动配置、输入滤波、调试控制等。

一个重要的实操心得:在开始编程前,我习惯先画一张简单的寄存器配置流程图。先配置静态参数(如DESC, DESCEX),然后配置通道相关寄存器(CxCFG, CxCC),接着是输出和死区,再是故障保护,最后才使能定时器(CTL.MODE)。这个顺序很重要,可以避免在定时器运行后误触发事件或进入不安全状态。

3. 核心控制寄存器:构建定时器的基石

定时器的所有行为都源于几个核心控制寄存器的配置。这里我们深入探讨CTL、PRECFG和TGT,它们是定义定时器“性格”的关键。

3.1 CTL寄存器:定时器的模式与灵魂

CTL寄存器是总司令,它决定了定时器以何种方式“跳动”。

  • MODE字段(位[2:0]):这是最重要的字段。它定义了7种主要工作模式:

    • DIS(0):禁用。所有操作停止,这是初始和安全状态。
    • UP_ONCE(1):单次向上计数。计数器从0计数到TGT值后停止,并自动将MODE设回DIS。适用于需要精确单次延迟的场景。
    • UP_PER(2):周期性向上计数。计数器从0到TGT循环计数,这是生成边沿对齐PWM最常用的模式。PWM周期 =(TGT.VAL + 1) * 定时器时钟周期
    • UPDWN_PER(3):周期性向上-向下计数。计数器从0到TGT,再递减回0,如此循环。这是生成中心对齐PWM(或称对称PWM)的模式,能有效减少谐波噪声,在电机控制和音频应用中很常见。PWM周期 =(TGT.VAL * 2) * 定时器时钟周期
    • QDEC(4):正交编码器模式。在此模式下,定时器能通过PHA、PHB两相输入自动解码旋转方向和计数,常用于读取电机编码器位置。
    • SYNC_*模式 (5,6,7):同步模式。允许本定时器在另一个LGPT(由STARTCFG选择)的启动信号触发下开始工作,实现多个定时器的精确同步,在多相电机控制或复杂电源拓扑中非常有用。
  • CMPDIR字段(位[4:3]):比较方向控制。这决定了在UPDWN_PER模式下,通道的比较事件在何时触发。例如,设置为UP(01b)则只在计数器递增时进行匹配比较;设置为BOTH(00b)则在递增和递减时都进行比较。这为你生成非对称的中心对齐PWM波形提供了灵活性。

  • CnRST位(位[10:8]):通道软件复位。向这些位写1可以单独复位对应通道的配置和值寄存器(CxCC, PCxCC, CxCFG),而不影响整个定时器。这在动态切换通道功能时非常方便,可以确保从一个干净的状态开始。

注意事项:数据手册中明确警告,配置定时器时,CTL.MODE应是最后写入的寄存器之一。这是因为改变MODE会清除内部所有的通道和TGT更新队列。正确的顺序是:先配置好所有通道、目标值、预分频等,最后再启动定时器(设置MODE)。如果需要运行时重配置,必须先停止定时器(MODE=DIS),修改配置,再重新启动。

3.2 PRECFG寄存器:掌控时间的脉搏

定时器的精度和频率范围由PRECFG寄存器控制。它本质上是一个前置分频器,可以对输入时钟进行分频,以得到更低的计数频率。

  • TICKSRC字段(位[1:0]):选择时基时钟源。可以是系统时钟(SYS_CLK),也可以是外部引脚TICKEN的边沿。使用外部时钟源可以实现与外部事件同步计数。
  • TICKDIV字段(位[15:8]):分频系数。这是一个8位寄存器,分频值 =TICKDIV + 1。因此分频范围是1到256。
  • 定时器时钟频率计算公式F_timer = F_source / (TICKDIV + 1)
  • 定时器时钟周期计算公式T_timer = (TICKDIV + 1) / F_source

举个例子:假设系统时钟F_source = 48 MHz,我们需要一个100 kHz的PWM载波频率(周期10us)。如果我们选择UP_PER模式,且PWM分辨率需要1000个计数点,则: PWM周期T_pwm = (TGT.VAL + 1) * T_timer。 设TGT.VAL = 999,则T_timer = T_pwm / 1000 = 10us / 1000 = 10 ns。 那么所需的定时器时钟频率F_timer = 1 / T_timer = 100 MHz。 这超过了系统时钟频率,无法实现。因此我们需要调整:降低分辨率或降低PWM频率。 若我们保持PWM频率100kHz,将分辨率降至480,则T_timer = 10us / 480 ≈ 20.83 nsF_timer ≈ 48 MHz。 此时TICKDIV = (F_source / F_timer) - 1 = (48MHz / 48MHz) - 1 = 0。 最终配置:PRECFG.TICKDIV = 0,TGT.VAL = 479

3.3 TGT与CNTR寄存器:周期的定义与实时追踪

  • TGT寄存器:定义了计数器的目标值,即周期值。在UP_PER模式下,计数器从0计数到TGT;在UPDWN_PER模式下,计数范围是0到TGT再到0。
  • CNTR寄存器:只读寄存器(在非QDEC模式下),实时反映计数器的当前值。你可以通过它来监控定时器的运行状态,或者在调试时查看计数是否正常。

一个关键机制:直接读写TGT寄存器会自动清除RIS.TGTRIS.ZERO中断标志。这在某些中断服务程序中需要注意,如果你先读了TGT,可能会意外清除中断标志。为此,LGPT1提供了TGTNC(No Clear)寄存器,读写它不会影响中断标志位。在需要频繁更新周期且不想干扰中断状态的场景下,应使用TGTNC

4. 通道配置与PWM生成实战

通道是LGPT1发挥威力的地方。每个通道都可以独立配置为输入捕获或输出比较模式,并通过CxCFG.CCACT字段定义丰富的动作序列。

4.1 输出比较模式:PWM生成的奥秘

PWM生成主要依赖于输出比较模式。我们以生成一个占空比可变的PWM为例,拆解配置过程。

目标:使用通道0(C0)在OUT0引脚上生成一个频率1kHz,占空比30%的边沿对齐PWM。

步骤分解

  1. 计算定时器参数

    • 假设系统时钟48MHz,PRECFG.TICKDIV = 47,则定时器时钟频率 = 48MHz / (47+1) = 1 MHz,周期T_timer = 1 us
    • 对于1kHz PWM,周期T_pwm = 1 ms = 1000 us
    • UP_PER模式下,T_pwm = (TGT.VAL + 1) * T_timer
    • 因此,TGT.VAL = (T_pwm / T_timer) - 1 = (1000us / 1us) - 1 = 999
    • 占空比30%,则高电平时间T_high = 300 us,对应的比较值C0CC.VAL = T_high / T_timer = 300
  2. 配置通道动作(CCACT)

    • 对于边沿对齐PWM,我们需要在计数器为0时输出高电平,在计数器等于比较值时输出低电平。查看C0CFG.CCACT描述,模式BhSET_ON_ZERO_TOGGLE_ON_CMP)正好符合:在CNTR=0时置位输出,在CNTR=C0CC时翻转输出
    • 由于初始输出为低,第一次在0置位后变高,在比较值翻转后变低,形成一个高电平脉冲。后续周期重复此过程。
  3. 配置通道控制输出

    • 我们需要通道0控制OUT0。因此设置C0CFG.OUT0 = 1(使能控制),C0CFG.OUT1C0CFG.OUT2保持为0。
  4. 写入比较值与目标值

    • 写入C0CC.VAL = 300
    • 写入TGT.VAL = 999
  5. 启动定时器

    • 最后,配置CTL.MODE = UP_PER(0x2)。

对应的C代码片段可能如下

// 假设 LGPT1 寄存器基地址已定义 LGPT1->PRECFG = (47 << 8); // TICKDIV = 47 LGPT1->C0CFG = (0xB << 0) | (1 << 8); // CCACT = Bh (SET_ON_ZERO_TOGGLE_ON_CMP), OUT0=1 LGPT1->C0CC = 300; // 比较值 LGPT1->TGT = 999; // 周期值 LGPT1->CTL = 0x2; // MODE = UP_PER

4.2 中心对齐PWM与互补输出

对于电机控制,尤其是驱动H桥,我们通常需要一对互补的、带死区的PWM信号(例如OUT0和它的互补输出COUT0)。这时需要使用UPDWN_PER模式。

配置变化

  • CTL.MODE = UPDWN_PER(0x3)。
  • 通道动作CCACT选择模式AhCLEAR_ON_ZERO_TOGGLE_ON_CMP)。该模式在CNTR=0时清零输出,在CNTR=CxCC时翻转输出。在中心对齐模式下,这会生成一个以计数器峰值(TGT)为中心对称的PWM波形。
  • 占空比计算:在UPDWN_PER模式下,占空比公式为Duty Cycle = 1 - (CxCC.VAL / TGT.VAL)。例如,若要50%占空比,则设置CxCC.VAL = TGT.VAL / 2
  • 使能死区:通过DBCTL.IO0 = 1使能OUT0/COUT0对的死区,并在DBDLY中分别设置上升沿延迟(RISEDLY)和下降沿延迟(FALLDLY)。死区时间 = 延迟值 * 系统时钟周期。

4.3 输入捕获模式:测量频率与脉宽

输入捕获模式用于测量外部信号的频率、周期或脉冲宽度。例如,测量一个方波信号的高电平时间。

配置流程

  1. 选择输入源和边沿:通过CxCFG.INPUT选择输入信号来自IO控制器还是事件总线,通过CxCFG.EDGE选择在上升沿、下降沿或双边沿触发捕获。
  2. 配置捕获动作CCACT选择模式9hSET_ON_CAPT)。该模式在捕获事件发生时,会将当前的CNTR值锁存到CxCC寄存器中,并产生中断(如果使能)。
  3. 连接滤波器:如果输入信号有噪声,可以通过CHFILT寄存器配置数字滤波器,防止误触发。
  4. 读取与计算:在捕获中断服务程序中,读取CxCC寄存器的值。如果是测量周期,需要连续捕获两个上升沿,计算差值。注意计数器溢出处理。

关键避坑点:数据手册在CxCFG寄存器描述中特别强调,当定时器已启动(CTL.MODE != DIS)时,若要配置通道为捕获模式,必须遵循特定顺序

  1. 先将EDGE字段设为NONE(关闭输入)。
  2. 再配置CCACT为目标捕获模式。
  3. 等待至少3个系统时钟周期。
  4. 最后将EDGE设为所需的边沿(RISE/FALL/BOTH)。 这个顺序是为了清空边沿检测电路中的残留信号,避免一使能就立即产生虚假的捕获事件。这个细节在调试捕获功能异常时至关重要。

5. 高级功能:死区、故障保护与同步

5.1 死区时间插入:H桥驱动的生命线

在驱动MOSFET或IGBT构成的H桥时,必须确保同一桥臂的上管和下管不会同时导通(即“直通”),否则会导致电源短路烧毁器件。死区时间就是在互补的PWM信号切换时,插入一个两者都为低电平的短暂重叠区。

LGPT1的死区生成是硬件自动完成的,只需简单配置:

  1. 使能:对需要死区的输出对,设置DBCTL.IOx = 1
  2. 设置时间:在DBDLY寄存器中,RISEDLY控制参考信号上升沿到输出信号上升沿的延迟;FALLDLY控制参考信号下降沿到互补输出信号上升沿的延迟。延迟时间以系统时钟周期为单位。
    • 例如,系统时钟48MHz,需要500ns死区时间。则延迟值 = 500ns / (1/48MHz) = 500ns * 48e6 = 24。设置DBDLY.RISEDLY = 24,DBDLY.FALLDLY = 24

重要提示:死区逻辑作用于IO输出及其互补输出。参考信号是通道产生的原始PWM,死区发生器会生成两路带有延迟的最终输出。

5.2 故障处理与安全停车

工业电机控制中,故障保护(Fault Protection)是必须的。LGPT1的故障输入(通常连接至比较器或过流检测电路)和PARK寄存器共同构成了硬件级的安全网。

  • FAULT寄存器配置

    • CTL字段:定义故障响应模式。
      • IMMEDIATE(1):立即停止。故障有效时,硬件立即将CTL.MODE设为DIS,计数器停止。反应最快,但可能停在任意计数点,导致PWM输出处于非完整状态。
      • ZEROCOND(2):零条件停止。故障有效时,计数器继续运行,但在下一个CNTR=0的边界安全停止。这保证了PWM周期完整结束,是更优雅的停止方式。
      • IRQ(3):仅产生中断,不影响计数器运行。由软件决定如何处理。
    • 故障输入极性通过通道0的C0CFG.EDGE配置(RISE为高有效,FALL为低有效),这意味着故障信号与通道0的输入复用。启用故障功能后,通道0的输入将被覆盖。
  • PARK寄存器配置

    • CTL字段:定义何时进入“停车”状态(即输出强制为预设值)。可选择在故障时、调试器暂停CPU时,或两者都进入。
    • IOPSxIOCPSx字段:分别定义每个输出及其互补输出在停车状态下的电平(高或低)。通常,在电机驱动中,我们会将所有输出设置为低电平(或高阻),以确保所有功率管关闭

一个完整的故障安全配置示例

// 配置故障输入为低电平有效,零条件停止 LGPT1->C0CFG_b.EDGE = 2; // FALL (低电平有效) LGPT1->FAULT_b.CTL = 2; // ZEROCOND // 配置停车状态:故障时进入,所有输出强制为低 LGPT1->PARK = (2 << 0) | (0 << 2) | (0 << 3) | (0 << 4) | (0 << 5) | (0 << 6) | (0 << 7); // PARK.CTL = 2 (故障时停车) // IOPS0/1/2 = 0, IOCPS0/1/2 = 0 (所有输出低电平)

这样,当故障引脚被拉低时,定时器会在当前PWM周期结束时(CNTR回零)停止,并立即将所有6个PWM输出引脚驱动到预设的低电平状态,确保电机驱动电路安全关断。

5.3 同步与管道更新:实现无抖动控制

在需要动态调整PWM频率或占空比的应用中(如电机调速),直接写入TGTCxCC寄存器可能导致当前周期波形出现“毛刺”或“跳动”,因为写入可能发生在计数过程中的任意时刻。

LGPT1通过管道寄存器PTGT,PCxCC)和同步启动STARTCFG)解决了这个问题。

  • 管道更新:当你写入管道寄存器(如PC0CC)时,这个新值不会立即生效。它会被缓存起来,直到下一个计数器为零(CNTR=0)的边界,才自动加载到对应的活动寄存器(C0CC)中。这保证了PWM占空比的改变总是在一个周期的开始时同步更新,实现了“无抖动”切换。PTGT对于周期值的更新同理。
  • 同步启动:通过STARTCFG寄存器,可以将一个LGPT的启动绑定到另一个LGPT的特定事件(如开始计数)。这对于需要严格同步的多路PWM生成(如三相逆变器)至关重要,可以消除软件先后启动带来的微小相位差。

6. 中断、DMA与ADC触发:构建高效系统

6.1 中断系统详解

LGPT1拥有一个层次清晰的中断管理系统:

  1. 原始中断状态(RIS):任何中断事件发生,对应的RIS位都会置1,无论是否被屏蔽。
  2. 中断掩码(IMASK):决定哪些中断事件可以传递到下一级。IMASK中为1的位,对应的RIS事件才能影响MIS
  3. 被屏蔽的中断状态(MIS)MIS = RIS & IMASK。这是CPU实际查询或触发中断线的状态。
  4. 中断清除(ICLR):向ICLR的某位写1,可以清除对应的RISMIS位。
  5. 中断设置(ISET)与掩码设置/清除(IMSET/IMCLR):用于软件模拟中断事件或动态修改掩码。

典型的中断服务程序(ISR)流程

void LGPT1_IRQHandler(void) { uint32_t mis = LGPT1->MIS; // 读取当前被使能且活跃的中断 if (mis & LGPT_MIS_TGT) { // 处理周期结束事件 // ... 例如,更新下一个周期的管道比较值 LGPT1->ICLR = LGPT_ICLR_TGT; // 清除TGT中断标志 } if (mis & LGPT_MIS_C0CC) { // 处理通道0比较/捕获事件 // ... 例如,读取捕获值 LGPT1->ICLR = LGPT_ICLR_C0CC; // 清除C0CC中断标志 } // ... 处理其他中断 }

6.2 利用DMA减轻CPU负担

在电机FOC(磁场定向控制)等计算密集型应用中,CPU需要频繁更新PWM的占空比(比较值)。使用DMA可以将CPU解放出来。

配置DMA传输更新比较值

  1. 在内存中创建一个数组,存放一系列待更新的比较值。
  2. 配置LGPT1的DMA寄存器:
    • REQ:选择触发DMA请求的事件源,例如RIS.C0CC(通道0比较匹配)。
    • RWADDR:设置DMA要访问的LGPT1内部寄存器地址。例如,要更新PC0CC,其偏移地址是0x100,则RWADDR = 0x100 / 4 = 0x40
    • RWCNTR:设置DMA传输次数(RWCNTR+1次)。
  3. 配置MCU的DMA控制器,将源地址指向内存中的数组,目标地址指向LGPT1的DMARW寄存器(偏移0x40),并设置为在外设请求(LGPT1触发)下进行传输。
  4. 当通道0比较匹配事件发生时,LGPT1会向DMA控制器发出请求,DMA则自动将下一个比较值从内存搬运到DMARW寄存器,进而写入PC0CC管道。整个过程无需CPU干预。

6.3 精准的ADC采样触发

在电机控制中,需要在特定的PWM时刻(如中心点或下溢点)对相电流进行ADC采样,以实现准确的电流环控制。LGPT1的ADCTRG寄存器可以将内部事件(如RIS.ZERO,RIS.TGT,RIS.CxCC)映射为ADC的启动触发信号。

例如,配置ADCTRG.SRC = 1,则每当计数器达到目标值(RIS.TGT置位)时,LGPT1会自动产生一个脉冲触发ADC开始转换。这实现了硬件级别的精确同步,避免了软件触发的延迟和不确定性。

7. 调试技巧与常见问题排查

即使理解了所有寄存器,实际调试中仍会遇到各种问题。以下是一些常见问题的排查思路:

  • 问题1:没有PWM输出。

    • 检查时钟:确认系统时钟是否已配置并供给LGPT1?PRECFG.TICKSRCTICKDIV设置是否正确?可以用示波器测量一下定时器时钟引脚(如果使用外部时钟)或间接通过一个简单的翻转IO的中断来验证定时器是否在计数。
    • 检查模式CTL.MODE是否已设置为UP_PERUPDWN_PER等使能模式?还是停留在DIS状态?
    • 检查输出使能CxCFG.OUTx位是否已设置为1,使能了通道对输出的控制?
    • 检查IO复用:MCU的引脚复用功能是否已正确配置为LGPT1的输出功能?这通常在GPIO或IOC模块中配置,而非LGPT1本身。
    • 检查停车状态PARK.CTL是否配置为进入了停车模式?故障引脚是否被意外拉低?
  • 问题2:PWM频率或占空比不对。

    • 计算验证:重新核算TGTCxCCPRECFG的值与预期频率、占空比的匹配关系。注意UP_PERUPDWN_PER模式下的周期计算公式不同。
    • 管道更新:你是否直接写入了CxCC而非PCxCC?在定时器运行中直接写CxCC可能导致当前周期波形异常。对于动态调整,应始终使用管道寄存器PCxCC
    • 寄存器写入时机:确保在定时器启动(CTL.MODE != DIS)前,已经写入了初始的TGTCxCC值。
  • 问题3:输入捕获值不稳定或错误。

    • 信号滤波:输入信号是否有毛刺?尝试使能CHFILT滤波器,并适当增加LOAD值。
    • 配置顺序这是最常见的原因!你是否在定时器运行后更改了捕获配置?务必遵循“先设EDGE=NONE -> 改CCACT -> 等待 -> 再设EDGE”的顺序。
    • 计数器溢出:测量的脉冲周期是否可能超过计数器最大值(由DESCEX.CNTRW定义,通常为16位65535)?如果可能,需要开启溢出中断,并在软件中进行周期累加。
  • 问题4:死区时间不生效或波形奇怪。

    • 使能位:确认DBCTL中对应通道的死区使能位已置1。
    • 互补输出:确认你使用的是具有互补输出功能的IO引脚对,并且通道配置正确控制了主输出(如OUT0)。
    • 延迟值过大:如果RISEDLYFALLDLY设置的值过大,超过了PWM的有效高/低电平时间,可能会导致输出波形完全相反或一直为低。务必根据PWM周期和占空比合理设置死区时间。
  • 问题5:故障保护功能不动作。

    • 输入极性:检查C0CFG.EDGE配置的故障有效极性是否与实际硬件故障信号一致。
    • 故障模式:检查FAULT.CTL配置为所需的模式(IMMEDIATEZEROCOND)。
    • 停车状态:检查PARK.CTL是否使能了故障停车,以及IOPSx/IOCPSx设置的安全电平是否符合预期。
    • 引脚复用:故障输入引脚是否已正确复用为LGPT1功能?

调试时,善用EMU(调试控制)寄存器很有帮助。设置EMU.HALT=1,则当CPU被调试器暂停时,LGPT1也会根据EMU.CTL的设置立即或在零值处停止,这让你可以“冻结”PWM波形,方便用示波器观察特定时刻的状态。

最后,始终建议在初始化LGPT1后,先使用简单的配置(如固定占空比PWM)进行测试,确保基础功能正常,再逐步添加死区、故障保护、同步等复杂功能。寄存器配置虽然繁多,但遵循模块化的思路,逐个功能验证,就能稳步构建出稳定可靠的定时器应用。CC27xx的LGPT1是一个功能非常全面的定时器,深入掌握它,你就能游刃有余地应对大多数嵌入式系统中的定时与电机控制挑战。