1. 通用定时器(GPT)在嵌入式系统中的核心地位

在嵌入式开发领域,尤其是涉及电机控制、电源转换、传感器数据采集或任何需要精确时序的场景,通用定时器(GPT)往往是项目成败的关键。它不像CPU那样负责复杂的逻辑运算,而是扮演着“精准节拍器”和“时间雕刻师”的角色。我接触过不少项目,从简单的LED呼吸灯到复杂的无刷直流电机(BLDC)FOC控制,其底层都离不开对GPT的深度理解和灵活运用。TI的CC35xx系列无线MCU集成了功能强大的GPT模块,它远不止是一个简单的计数器,而是一个集成了PWM生成、正交解码、输入捕获、事件同步等多种功能的精密时序引擎。理解它,你就能在嵌入式系统中自如地驾驭时间。

对于嵌入式开发者而言,GPT的价值在于其“通用性”和“可编程性”。你可以把它配置成一个精准的延时发生器,也可以让它变成电机驱动的PWM源,或者是一个编码器接口,实时读取电机转速和位置。CC35xx的GPT模块提供了两个独立的定时器实例(GPT0, GPT1),每个都拥有4个通道、32位计数器以及丰富的操作模式,这为复杂的多任务时序管理提供了硬件基础。本文将深入拆解GPT的工作原理,并以PWM生成和正交解码这两个最经典、最考验功力的应用为例,手把手带你从寄存器配置到波形分析,掌握其核心用法与避坑技巧。

2. GPT模块架构与核心工作机制解析

要驾驭GPT,必须先理解它的“五脏六腑”。CC35xx的GPT模块是一个相对独立的外设,其核心设计思想是:以一个可编程的计数器为中心,通过预分频器调节“心跳”频率,并围绕计数器构建了输入捕获、输出比较、中断触发等一系列功能单元。

2.1 核心组件:预分频器与计数器

这是GPT的“心脏”和“脉搏”。系统时钟(例如80MHz)对于很多精准定时任务来说太快了,直接用它来计数会导致计数器很快溢出,且分辨率过高可能不必要。因此, 预分频器(Prescaler) 的作用就是进行第一次“降频”。

预分频器是一个8位的向下计数器,它从 PRECFG.TICKDIV 的值开始递减到0,每减到0就产生一个“滴答”(tick),这个“滴答”信号就是 定时器时钟(Timer Clock) 。计数器(CNTR)正是在这个定时器时钟的驱动下进行计数。计算公式很关键:

  • PRECFG.TICKSRC = 0 (选择系统时钟):定时器时钟频率 = 系统时钟频率 / ( PRECFG.TICKDIV + 1)
  • PRECFG.TICKSRC = 1 (选择事件管理器TICKEN信号):定时器时钟频率 = TICKEN信号频率 / ( PRECFG.TICKDIV + 1)

例如,系统时钟80MHz,设置 TICKDIV = 7999 ,那么定时器时钟频率就是 80MHz / 8000 = 10kHz。这意味着计数器每100微秒计一次数。预分频器的存在,让我们可以在很宽的范围内调整定时的基本时间单位。

计数器(CNTR) 是一个32位的寄存器,在定时器时钟的驱动下,根据 CTL.MODE 寄存器设置的 计数模式 工作。CC35xx GPT支持几种基本模式:

  • UP_ONCE(单次向上计数) :从0计数到目标值(TGT),然后停止。适合做单次精确延时。
  • UP_PER(周期向上计数) :从0计数到TGT,然后自动重置为0,循环往复。这是生成边沿对齐PWM的经典模式。
  • UPDWN_PER(周期向上向下计数) :从0计数到TGT,然后递减回0,如此循环。这是生成中心对齐PWM的必需模式。
  • QDEC(正交解码模式) :在此模式下,计数器不再由内部时钟驱动,而是根据外部输入的两路正交编码器信号(PHA, PHB)进行增减计数。这是实现位置反馈的核心。

注意 :计数器在运行过程中虽然可以写入,但官方手册明确指出,除了在QDEC模式下用于设置初始位置外,在其他模式运行期间写入计数器会导致不可预测的行为。因此,最佳实践是: 在启动定时器( CTL.MODE 设为非零)前,就设置好计数器的初始值(通常为0);若需修改周期,应通过更新PTGT(流水线目标寄存器)来实现,硬件会在计数器归零时自动将其加载到TGT,从而实现无毛刺的周期更新。

2.2 通道的“输入-处理-输出”流水线

每个GPT拥有4个通道,每个通道都是一条独立的“流水线”,可以配置为 输入捕获 输出比较 模式。理解这条流水线是灵活应用的关键。

输入侧逻辑 :当通道用于捕获时(例如测量脉冲宽度),信号来源可以是GPIO(通过IOC多路复用器)或事件管理器(Event Manager)的同步事件。信号进入后,首先经过 通道滤波器(Channel Filter) 。这个滤波器非常实用,它可以要求输入信号在连续多个采样周期内保持稳定,才认为是一次有效的边沿变化,从而滤除毛刺。 CHFILT.LOAD 寄存器决定了需要连续稳定的采样次数。例如,在电机控制中,编码器信号可能因抖动产生毛刺,设置适当的滤波可以确保计数准确。滤波器时钟可以选择系统时钟、预分频器时钟或定时器时钟,需根据信号频率和稳定性权衡滤波效果与响应延迟。滤波后的信号进入 边沿检测逻辑 ,根据 CnCFG.EDGE 的配置(上升沿、下降沿、双边沿)产生捕获事件。

核心动作(Channel Action) :这是通道的灵魂,由 CnCFG.CCACT 寄存器配置。它决定了通道在特定事件(计数器等于0、计数器等于比较值CnCC、捕获事件发生)发生时,该如何行动。动作分为 单次(One-shot) 连续(Continuous) 两大类。例如:

  • SET_ON_CAPTURE (单次):在捕获事件发生时,设置指定的输出事件,然后通道自动禁用。
  • TOGGLE_ON_COMPARE_REPEATEDLY (连续):每当计数器值等于比较寄存器 CnCC 的值时,就翻转指定的输出事件电平,循环不止。这是生成PWM波的基础动作之一。

输出侧逻辑 :通道产生的动作(如置位、清零、翻转)最终会作用于一个或多个 输出事件 。一个输出事件可以被多个通道控制,此时遵循固定的优先级: 清零(最高)> 置位 > 翻转 > 脉冲(最低) 。输出事件可以映射到物理GPIO引脚,也可以作为内部事件触发其他外设(如ADC)或产生中断/DMA请求。此外,GPT还支持 互补输出 死区插入(Dead-Band Insertion) 功能,这对于驱动半桥或全桥电路(如电机驱动、电源逆变)至关重要,可以防止上下桥臂同时导通导致短路。

2.3 同步与联动:多定时器协同作战

在复杂系统中,常常需要多个定时器精确同步工作。例如,一个定时器生成PWM,另一个定时器在PWM的特定时刻触发ADC采样。CC35xx的GPT支持硬件同步。你可以将GPT1配置为 SYNC_UP_PER (同步周期向上计数)模式,并通过事件管理器订阅GPT0产生的某个事件(如计数器归零事件)作为其启动同步(SYNC)信号。当GPT0的归零事件发生时,GPT1的计数器会同时从0开始计数,实现了硬同步,消除了软件启动带来的随机延迟。

3. PWM波形生成的深度实践与配置

生成PWM是GPT最广泛的应用。CC35xx的GPT支持 边沿对齐 中心对齐 两种PWM模式,分别适用于不同的场景。

3.1 边沿对齐PWM(UP_PER模式)

边沿对齐PWM的波形其脉冲前沿总是对齐在计数周期的开始(CNTR=0)。这种模式简单直观,常用于开关电源、LED调光等。

配置步骤与原理分析:

  1. 定时器基础配置

    • 设置 CTL.MODE = UP_PER (周期向上计数模式)。
    • 设置目标寄存器 TGT = Period - 1 。这里 Period 是你想要的PWM周期对应的计数值。例如,定时器时钟为10kHz(100us),想要1kHz(1ms)的PWM频率,则 Period = (1ms / 100us) = 10 TGT = 9
    • 通过 PRECFG.TICKDIV 调整定时器时钟,从而精细控制PWM频率。频率 = 定时器时钟频率 / (TGT + 1)。
  2. 通道动作配置

    • 选择一个通道(例如通道0)来生成PWM。
    • 设置 C0CFG.CCACT = SET_ON_0_TGL_ON_CMP_REPEATEDLY (在0置位,在比较点翻转)。这个动作是边沿对齐PWM的关键:在计数器为0时,输出置为高电平;当计数器增长到等于比较寄存器 C0CC 的值时,输出翻转为低电平。
    • 设置 C0CFG.OUT0 = 1 ,将通道0的动作关联到输出事件0(最终映射到某个GPIO)。
  3. 占空比控制

    • 占空比由比较寄存器 C0CC 的值决定。占空比 = C0CC / (TGT + 1)
    • 为了实现无抖动(Jitter-free)的占空比更新,必须使用流水线比较寄存器 PC0CC 。当你需要更新占空比时,将新值写入 PC0CC 。硬件会在下一个PWM周期开始时(CNTR=0),自动将 PC0CC 的值加载到 C0CC 中。如果你直接写入 C0CC ,而写入操作恰好发生在计数器值与旧 C0CC 值比较的时刻附近,可能会导致当前周期或下一个周期的PWM脉宽出现一个时钟周期的毛刺。

实操示例:生成一个频率1kHz,占空比从30%线性变化到70%的PWM。 假设定时器时钟已配置为100kHz(通过预分频器从80MHz分频得到)。

// 1. 计算参数
uint32_t timer_clk_freq = 100000; // 100kHz
uint32_t pwm_freq = 1000; // 1kHz
uint32_t period_ticks = timer_clk_freq / pwm_freq; // 100
GPT0->TGT = period_ticks - 1; // 99

// 2. 配置通道0为边沿对齐PWM模式
GPT0->C0CFG.CCACT = SET_ON_0_TGL_ON_CMP_REPEATEDLY;
GPT0->C0CFG.OUT0 = 1;

// 3. 初始占空比30%
uint32_t initial_duty_ticks = period_ticks * 30 / 100; // 30
GPT0->C0CC = initial_duty_ticks;

// 4. 启动定时器
GPT0->CTL.MODE = UP_PER;

// 5. 在主循环或中断中平滑更新占空比
for (uint32_t duty = 30; duty <= 70; duty++) {
    uint32_t new_compare = period_ticks * duty / 100;
    GPT0->PC0CC = new_compare; // 写入流水线寄存器,等待下一个周期加载
    delay_ms(10); // 控制变化速度
}

3.2 中心对齐PWM(UPDWN_PER模式)

中心对齐PWM的脉冲中心始终对准计数周期的中心点。这种模式产生的谐波特性更好,常用于电机驱动和音频应用,能降低电磁干扰(EMI)。

配置步骤与原理分析:

  1. 定时器基础配置

    • 设置 CTL.MODE = UPDWN_PER (周期向上向下计数模式)。
    • 设置 TGT = Period / 2 。注意,在上下计数模式下,计数器从0计数到TGT,再递减回0,一个完整的三角波周期对应的计数值是 2 * TGT 。因此,PWM周期对应的总计数 = 2 * (TGT + 1) 。为了方便,通常直接设置TGT为半周期值。
  2. 通道动作配置

    • 设置 C0CFG.CCACT = CLR_ON_0_TGL_ON_CMP_REPEATEDLY (在0清零,在比较点翻转)。这个动作的逻辑是:在计数器为0时,输出为低电平;在计数器递增和递减过程中,每当其值等于 C0CC 时,输出就翻转一次。这样就会产生一个以周期中心对称的PWM脉冲。
    • 同样,设置 C0CFG.OUT0 = 1
  3. 占空比控制

    • 在中心对齐模式下, C0CC 的值决定了脉冲的宽度(即高电平时间)。 C0CC 越小,脉冲越窄,占空比越小。
    • 同样,占空比更新必须通过 PC0CC 写入,硬件在CNTR=0时自动加载,确保对称性不被破坏。

避坑指南:PWM生成的常见问题

  • 问题1:PWM输出无信号或频率不对。
    • 排查 :首先检查GPIO引脚复用配置是否正确,是否映射到了GPT的输出事件。其次,用示波器测量定时器时钟引脚(如果引出)或检查预分频器 PRECFG.TICKDIV TGT 的计算是否正确。最后,确认 CTL.MODE 已设置为非DISABLE模式,并且通道动作 CCACT 配置正确。
  • 问题2:更新占空比时,PWM波形出现瞬时异常或抖动。
    • 原因 :直接写入了 CnCC 寄存器,而不是 PCnCC
    • 解决 务必使用流水线寄存器 PCnCC PTGT 来更新比较值和周期值。 这是获得稳定、无抖动PWM输出的黄金法则。
  • 问题3:如何安全地停止PWM输出?
    • 错误做法 :直接设置 CTL.MODE = DIS 。这可能导致输出停留在不确定的电平。
    • 推荐做法 :利用故障(Fault)保护机制。设置 FAULT.CTL = ZEROCOND ,然后触发一个软件故障( ISET.FAULT )。定时器会在计数器归零时优雅停止,此时可以配置 PARK 寄存器将输出引脚驱动到确定的安全状态(如全低),最后再禁用定时器。

4. 正交解码(QDEC)模式详解与电机位置反馈应用

正交解码是连接物理世界(旋转/线性运动)和数字世界(计数值)的桥梁,广泛应用于伺服电机、航模云台、机器人关节等的位置与速度反馈。

4.1 正交编码器信号与解码原理

增量式编码器输出两路相位差90度的方波信号(PHA和PHB)。根据旋转方向的不同,两路信号的相位关系会发生变化:

  • 正转(顺时针) :PHA的上升沿对应PHB为低电平;PHA的下降沿对应PHB为高电平。
  • 反转(逆时针) :PHA的上升沿对应PHB为高电平;PHA的下降沿对应PHB为低电平。

GPT的QDEC模式硬件自动识别这种相位关系,并驱动32位计数器递增或递减。此外,编码器通常还提供一个索引信号(IDX),每旋转一圈产生一个脉冲,用于确定绝对零位。

4.2 CC35xx GPT QDEC模式配置全流程

配置GPT进入正交解码模式,需要将定时器从“内部时钟驱动”转变为“外部事件驱动”。

  1. 信号输入配置

    • 将编码器的PHA、PHB信号连接到支持GPT输入捕获的GPIO引脚。
    • 配置通道0和通道1的输入源: C0CFG.INPUT = 1 (IOC), C1CFG.INPUT = 1 (IOC)。这意味着使用GPIO输入作为PHA和PHB。
    • (可选)如果使用索引信号IDX,配置通道2: C2CFG.INPUT = 1 , 并设置 C2CFG.EDGE 为上升沿或下降沿。
  2. 采样率配置

    • 这是QDEC模式最关键也最容易出错的设置。GPT需要对PHA/PHB信号进行采样,采样率必须远高于信号可能出现的最高频率(即最高转速下的信号频率),否则会丢失计数或误判方向。通常要求 采样频率至少是编码器信号最高频率的4-10倍
    • 通过 PRECFG.TICKDIV PRECFG.TICKSRC 设置采样时钟。例如,使用80MHz系统时钟,希望采样率为1MHz,则 TICKDIV = (80MHz / 1MHz) - 1 = 79
  3. 滤波器配置(强烈建议)

    • 编码器信号在长线传输或电机启停时易受干扰。启用通道滤波器能有效去抖。
    • 设置 CHFILT.MODE (例如 TIMERCLK ,使用定时器时钟滤波)。
    • 设置 CHFILT.LOAD 。这个值决定了信号需要稳定多少个采样周期才被确认。例如, LOAD=3 表示需要连续4个(LOAD+1)相同的采样值。 必须确保:滤波器延迟 > 定时器时钟周期 ,否则可能丢失有效边沿。即 (1/滤波器时钟频率) * (LOAD+1) > (1/定时器时钟频率)
  4. 中断配置(用于实时读取)

    • 使能方向改变中断 ( IMASK.DIRCHNG ) 或计数器改变中断 ( IMASK.CNTRCHNG ),这样在位置变化时能及时通知CPU。
    • 使能双变换中断 ( IMASK.DBLTRANS )。 这个中断非常重要,它是一个“错误指示器” 。当GPT检测到PHA和PHB在单个采样周期内都发生了变化(即出现了“双变换”),说明采样率不足,已经无法可靠解码,此时计数器值可能已不准确。
  5. 启动QDEC模式

    • 设置 CTL.MODE = QDEC
    • 此时,计数器 CNTR 的值就实时反映了编码器的相对位置。正向旋转时递增,反向旋转时递减。

4.3 位置、速度计算与溢出处理

获得计数器值后,需要将其转化为有意义的工程数据。

  • 位置计算 :位置(圈数或线性位移)= (CNTR - Initial_CNTR) / (PPR * 4) 。其中,PPR是编码器每转的脉冲数,乘以4是因为GPT在QDEC模式下会对PHA和PHB的每个边沿进行计数(4倍频),从而将分辨率提高4倍。 Initial_CNTR 是系统上电或找到索引信号时的计数器初始值。
  • 速度计算 :速度(转速)= (Delta_CNTR / (4 * PPR)) / Delta_Time 。通常采用定时采样法,例如每10ms读取一次计数器差值 Delta_CNTR ,然后换算成转速。
  • 32位计数器溢出处理 :32位计数器范围约为±21亿。在高速或长时间运行时可能溢出。稳健的做法是,在中断服务程序中,不仅读取 CNTR ,还维护一个软件扩展的64位或32位高位计数器。当检测到 CNTR 从最大值翻转到0(或反之)时,对软件高位计数器进行加减操作。

实操心得:QDEC调试技巧

  • 示波器是必备工具 :首先用示波器确认PHA和PHB信号质量良好,幅值足够,边沿清晰,无严重振铃或毛刺。
  • 先低速测试 :初始调试时,用手缓慢转动电机,观察计数器 CNTR 的变化是否与物理转动方向、角度严格对应。
  • 关注“双变换中断” :在提高转速的过程中,如果触发了双变换中断,说明当前采样率已到极限。你需要提高采样时钟频率(减小 TICKDIV )或降低电机最高转速。
  • 索引信号(IDX)的使用 :索引信号用于归零。可以在索引中断里将计数器 CNTR 清零,建立绝对的机械零位。注意,在QDEC模式下对 CNTR 的写入是安全的,用于设置初始位置。

5. 高级功能与系统集成

掌握了PWM和QDEC,你已经能解决80%的问题。但CC35xx GPT还有一些高级功能,能在特定场景下极大提升系统性能和可靠性。

5.1 故障(Fault)与停车(Park)保护

在电机驱动或电源应用中,硬件级的保护至关重要。GPT的故障保护功能可以快速响应过流、过温等故障信号,安全关闭PWM输出。

  • 故障输入 :通常连接到一个比较器或专用保护芯片的输出。当故障发生时,该引脚变为有效电平(可配置高有效或低有效)。
  • 故障模式
    • IMMEDIATE :故障立即生效,计数器立刻停止,PWM输出立即被强制到Park状态。响应最快,但可能造成当前PWM周期不完整。
    • ZEROCOND :故障发生后,计数器继续运行直至归零(CNTR=0),然后停止并进入Park状态。这保证了PWM周期能完整结束,避免了半周期关断可能引起的电源问题,是更优雅、更常用的方式。
  • 停车状态 :当定时器因故障停止时, PARK 寄存器可以预先配置每个输出引脚应进入的状态(高、低、高阻)。这确保了功率桥臂处于确定的安全状态(通常全部关闭)。

配置示例:实现一个带硬件过流保护的电机驱动PWM。

// 1. 配置PWM输出(中心对齐模式,如前所述)
// ...

// 2. 配置故障输入(使用通道0的输入)
GPT0->C0CFG.INPUT = 1; // 输入来自IO
GPT0->C0CFG.EDGE = RISE; // 故障信号高电平有效(假设过流信号高有效)

// 3. 配置故障模式
GPT0->FAULT.CTL = ZEROCOND; // 零条件故障模式,安全关闭

// 4. 配置停车状态
GPT0->PARK.CTL = FAULT; // 故障发生时进入停车状态
GPT0->PARK.IOPS0 = 0; // 设置输出0在停车时为低电平(关闭上桥臂)
GPT0->PARK.IOPS1 = 0; // 设置输出1在停车时为低电平(关闭下桥臂)
// ... 设置其他输出

// 5. 使能故障中断,以便CPU记录故障事件
GPT0->IMASK.FAULT = 1;
NVIC_EnableIRQ(GPT0_IRQn);

// 6. 启动定时器
GPT0->CTL.MODE = UPDWN_PER;

5.2 利用DMA减轻CPU负担

在需要频繁更新PWM占空比(如正弦波生成)或批量处理编码器数据的应用中,频繁的CPU中断会消耗大量资源。GPT的DMA功能可以将CPU解放出来。

  • DMA请求 :GPT可以配置在特定事件(如计数器归零RIS.ZERO)时产生一个DMA请求脉冲。
  • 自动寄存器更新 :DMA控制器收到请求后,可以按照预设的地址序列,自动向GPT的 DMARW 寄存器写入一系列数据。GPT内部会将这些写入操作映射到 PTGT , PC0CC , PC1CC 等流水线寄存器。
  • 配置要点 :需要正确设置 DMA.RWADDR (起始寄存器地址偏移)和 DMA.RWCNTR (连续写入的寄存器数量)。这样,一个DMA请求可以自动更新多个PWM通道的占空比,实现极其平滑、无CPU干预的波形生成。

5.3 红外(IR)信号生成

这是一个展示GPT灵活性的有趣应用。通过将两个GPT联动,一个(GPT0)产生38kHz或其它频率的载波(Carrier Wave),另一个(GPT1)产生调制信号(Modulation),并将两者的输出通过一个与门(AND)逻辑结合,就能直接生成符合NEC、RC5等协议的红外遥控信号。这完全由硬件完成,CPU只需在特定时刻更新GPT1的符号周期和脉冲数即可,效率极高。

6. 实战问题排查与经验总结

即使理解了所有原理,实际调试中仍会遇到各种问题。下面是我在多个项目中总结的常见问题排查清单。

问题现象 可能原因 排查步骤与解决方案
GPT完全无法启动,计数器不计数 1. 外设时钟未使能。
2. CTL.MODE 仍为DISABLE。
3. 在同步模式下,同步事件未产生。
1. 检查系统控制模块,确认GPT模块时钟已开启。
2. 单步调试,确认执行了 CTL.MODE = UP_PER 等启动指令。
3. 检查事件管理器配置,确认GPT已订阅正确的启动/同步事件。
PWM输出频率偏差很大 1. 预分频器 PRECFG.TICKDIV 计算错误。
2. TGT 寄存器值理解错误。
3. 时钟源选择错误( TICKSRC )。
1. 重新计算:定时器时钟 = 源时钟 / (TICKDIV + 1)。
2. 确认模式:UP_PER模式下,PWM周期 = (TGT + 1)个定时器时钟;UPDWN_PER模式下,PWM周期 = 2 * (TGT + 1)个定时器时钟。
3. 确认 PRECFG.TICKSRC 设置是否符合预期(0为系统时钟)。
正交解码计数不准,偶尔跳变 1. 采样率不足,丢失边沿。
2. 信号噪声大,未启用或未正确配置滤波器。
3. 编码器信号线过长,信号畸变。
1. 首先检查是否触发 DBLTRANS 中断 。若触发,必须提高采样率(减小TICKDIV)。
2. 启用通道滤波器 ( CHFILT ),适当增加 LOAD 值,并用示波器观察信号质量。
3. 采用双绞线、屏蔽线,并在接收端增加适当的RC滤波电路。
更新占空比时电机有异响(抖动) 1. 直接写入了 CnCC 而非 PCnCC
2. 更新时机不对,在PWM周期中间写入。
3. 多个通道的占空比更新不同步。
1. 强制使用流水线寄存器 PCnCC PTGT 进行更新
2. 确保在计数器归零(RIS.ZERO中断)或一个安全的窗口期更新PCnCC。
3. 使用DMA功能,在一个DMA请求中同时更新所有通道的PCnCC,确保绝对同步。
故障保护功能不生效 1. 故障输入GPIO配置错误。
2. FAULT.CTL 模式配置错误。
3. 故障信号极性 ( C0CFG.EDGE ) 设置反了。
4. 通道滤波器延迟过长,掩盖了瞬时故障。
1. 确认故障输入引脚已正确复用为GPT输入。
2. 确认 FAULT.CTL 已设置为 IMMEDIATE ZEROCOND
3. 用示波器确认故障信号的实际电平,并相应设置 C0CFG.EDGE (RISE/FALL)。
4. 对于需要快速保护的场景(如短路),考虑使用 IMMEDIATE 模式并禁用或减小滤波器。

最后,分享一个深刻的体会: 数据手册是你的第一参考书,但示波器是你的最终裁判 。无论逻辑分析得多么完美,一定要用示波器去观察实际的PWM波形、编码器信号以及GPT输出。观察上升/下降沿是否干净,占空比是否精确,故障响应时间是否满足要求。硬件调试,眼见为实。CC35xx的GPT模块功能强大,初看寄存器很多,但一旦理解了“计数器为核心,事件驱动动作”这一核心思想,并将其分解为PWM生成、输入捕获、正交解码等几个典型应用模式来学习,就能逐步掌握,最终游刃有余地将其应用到你的嵌入式产品中。

更多推荐