第4章:TOM模块基础

各位同学,今天我们来聊聊TOM模块。说实话,在英飞凌的GTM系统里,TOM(定时器输出模块)是我用得最多的模块之一。为什么?因为它简单、直接、可靠。你想想看,做嵌入式控制,很多时候我们需要的不是花里胡哨的功能,而是稳定地输出一个电平、产生一个PWM波。TOM就是干这个的。

4.1 TOM通道结构

每个TOM模块包含若干个通道,具体数量取决于芯片型号。我习惯把每个TOM通道想象成一个独立的小定时器,它有自己的计数器、比较寄存器和输出控制逻辑。

一个典型的TOM通道包含以下关键部分:

  • 计数器(CN0):核心的计数单元,向上计数
  • 比较寄存器(CM0、CM1):两个比较值,决定输出翻转时机
  • 输出控制单元:根据比较结果控制输出电平
  • 时钟分频器:对输入时钟进行分频
  • 触发选择逻辑:选择触发源,用于同步或级联

我在项目中遇到过一个问题:有同事把TOM通道的触发源配错了,结果两个通道的输出完全乱套。后来查了半天才发现,原来是触发选择寄存器里多写了一位。嗯,这里要注意,TOM通道的触发逻辑虽然灵活,但配置时要格外小心。

4.2 TOM通道的工作模式

TOM通道有两种基本工作模式:单次模式和连续模式。说白了,就是一个跑一次就停,一个跑个不停。

4.2.1 单次模式(One-Shot Mode)

单次模式下,计数器从0开始计数,到达CM0比较值后,输出翻转一次。然后计数器停止,等待下一次触发。这种模式适合产生单脉冲信号,比如触发一个ADC采样、控制一个继电器的吸合时间。

我曾经用单次模式做过一个电机堵转保护:检测到堵转后,TOM输出一个200ms的高电平脉冲,切断驱动电路。这个脉冲只需要一次,用单次模式再合适不过了。

4.2.2 连续模式(Continuous Mode)

连续模式下,计数器从0计数到CM0,然后自动清零重新开始。输出在每次到达CM0时翻转。这样就会产生一个周期性的方波信号。说白了,这就是PWM的基础。

连续模式的应用场景太多了:LED调光、电机调速、蜂鸣器驱动……基本上需要周期性信号的地方,都可以用连续模式。

关键区别:

  • 单次模式:跑一次就停,需要重新触发才能再跑
  • 连续模式:自动循环,一直跑下去

4.3 TOM通道的时钟源选择

时钟源选择是个容易踩坑的地方。TOM通道的时钟可以来自几个不同的源:

时钟源 说明 典型应用
GTM全局时钟 由GTM模块的主时钟分频得到 通用定时,精度要求不高
外部输入时钟 从芯片引脚输入的时钟信号 需要与外部信号同步的场景
内部子模块时钟 来自其他GTM子模块的时钟输出 多通道同步、级联应用
PLL输出时钟 芯片内部PLL产生的时钟 高精度定时需求

我个人习惯的做法是:先用GTM全局时钟做原型验证,等系统稳定了再根据实际需求调整时钟源。为什么?因为全局时钟配置最简单,不容易出错。等你的逻辑跑通了,再去优化时钟精度,这样调试效率更高。

小技巧:时钟分频器的配置要结合你的目标频率来算。比如你想产生1kHz的PWM,系统时钟是100MHz,那分频系数就是100000。别忘了,TOM的计数器是16位的,最大值65535。如果分频后计数周期超过65535,就得考虑用更小的分频或者改用其他时钟源。

4.4 实战:配置一个TOM通道输出固定电平

好了,理论讲完了,我们来动手。这个实战的目标很简单:配置一个TOM通道,让它输出一个固定的高电平。听起来简单?其实这里面有门道。

为什么我要选这个例子?因为很多初学者一上来就想搞PWM,结果连最基本的电平输出都搞不定。我建议你先学会控制电平,再谈波形。

下面是配置步骤:

  1. 使能TOM模块时钟:先让TOM模块工作起来
  2. 选择通道工作模式:这里我们用连续模式
  3. 配置比较值:设置CM0为0,这样计数器一启动就匹配
  4. 设置输出极性:选择高电平有效
  5. 启动计数器:让TOM通道开始工作

代码示例(基于iLLD库):

// 1. 使能TOM模块时钟
IfxTom_enableModule(&MODULE_TOM0);

// 2. 配置TOM通道0
IfxTom_Tom_Config config;
IfxTom_Tom_initConfig(&config);

// 3. 选择连续模式
config.mode = IfxTom_Mode_continuous;

// 4. 设置比较值,CM0=0,输出立即翻转
config.cm0 = 0;
config.cm1 = 0;

// 5. 设置输出极性为高电平
config.outputPolarity = Ifx_Polarity_high;

// 6. 选择时钟源,这里用全局时钟
config.clockSource = IfxTom_ClockSource_global;

// 7. 初始化并启动
IfxTom_Tom_initModule(&g_tomHandle, &config);

// 8. 启动计数器
IfxTom_Tom_startCounter(&g_tomHandle);

注意:这段代码只是演示逻辑,实际项目中要根据你的芯片型号和引脚分配做调整。不同系列的英飞凌芯片,TOM模块的基地址和寄存器偏移可能不同。

配置完成后,用示波器量一下对应的引脚,应该能看到稳定的高电平。如果看到的是低电平或者乱跳的信号,别慌。我教你一个排查方法:先检查时钟是否使能,再检查引脚复用功能配置,最后看比较值是否写对了。这三个地方,90%的问题都出在这里。

嗯,这一章的内容就到这里。TOM模块看似简单,但它是整个GTM系统的基础。你把这个搞明白了,后面学PWM生成、多通道同步、死区插入这些高级功能,就会轻松很多。

下一章我们讲PWM信号的生成,到时候会用到今天学的所有知识。记得动手练一练,光看不练是学不会的。