第4章 TOM模块详解:定时器输出模块原理、通道配置与PWM生成

好,咱们接着聊。上一章我们把GTM的整体架构捋了一遍,这一章我打算深入聊聊TOM——定时器输出模块。说实话,在电机控制里,TOM是我用得最多的模块之一。为什么?因为它直接决定了PWM波形的质量,而PWM质量又直接决定了电机的运行效果。

4.1 TOM模块的核心原理

TOM,全称Timer Output Module。说白了,它就是一组可以独立配置的定时器,每个定时器都能输出PWM信号。你想想看,电机控制需要几路PWM?三相电机至少6路,如果加上刹车、使能等信号,10路都不嫌多。TOM模块正好能满足这个需求。

我个人习惯把TOM理解成一个“多通道PWM发生器”。每个通道都有自己的计数器、比较值和输出控制逻辑。它们可以独立工作,也可以互相级联——这个特性在生成互补PWM时特别有用。

核心要点:TOM模块的每个通道本质上是一个自由运行的计数器,当计数值与比较值匹配时,输出电平就会翻转。通过控制比较值和计数周期,就能生成任意占空比和频率的PWM信号。

4.2 通道结构详解

每个TOM通道内部包含以下几个关键部分:

  • 计数器(CN0):一个16位的向上计数器,从0开始计数,到达周期值后复位
  • 周期寄存器(CM0):决定PWM的频率,计数值达到CM0时复位
  • 比较寄存器(CM1):决定PWM的占空比,计数值与CM1匹配时输出翻转
  • 输出控制逻辑:根据比较结果控制最终输出电平

嗯,这里要注意:CM0和CM1都是双缓冲的。什么意思?就是你在运行时修改它们的值,不会立即生效,而是等到当前周期结束后才更新。这个设计太重要了——避免了PWM波形在周期中间被截断的尴尬情况。

我在项目中遇到过一个问题:电机在高速运转时突然抖动了一下。查了半天,发现是PWM占空比更新没有用双缓冲机制,导致波形出现了毛刺。从那以后,我每次配置TOM都会检查缓冲使能位有没有设置。

4.3 通道配置实战

好,咱们直接上代码。下面是一个典型的TOM通道初始化配置:

// TOM通道0配置示例
void TOM_Channel_Init(void)
{
    // 1. 使能TOM时钟
    IfxGtm_enable(&MODULE_GTM);
    
    // 2. 选择时钟分频
    // 我一般用GTM的固定时钟,分频到目标频率
    IfxGtm_Tom_Tgc_build(&tomConfig.tgcConfig);
    
    // 3. 配置通道参数
    tomConfig.channel = IfxGtm_Tom_Ch_0;
    tomConfig.period = 10000;      // 周期值,决定PWM频率
    tomConfig.dutyCycle = 5000;    // 占空比,50%
    tomConfig.pin.outputPin = &IfxGtm_TOM0_0_P02_1_OUT;
    
    // 4. 初始化并启动
    IfxGtm_Tom_Ch_init(&tomDriver, &tomConfig);
    IfxGtm_Tom_Ch_run(&tomDriver);
}

这段代码看起来简单,但有几个坑我得提醒你:

避坑指南:

  • 时钟分频别设错了。我曾经把分频系数设成1,结果PWM频率直接飙到100MHz,电机根本反应不过来
  • 周期值和占空比都是16位的,最大值65535。别超了
  • 引脚复用要配对,不然信号出不去

4.4 PWM生成模式

TOM支持两种PWM生成模式,我分别说说:

模式 工作原理 适用场景
边沿对齐模式 计数器从0到CM0,CM1决定翻转点 通用PWM,简单电机控制
中心对齐模式 计数器先增后减,CM1在上升和下降段各匹配一次 需要低谐波的电机控制

我个人更偏爱中心对齐模式。为什么?因为它的PWM波形对称性好,产生的电磁干扰更小。在FOC(磁场定向控制)中,中心对齐模式几乎是标配。

你想想看,电机高速旋转时,电流波形越平滑,转矩脉动就越小。中心对齐PWM正好能提供这种平滑性。当然,代价是计算稍微复杂一点——你需要同时管理上升段和下降段的比较值。

4.5 多通道同步与级联

电机控制很少只用一路PWM。三相电机需要6路,而且它们必须同步。TOM模块提供了两种同步机制:

  • 全局同步:所有通道共用一个时基,同时启动
  • 通道级联:一个通道的溢出事件触发下一个通道的启动

我记得第一次做三相逆变器时,用了全局同步。配置起来很简单,所有通道的PWM波形相位完全一致。但后来发现一个问题——如果某一路PWM需要死区时间,全局同步就搞不定了。这时候就得用通道级联,让主通道控制从通道的启动时机。

实用技巧:配置死区时间时,我习惯用两个TOM通道级联。主通道生成原始PWM,从通道延迟一段时间再输出。延迟时间就是死区时间。这样既保证了同步,又实现了死区插入。

4.6 中断与更新机制

PWM的占空比不是一成不变的。电机控制中,你需要根据电流反馈实时调整占空比。TOM模块提供了中断机制:

// 中断服务函数示例
void TOM_ISR(void)
{
    // 清除中断标志
    IfxGtm_Tom_Ch_clearEvent(&tomDriver);
    
    // 更新占空比
    // 注意:这里修改的是缓冲寄存器,不会立即生效
    IfxGtm_Tom_Ch_setCompare(&tomDriver, newDutyCycle);
    
    // 触发更新
    IfxGtm_Tom_Ch_update(&tomDriver);
}

这里有个关键点:更新时机。我建议在PWM周期结束的中断里更新占空比。为什么?因为这时候计数器刚好复位,更新占空比不会造成波形畸变。如果你在周期中间更新,虽然硬件有双缓冲保护,但软件逻辑上容易出问题。

我曾经犯过一个错误:在ADC中断里直接修改占空比,没考虑PWM周期同步。结果电机在低速时运行正常,高速时就开始抖动。后来改成在PWM周期中断里更新,问题就解决了。

4.7 实战经验总结

说了这么多,我总结几条实战经验:

  1. 时钟配置要谨慎:TOM的时钟源有好几个,GTM时钟、子时钟、外部时钟。我一般用GTM主时钟分频,稳定可靠
  2. 死区时间别设太小:MOS管的开关速度有限,死区时间太小容易导致上下管直通。我通常设1-3微秒,具体看功率管规格
  3. 占空比更新频率要匹配:PWM频率20kHz,占空比更新频率也应该是20kHz。更新太快或太慢都会影响控制效果
  4. 多通道相位关系要明确:三相电机的三路PWM相位差120度,这个在初始化时就要算好

最后说一句:TOM模块是Aurix TC3xx电机控制的基石。你把它吃透了,后面的PWM生成、死区插入、电流采样同步就都不是问题。下一章我会讲ARU模块,它是连接TOM和ADC的桥梁,也是实现电流同步采样的关键。

好,这一章就到这里。有什么问题欢迎交流,咱们下章见。


公众号:蓝海资料掘金营,微信deep3321