英飞凌TC3xx GTM模块实战:ATOM与DTM实现三相电机FOC互补PWM与死区控制

发布时间:2026/10/6 18:06:54
英飞凌TC3xx GTM模块实战:ATOM与DTM实现三相电机FOC互补PWM与死区控制 1. 电机控制里为什么绕不开GTM这个模块做电机控制的朋友大概率都有过这样的经历选了一颗英飞凌TC3xx的芯片翻数据手册翻到GTM章节看到ATOM、TOM、DTM、TIM、SPE、PSM一堆缩写头都大了。尤其是从STM32那种配个TIM_OCInitStructure就能出PWM的平台转过来的第一次面对GTM的配置流程很容易卡在我知道要输出六路带死区的互补PWM但完全不知道从哪下手这个状态。这篇文章就是来解决这个问题的。我会以三相电机FOC控制中最典型的场景——用ATOM生成中心对齐PWM、用DTM插入死区时间——为主线把GTM从时钟树到引脚输出的完整配置链路拆开讲清楚。适合正在用TC3xx做电机驱动、逆变器控制、或者任何需要互补PWM输出的嵌入式工程师。不管你是刚接触英飞凌AURIX平台还是已经用过CCU6但想迁移到GTM这篇内容都能给你一条可复现的路径。先说一个核心认知GTM不是传统意义上的定时器。它更像一个可编程的时序信号协处理器内部有多个独立子模块各自负责不同的信号生成和处理任务。ATOM负责输出比较和PWM生成DTM负责死区插入TOM负责简单PWMTIM负责输入捕获SPE负责传感器接口。你要做的不是配置一个定时器而是编排一条从时钟源到引脚的信号流水线。这个思维转变很关键后面所有配置逻辑都建立在这个认知上。2. GTM内部信号流水线的拆解2.1 从CMU到ATOM时钟是怎么一路走下来的GTM的时钟来源是CMUClock Management Unit。CMU内部有多个可配置的分频器可以把系统时钟分频后分配给不同的子模块。对于ATOM通道关键的分频器是CMU_CLK_0到CMU_CLK_7这八个全局时钟。每个ATOM子模块可以选择其中一个作为自己的参考时钟。这里有个容易踩的坑CMU的分频配置必须在GTM全局使能之前完成。如果你先启动了GTM再去改CMU的分频比新的分频值不会生效除非你把整个GTM复位重来。我见过有同事调了半天PWM频率不对最后发现是CMU配置顺序搞反了。具体来说假设你的系统时钟是100MHz你希望ATOM的计数时钟是100MHz不分频那就把CMU_CLK_0配置为分频比1。如果你希望PWM载波频率是10kHz中心对齐模式下计数器的周期值就是周期值 时钟频率 / (2 × PWM频率) 100,000,000 / (2 × 10,000) 5000这个5000就是你要写入ATOM通道的SR0寄存器的值。中心对齐模式下计数器从0数到5000再数回0一个完整的上下计数周期对应一个PWM周期。2.2 ATOM通道的信号生成逻辑ATOM子模块内部有多个通道每个通道可以独立配置为不同的工作模式。对于PWM生成我们用的是SOMPSignal Output Mode PWM模式。在这个模式下每个ATOM通道有两个比较值SR0决定周期SR1决定占空比。信号生成的逻辑是这样的计数器从0开始向上计数当计数值等于SR1时输出信号翻转当计数值等于SR0时计数器方向改为向下向下计数到SR1时输出再次翻转数到0时方向改为向上。这样就产生了一个中心对齐的PWM波形。但这里有个细节ATOM通道本身只能输出一路PWM。要做互补输出你需要两个ATOM通道配对使用。一个通道配置为输出正相PWM另一个通道配置为输出反相PWM。这两个通道的SR0值必须相同保证频率一致SR1值互补保证占空比互补。2.3 DTM是怎么把死区插进去的DTMDead Time Module的作用就是在两路互补PWM信号的跳变沿之间插入一段延迟防止上下桥臂直通。它的输入是ATOM输出的两路PWM信号输出是经过死区处理后的两路信号。DTM内部有四个关键寄存器DTM_DTVAL、DTM_DTCTR、DTM_DTIN、DTM_DTOUT。DTVAL决定死区时间的长度DTCTR是死区计数器DTIN和DTOUT分别控制输入输出映射。死区时间的计算公式是死区时间 DTVAL × DTM时钟周期假设DTM时钟是100MHz你要插入500ns的死区时间DTVAL就是50。这个值要写入DTM模块的DTVAL寄存器。DTM的工作机制是当输入信号发生跳变时DTM不会立即让输出跟随而是启动一个计数器等到计数值达到DTVAL后才允许输出跳变。对于上升沿和下降沿DTM可以分别配置不同的死区时间这在某些应用里很有用比如上下管的开关特性不对称时。3. 从零配置ATOMDTM的完整实操3.1 环境准备与寄存器映射确认在开始写代码之前有几件事必须先确认清楚。第一你的TC3xx具体型号是什么不同型号的GTM模块数量和ATOM通道数可能不同。比如TC375有3个ATOM子模块每个子模块有8个通道TC397的配置又不一样。第二你要用的引脚对应哪个ATOM通道这个信息在芯片的Datasheet引脚定义表里不是Reference Manual里。第三你的开发环境是AURIX Development Studio还是Tasking两者的寄存器定义头文件可能略有差异。我个人的习惯是先在iLLD英飞凌底层驱动库里找到对应的GTM配置示例然后基于示例改。iLLD里有一个GtmAtomPwm示例虽然它只配了单路PWM没有死区但时钟和端口的初始化部分可以直接复用。3.2 CMU时钟配置的具体步骤CMU的配置分三步使能CMU时钟、配置分频器、等待配置生效。// 使能GTM的CMU时钟 GTM_CMU_CLK_EN.B.EN_CLK0 1; // 配置CMU_CLK_0的分频比为1不分频 GTM_CMU_CLK_0.B.CLK_DIV 0; // 0表示分频比1 // 等待配置生效 while (GTM_CMU_CLK_0.B.CLK_DIV ! 0);这里要注意CMU_CLK_0的CLK_DIV字段是分频比减一。写0表示分频比1写1表示分频比2以此类推。最大分频比是16。如果你需要更低的PWM频率可以在这里分频也可以在ATOM的SR0值里加大周期。两种方式的区别是CMU分频会影响整个ATOM子模块的所有通道而SR0只影响单个通道。如果你的多个通道需要不同的PWM频率就用SR0来区分如果所有通道频率一致用CMU分频更省事。3.3 ATOM通道的初始化流程ATOM通道的初始化顺序很重要顺序错了会导致输出异常。正确的顺序是配置ATOM子模块的全局时钟使能配置通道为SOMP模式写入SR0和SR1的初始值配置输出引脚映射使能通道// 使能ATOM子模块的时钟 GTM_ATOM0_CLC.B.DISR 0; // 配置ATOM0通道0为SOMP模式 GTM_ATOM0_CH0_CTRL.B.MODE 0x02; // SOMP模式 // 写入周期值 GTM_ATOM0_CH0_SR0.U 5000; // 写入占空比初始值50% GTM_ATOM0_CH0_SR1.U 2500; // 配置输出引脚 GTM_ATOM0_CH0_CTRL.B.ACB 0x01; // 使能输出 // 使能通道 GTM_ATOM0_CH0_CTRL.B.ARU_EN 1;这里有个细节SR1的值不能大于SR0否则输出会一直是高电平或者一直是低电平。另外在中心对齐模式下SR1的值决定了占空比但占空比的计算公式是占空比 (SR0 - SR1) / SR0 × 100%也就是说SR1越接近SR0占空比越小。这个和STM32的CCR寄存器逻辑是反过来的从STM32转过来的朋友要特别注意。3.4 DTM死区插入的配置细节DTM的配置相对独立它不依赖于ATOM的具体配置只需要知道输入信号来自哪个ATOM通道。// 配置DTM的死区时间 GTM_DTM_DTVAL.U 50; // 500ns 100MHz // 配置DTM的输入映射通道0的输入来自ATOM0_CH0 GTM_DTM_CH0_DTIN.B.SEL 0x00; // 配置DTM的输出映射通道0的输出到ATOM0_CH0的输出引脚 GTM_DTM_CH0_DTOUT.B.SEL 0x00; // 使能DTM通道 GTM_DTM_CH0_CTRL.B.EN 1;DTM的输入输出映射是通过SEL字段来选择的。每个DTM通道可以选择多个输入源具体可选值在Reference Manual的DTM章节有详细表格。这里的关键是DTM的输出要映射到正确的引脚否则你会在示波器上看到两路完全没有死区的PWM。4. 调试过程中最容易翻车的几个点4.1 引脚映射配对了但没输出这是最常见的问题。你检查了ATOM配置、DTM配置、CMU配置所有寄存器值都对但引脚上就是没有波形。这时候要检查两个地方第一引脚的方向控制寄存器是否配置为输出模式第二引脚的ALT功能是否选择了GTM输出。在TC3xx里每个引脚都有一个PORT寄存器组其中IOCR寄存器决定引脚的功能选择。比如P02.0要配置为GTM输出需要把IOCR0的PC0字段设为对应的ALT值。这个ALT值在Datasheet的引脚定义表里查不同引脚不一样。我踩过的一个坑是IOCR寄存器的配置需要先解锁PORT模块的写保护。TC3xx的PORT寄存器默认是锁定的你需要先写一个特定的解锁序列才能修改。这个解锁序列在Reference Manual的PORT章节有说明通常是连续写两个特定的值到LOCK寄存器。4.2 死区时间在示波器上看不对如果你用示波器测量死区时间发现和DTVAL计算出来的值对不上大概率是DTM的时钟源配置有问题。DTM的时钟源是从CMU的CMU_CLK_1来的不是CMU_CLK_0。如果你只配了CMU_CLK_0没配CMU_CLK_1DTM可能用的是默认时钟频率和你预期的不一样。另外DTM的死区计数器是递增计数到DTVAL然后触发输出跳变。这意味着实际死区时间会比DTVAL计算值多一个时钟周期的延迟。在对死区精度要求很高的场合比如GaN器件驱动这个额外延迟要考虑进去。4.3 互补PWM的相位对不齐用两个ATOM通道做互补输出时如果两个通道的使能时间不同可能会出现相位偏差。解决方法是使用ATOM的同步机制把两个通道配置为同一个同步组用一个触发源同时启动。// 配置ATOM0_CH0和CH1为同一同步组 GTM_ATOM0_CH0_CTRL.B.SL 0x01; GTM_ATOM0_CH1_CTRL.B.SL 0x01; // 使用ARU触发同时启动 GTM_ATOM0_CH0_CTRL.B.ARU_EN 1; GTM_ATOM0_CH1_CTRL.B.ARU_EN 1;同步组的配置在电机控制里特别重要因为三相PWM的相位关系直接影响电机的转矩脉动。如果三相之间的相位偏差超过几个纳秒电机就会产生额外的噪音和振动。5. 从单路PWM到三相六路输出的扩展思路5.1 三相PWM的通道分配策略一个ATOM子模块有8个通道做三相六路互补PWM刚好够用。典型的分配方式是通道功能对应桥臂CH0U相上管正相CH1U相下管反相CH2V相上管正相CH3V相下管反相CH4W相上管正相CH5W相下管反相每个通道的SR0值相同保证三相频率一致SR1值根据FOC算法计算出的占空比分别写入。DTM模块负责在每对互补通道之间插入死区。5.2 用ARU实现占空比的实时更新在FOC控制中占空比需要在每个PWM周期更新一次。如果直接用CPU写SR1寄存器会有两个问题一是CPU负载高二是写入时机不好控制可能在计数器运行到一半时写入导致波形异常。GTM的ARUAdvanced Routing Unit可以解决这个问题。你可以把FOC算法计算出的占空比写入一个ARU数据缓冲区然后配置ATOM通道在每次周期结束时自动从ARU读取新的SR1值。这样占空比的更新和PWM周期严格同步不会产生毛刺。// 配置ATOM通道从ARU读取SR1 GTM_ATOM0_CH0_CTRL.B.SR1_CTRL 0x02; // ARU模式 // 配置ARU数据源 GTM_ARU_DATA0.U duty_cycle_u;ARU的配置相对复杂涉及到ARU的地址映射和数据路由。但一旦配好FOC的实时性和波形质量都会有明显提升。5.3 故障保护与紧急关断电机控制里必须考虑故障保护。如果发生过流或者过温PWM输出要立即关断不能等CPU响应。GTM提供了硬件级的故障保护机制你可以配置一个外部触发信号比如来自比较器的过流信号直接连接到ATOM的紧急关断输入一旦触发ATOM通道立即停止输出不需要CPU干预。// 配置ATOM通道的紧急关断 GTM_ATOM0_CH0_CTRL.B.EXT_TRIG 0x01; // 使能外部触发关断 GTM_ATOM0_CH0_IRQ_NOTIFY.B.TRIG 1; // 触发中断通知CPU这个机制在工业电机驱动里是标配因为CPU的响应延迟可能在微秒级而硬件关断可以在纳秒级完成。对于IGBT或者MOSFET来说这几微秒的差异可能就是炸管和不炸管的区别。6. 几个实测中总结出来的经验第一个经验GTM的配置寄存器很多都有写保护修改之前要先解锁。解锁序列写错的话寄存器写入会被静默忽略你读回来的值还是旧的。调试的时候如果发现写了寄存器但没效果先检查解锁序列。第二个经验ATOM的SOMP模式下SR1的值在计数器向上和向下计数时都会比较。如果你在计数器运行过程中修改SR1可能会出现一个周期内两次比较值不同导致输出波形异常。所以SR1的更新最好在周期边界进行或者用ARU自动更新。第三个经验DTM的死区时间不要设得太大。有些朋友为了保险把死区设成1微秒甚至更大。死区太大会导致输出电压畸变尤其是在低速运行时电机的电流波形会明显失真。一般来说死区时间设为开关器件关断时间的1.2到1.5倍就够了。比如你的MOSFET关断时间是200ns死区设250ns到300ns就足够了。第四个经验调试GTM的时候示波器是必须的。光看寄存器值很难判断波形对不对。建议至少用四通道示波器同时看上下管的驱动信号和相电流。如果只有两通道示波器就先看一对互补PWM确认死区正确后再看其他相。第五个经验如果你用的是iLLD库注意库函数的版本。不同版本的iLLD对GTM寄存器的封装可能不同有些版本会把CMU的配置封装在Gtm_init()里有些版本需要手动配置。升级iLLD版本后原来的GTM配置代码可能需要调整。7. 从GTM迁移到CCU6的对比思考虽然这篇文章讲的是GTM但很多做电机控制的朋友可能更熟悉CCU6。CCU6是英飞凌上一代AURIX芯片里的电机控制专用模块配置比GTM简单得多但灵活性也差一些。CCU6的优势在于它是为电机控制量身定做的三个互补PWM通道、内置死区生成、硬件换相控制、霍尔传感器接口基本上配置几个寄存器就能跑起来。GTM的优势在于灵活性你可以用ATOM做任意路数的PWM用TIM做输入捕获用SPE做旋变解码所有模块通过ARU互联可以实现非常复杂的时序控制。如果你的应用是标准的BLDC或者PMSM FOC控制CCU6其实够用了没必要非得上GTM。但如果你需要多轴控制、或者需要同时处理多种传感器接口、或者需要非常灵活的PWM模式切换GTM的可编程性就体现出价值了。从CCU6迁移到GTM最大的思维转变是从配置专用模块变成编排信号流水线。CCU6你只需要告诉它我要什么GTM你需要告诉它怎么一步步做出来。这个转变需要一点时间适应但一旦理解了GTM的内部结构你会发现它能做的事情比CCU6多得多。8. 一个完整的初始化代码框架最后给一个可以直接参考的初始化框架把前面讲的CMU、ATOM、DTM、PORT配置串起来。这个框架基于TC375其他型号可能需要调整寄存器地址。void GTM_PWM_Init(void) { // 第一步使能GTM全局时钟 GTM_CLC.B.DISR 0; // 第二步配置CMU时钟 GTM_CMU_CLK_EN.B.EN_CLK0 1; GTM_CMU_CLK_EN.B.EN_CLK1 1; GTM_CMU_CLK_0.B.CLK_DIV 0; // 100MHz GTM_CMU_CLK_1.B.CLK_DIV 0; // 100MHz for DTM // 第三步配置ATOM通道 GTM_ATOM0_CLC.B.DISR 0; GTM_ATOM0_CH0_CTRL.B.MODE 0x02; // SOMP GTM_ATOM0_CH0_SR0.U 5000; // 10kHz 100MHz GTM_ATOM0_CH0_SR1.U 2500; // 50% duty GTM_ATOM0_CH0_CTRL.B.ACB 0x01; // enable output GTM_ATOM0_CH1_CTRL.B.MODE 0x02; GTM_ATOM0_CH1_SR0.U 5000; GTM_ATOM0_CH1_SR1.U 2500; GTM_ATOM0_CH1_CTRL.B.ACB 0x01; // 第四步配置DTM死区 GTM_DTM_CLC.B.DISR 0; GTM_DTM_DTVAL.U 50; // 500ns GTM_DTM_CH0_DTIN.B.SEL 0x00; GTM_DTM_CH0_DTOUT.B.SEL 0x00; GTM_DTM_CH0_CTRL.B.EN 1; // 第五步配置PORT引脚 // 解锁PORT写保护 PORT_LOCK_UNLOCK(); // 配置P02.0为GTM输出 PORT_IOCR0.B.PC0 0x11; // ALT value for GTM PORT_IOCR0.B.PC1 0x11; // 重新锁定PORT PORT_LOCK(); // 第六步使能ATOM通道 GTM_ATOM0_CH0_CTRL.B.ARU_EN 1; GTM_ATOM0_CH1_CTRL.B.ARU_EN 1; }这个框架省略了一些细节比如PORT解锁的具体序列、ARU的配置、中断的配置。但核心的配置逻辑都在这里了。实际使用时你需要根据具体的芯片型号和引脚分配调整寄存器地址和ALT值。调试的时候建议一步一步来先只配CMU和ATOM确认单路PWM输出正常再加上DTM确认死区正确最后配互补通道和三相输出。每一步都用示波器验证不要一次性把所有配置都写完再调那样出了问题很难定位。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询