3. AURIX GTM模块详解:GTM架构与子模块
各位同学,今天我们来啃一块硬骨头——GTM模块。说实话,我第一次接触AURIX的GTM时,也被它复杂的架构搞得头晕。但做运动控制,这玩意儿是绕不开的。GTM全称Generic Timer Module,说白了就是英飞凌专门为电机控制、PWM生成这类实时性要求高的场景设计的定时器矩阵。
为什么不用普通的STM或GPT?我踩过这个坑。普通定时器在生成多路PWM、处理霍尔传感器信号时,CPU中断负载太重。GTM的好处是——它自己就能搞定大部分时序逻辑,CPU只管发指令就行。
3.1 GTM整体架构
GTM内部像个小型处理器集群。它有自己的时钟、自己的RAM、自己的DMA通道。核心模块包括:
- CMU(时钟管理单元):负责给各个子模块分频
- TBU(时间基准单元):提供全局时间基准
- TOM(定时器输出模块):专门生成PWM信号
- ATOM(高级定时器输出模块):TOM的升级版,支持更灵活的PWM
- TIM(定时器输入模块):捕获外部信号,比如编码器脉冲
我习惯把GTM想象成一个独立的「硬件定时器操作系统」。你给它配置好任务,它自己调度执行,CPU可以腾出手干别的。
核心要点:GTM的所有子模块都挂在同一个总线上,通过ARU(高级路由单元)互相连接。这意味着TOM的输出可以直接喂给TIM做反馈,不需要CPU干预。
3.2 TOM与ATOM:PWM生成的核心
TOM是GTM里最基础的PWM发生器。每个TOM通道有一个计数器、一个比较寄存器。工作原理很简单:计数器从0开始累加,到比较值翻转电平,到周期值归零。嗯,这就是标准PWM。
但ATOM就不一样了。ATOM内部有一个状态机,支持多种输出模式。我个人最喜欢的是SOMC(单次匹配中心对齐)模式,做电机控制时特别好用。
| 特性 | TOM | ATOM |
|---|---|---|
| 通道数 | 最多24通道 | 最多8通道 |
| PWM模式 | 边沿对齐 | 边沿对齐 + 中心对齐 |
| 死区插入 | 需外部逻辑 | 硬件支持 |
| 互补输出 | 不支持 | 支持 |
| 适用场景 | 通用PWM、LED调光 | 电机控制、逆变器 |
我的建议:做直流电机调速用TOM就够了。但如果是三相永磁同步电机(PMSM)控制,必须上ATOM。死区时间、互补PWM这些功能,ATOM硬件直接搞定,省心很多。
3.3 PWM生成与死区时间配置
死区时间是什么?说白了就是防止上下桥臂直通。MOSFET关断需要时间,如果上管还没完全关断,下管就开了,那就短路了。我曾经在调试一个50kW的逆变器时,死区时间设得太短,直接炸了MOSFET——嗯,教训深刻。
ATOM配置死区时间的代码示例:
// ATOM通道0配置为互补PWM,带死区
// 假设GTM时钟频率为100MHz
// 1. 使能ATOM时钟
GTM->CLC.B.DISABLE = 0;
// 2. 配置ATOM0通道0为SOMC模式
ATOM0_CH0->SRC.B.SL = 0; // 选择信号源
ATOM0_CH0->SRC.B.RDSS = 0; // 上升沿触发
// 3. 设置死区时间(假设需要1us死区)
// 100MHz时钟下,1us = 100个时钟周期
ATOM0_CH0->DTM.B.DTM = 100; // 死区时间寄存器
// 4. 配置周期和占空比
ATOM0_CH0->CM0.B.CM0 = 5000; // 周期值(50kHz)
ATOM0_CH0->CM1.B.CM1 = 2500; // 占空比50%
// 5. 使能输出
ATOM0_CH0->OUTCTRL.B.PC = 1; // 使能PWM输出
注意:死区时间不是越大越好。死区太大,波形失真,电机噪音大;死区太小,有直通风险。我一般建议取开关管关断时间的2-3倍。比如IGBT关断时间500ns,死区设1-1.5us比较稳妥。
3.4 PWM频率与分辨率计算
这个问题很多新手会搞混。PWM频率和分辨率是相互制约的。为什么?因为计数器位数是固定的。
GTM的TOM/ATOM计数器是16位的,最大值65535。假设GTM时钟100MHz:
- 要得到20kHz的PWM,周期值 = 100MHz / 20kHz = 5000
- 分辨率 = log2(5000) ≈ 12.3位
- 要得到100kHz的PWM,周期值 = 100MHz / 100kHz = 1000
- 分辨率 = log2(1000) ≈ 10位
你看,频率越高,分辨率越低。我做过一个伺服驱动器项目,要求PWM频率20kHz,电流环精度要求0.1%。算下来需要10位分辨率,刚好够用。但如果频率提到50kHz,分辨率就掉到9位了,精度不够。
| PWM频率 | 周期值(100MHz时钟) | 理论分辨率 | 实际可用分辨率 |
|---|---|---|---|
| 1kHz | 100000 | 16.6位 | 16位(上限) |
| 10kHz | 10000 | 13.3位 | 13位 |
| 20kHz | 5000 | 12.3位 | 12位 |
| 50kHz | 2000 | 11.0位 | 11位 |
| 100kHz | 1000 | 10.0位 | 10位 |
核心公式:
周期值 = GTM时钟频率 / PWM频率
分辨率(位)= log2(周期值)
实际占空比步进 = 100% / 周期值
如果分辨率不够怎么办?我一般用两个办法:一是降低PWM频率,二是用GTM的分频器。CMU模块可以给TOM/ATOM提供独立的时钟,比如把100MHz分频到50MHz,这样同样频率下周期值翻倍,分辨率就多1位。
避坑指南:我曾经在项目里把PWM频率设到200kHz,结果分辨率只有8位,电机低速时抖动得厉害。后来降到20kHz,分辨率12位,问题解决。记住——电机控制不是频率越高越好,够用就行。
好了,GTM的核心内容就这些。TOM和ATOM怎么选、死区时间怎么配、频率和分辨率怎么权衡,都是实际项目中天天要面对的问题。下一节我们讲GTM的输入捕获,到时候会结合TIM模块,聊聊怎么用GTM做编码器信号处理。