1. 项目概述与核心价值
在嵌入式开发,尤其是工业控制、电机驱动和汽车电子领域,德州仪器(TI)的C2000系列微控制器一直是工程师手中的“瑞士军刀”。其中,TMS320F28035-EP作为一款增强型塑料封装的工业级产品,以其强大的实时控制能力和丰富的外设接口著称。今天,我们不谈那些宏大的系统架构,就聚焦于这颗芯片上最常用、也最容易让人“又爱又恨”的几个通信与PWM模块:SCI、LIN、CAN、I2C和ePWM。
为什么说“又爱又恨”?爱的是,它们功能强大,几乎覆盖了嵌入式系统与外界交互的所有主流方式;恨的是,每个模块都有一堆寄存器要配置,时序要调,中断要处理,稍有不慎,通信就“沉默”,PWM就“乱跳”。我经历过无数次深夜调试,从SCI收不到一个字节,到CAN总线错误帧频发,再到ePWM死区时间算错烧掉MOS管。这些教训,都是用真金白银和项目周期换来的。
这篇文章,就是我基于TMS320F28035-EP数据手册和多年实战踩坑经验,为你梳理的一份“避坑指南”和“实操手册”。我不会照本宣科地复述数据手册的寄存器列表,而是会结合典型应用场景,告诉你每个模块到底怎么用,配置时关键点在哪里,以及那些手册里不会写的调试技巧和常见坑点。无论你是刚接触C2000的新手,还是想深入优化现有设计的老手,相信都能从中找到有价值的信息。我们的目标是:看完就能动手,调通就能稳定运行。
2. 串行通信接口(SCI)模块深度解析与实战
SCI,本质上就是大家熟知的UART(通用异步收发器)。在F28035上,它被标记为SCI-A。这个模块看似简单,但要想用得稳、用得巧,里头的门道可不少。
2.1 SCI核心工作机制与配置精髓
SCI通信基于NRZ(非归零)格式,一帧数据包括起始位、数据位(1-8位)、可选的奇偶校验位和停止位(1或2位)。其双缓冲结构(发送和接收各自独立)是实现全双工的关键。这意味着CPU在写入一个字节到发送缓冲寄存器(SCITXBUF)后,可以立即去做别的事情,硬件会自动将数据移入发送移位寄存器并串行发出。接收端亦然。
波特率计算是第一个坎。数据手册给出了公式,但直接看可能有点懵。F28035的SCI时钟源是低速外设时钟(LSPCLK)。波特率寄存器(SCIHBAUD和SCILBAUD)组成的16位值(BRR)决定了分频系数。公式分两种情况:
- 当
BRR > 0时:Baud Rate = LSPCLK / [(BRR + 1) * 8] - 当
BRR = 0时:Baud Rate = LSPCLK / 16
假设你的系统主频SYSCLKOUT为60MHz,通过外设时钟控制寄存器将LSPCLK配置为SYSCLKOUT/4,即15MHz。现在你需要配置成115200bps的波特率。
- 首先,因为115200是个常用高速率,
BRR很可能大于0,我们采用第一个公式。 - 转换公式:
BRR = (LSPCLK / (Baud Rate * 8)) - 1 - 计算:
BRR = (15,000,000 / (115200 * 8)) - 1 ≈ (15,000,000 / 921,600) - 1 ≈ 16.28 - 1 = 15.28 - 取整后
BRR = 15。 - 验证:
Baud Rate = 15,000,000 / [(15+1)*8] = 15,000,000 / 128 = 117187.5 bps。 - 误差率:
(117187.5 - 115200) / 115200 ≈ 1.72%。
注意:UART通信通常能容忍的波特率误差在2-3%以内。1.72%的误差在大多数情况下是可行的。但如果追求更高精度,可以尝试调整LSPCLK的分频比(例如配置为SYSCLKOUT/2,即30MHz),重新计算BRR值,可能会得到误差更小的组合。这就是为什么在系统时钟初始化时,需要统筹考虑所有外设的时钟需求。
配置流程与关键寄存器:
- 使能时钟:首先确保外设时钟控制寄存器中SCI模块的时钟被使能。
- 配置GPIO:将SCITXD和SCIRXD引脚功能复用到SCI,而非普通GPIO。
- 软件复位:向SCICTL1寄存器的
SW RESET位写0,再写1,进行模块软复位,确保从一个干净的状态开始。 - 禁用收发器:在配置期间,确保SCICTL1中的
TXENA和RXENA位为0。 - 配置通信格式:在SCICCR寄存器中设置数据位长度、停止位数量、奇偶校验模式(偶校验、奇校验或无校验)。
- 计算并设置波特率:将计算好的BRR值写入SCIHBAUD和SCILBAUD。
- 配置FIFO(增强功能):这是提升效率的关键。通过SCIFFTX、SCIFFRX和SCIFFCT寄存器使能TX/RX FIFO,并设置触发中断的水位(例如,RX FIFO接收到4个字节产生中断,减少CPU频繁响应)。
- 使能模块与中断:设置SCICTL1中的
TXENA和RXENA为1。根据需要使能SCICTL2中的发送中断(TX INT ENA)和接收中断(RX/BK INT ENA),以及SCIFFRX中的FIFO接收中断。 - 编写中断服务程序(ISR):在中断中,读取SCIRXST寄存器判断状态(是否有错误),然后从SCIRXBUF(或FIFO)读取数据;发送时,检查SCICTL2中的
TXRDY标志或SCIFFTX中的TX FIFO状态,然后向SCITXBUF写入数据。
2.2 增强功能与避坑实践
F28035的SCI模块有两个非常实用的增强功能:自动波特率检测和4级FIFO。
自动波特率检测在需要与未知波特率设备通信时非常有用。其原理是检测起始位(一个位时间的低电平)的宽度。启用该功能(设置SCIFFCT寄存器中的ABD和CDC位)后,SCI模块会测量起始位的持续时间,并自动计算并加载正确的BRR值。使用时,主机需要先发送一个特定的字符(通常是‘A’或0x55,其二进制模式为01010101,包含丰富的边沿),从机通过检测这个字符的边沿来校准波特率。
4级FIFO则直接提升了通信效率。没有FIFO时,每收到一个字节就会产生一次接收中断,CPU频繁被中断打扰。启用RX FIFO后,可以设置当FIFO中数据达到某个级别(如1、4、8、14字节)时才产生中断,让CPU一次处理一批数据,大大减轻了负担。TX FIFO同理,可以一次性写入多个待发送字节,硬件自动依次发送。
避坑指南:
- 错误处理不可忽视:每次读取数据前,务必检查SCIRXST寄存器中的错误标志位:
FE(帧错误,停止位不对)、OE(溢出错误,CPU没来得及读走新数据已到)、PE(奇偶校验错误)。发现错误后,除了进行错误计数或记录,有时需要清除错误状态或复位接收器才能继续正常接收。 - FIFO的“坑”:使能FIFO后,读取数据应使用SCIFFRX寄存器指示的FIFO状态,而非简单的
RXRDY标志。向TX FIFO写数据时,也要先检查TXFFST(TX FIFO中数据量)是否小于TXFFIL(触发中断的阈值),避免写满导致数据丢失。 - 波特率误差累积:在长距离或高波特率通信中,时钟误差和线路干扰可能导致位采样点漂移。除了确保本机波特率精度,还可以在软件上启用一些容错机制,比如在连续收到多个帧错误后,尝试小范围调整采样点(如果硬件支持)或触发一次重新同步。
3. 本地互联网络(LIN)模块:基于SCI的汽车级通信
LIN总线可以看作是运行在特定协议下的SCI。F28035集成了一个独立的LIN控制器(LIN-A),它与SCI-A共享部分硬件,但增加了协议处理引擎。这意味着,你可以将LIN模块配置为普通的SCI使用,反之则不行。
3.1 LIN协议核心与模块配置
LIN是一种单主多从、低成本串行网络,常用于汽车中的车身控制(如车窗、雨刷、座椅)。主节点控制整个通信节奏,从节点只在被寻址时响应。
LIN帧结构:一个完整的LIN帧由间隔场(Break,至少13位显性电平)、同步场(0x55,用于��节点波特率同步)、标识符场(ID,定义报文内容和长度)和数据场(1-8字节数据)+校验和场组成。
F28035的LIN模块硬件上自动处理了这些繁琐的字段:
- 自动同步:从节点模式时,硬件能自动检测Break字段和同步场,并据此校准自身的波特率,无需软件干预。
- 标识符过滤:通过
LINID和LINMASK寄存器,可以从节点设置自己关心的报文ID,只有匹配的报文才会触发接收中断,减少CPU开销。 - 自动校验:硬件支持自动计算和验证经典校验和(Classic)或增强校验和(Enhanced)。
配置LIN为主节点示例:
- 初始化GPIO(LINTX输出,LINRX输入)。
- 配置LIN操作模式为主模式(
SCIGCR1.MASTER = 1)。 - 配置波特率寄存器(
BRSR),计算方式与SCI类似,但LIN波特率通常固定为20kbps或更低。 - 配置帧格式(数据长度、校验和类型等)。
- 构建发送报文:将Break字段长度、同步场、ID和数据写入相应的发送缓冲区寄存器(
LINTD0,LINTD1)。 - 触发发送(设置相应控制位)。
- 在中断中处理发送完成或接收到的从节点响应。
配置LIN为从节点示例:
- 初始化GPIO。
- 配置为从模式(
SCIGCR1.MASTER = 0)。 - 配置波特率(通常主节点会通过同步场帮从节点校准,此处可设一个初始值)。
- 使能自动波特率检测和同步。
- 设置本节点的接收标识符掩码(
LINMASK)。 - 使能接收中断。
- 在中断中,检查中断源,如果是接收中断且ID匹配,则从接收缓冲区(
LINRD0,LINRD1)读取数据。
3.2 LIN应用中的特殊考量
- 唤醒机制:LIN总线支持总线唤醒。当总线处于休眠状态时,主节点或任何一个从节点都可以通过发送一个显性电平(Wake-up Signal)来唤醒整个网络。F28035的LIN模块支持检测LINRX引脚上的显性电平来产生唤醒中断。
- 超时管理:LIN通信有严格的时序要求。模块内部提供了超时计数器,可以用于检测帧头超时、响应超时等,这对于诊断通信故障非常有用。
- 从SCI迁移到LIN:如果你的项目从简单的点对点SCI升级到LIN网络,除了配置协议相关寄存器,最重要的是中断服务程序的重构。SCI中断处理相对简单,而LIN中断需要根据
SCIFLR(标志寄存器)和SCIINTVECT0/1(中断向量偏移)来判断具体是发送完成、接收完成、总线错误还是唤醒事件,逻辑更复杂。
4. 控制器局域网(CAN)模块:可靠的多主网络
eCAN-A模块是F28035上功能最完整的通信外设之一,完全兼容CAN 2.0B标准,支持标准和扩展帧,最高速率1Mbps。其核心是邮箱(Mailbox)机制。
4.1 邮箱机制与双缓冲思想
F28035的eCAN模块提供了32个邮箱,每个邮箱都可以独立配置为发送或接收,并拥有自己的标识符(ID)、标识符掩码(用于过滤)和数据区(最多8字节)。这就像是给CPU配备了32个专职的“通信秘书”。
发送流程:当CPU需要发送一帧CAN报文时,它只需找到一个配置为发送模式的空闲邮箱,将ID、控制域(数据长度等)和数据写入该邮箱对应的内存区域(位于专用的CAN RAM中),然后置位该邮箱的发送请求位(CANTRS中的相应位)。之后,CAN模块的协议控制器会自动仲裁总线、发送报文,并在发送成功后置位发送应答位(CANTA),并可选地产生中断。CPU完全被解放出来。
接收流程:对于接收,你需要将邮箱配置为接收模式,并设置好期望的ID和掩码。当总线上一帧报文到来时,CAN模块的接收过滤硬件会将其ID与所有接收邮箱的ID进行比较。如果匹配,该报文会自动被存入第一个匹配的接收邮箱,并置位接收挂起标志(CANRMP),产生中断。CPU在中断中读取数据,然后手动清除CANRMP标志以准备接收下一帧。
关键配置步骤:
- 初始化与波特率设置:这是最复杂的一步。需要配置
CANBTC寄存器来设置波特率。CAN波特率由时间份额(Time Quanta, TQ)组成。一个位时间通常包含3段:同步段(1 TQ)、时间段1(TSEG1)和时间段2(TSEG2)。CANBTC寄存器中的BRP(波特率预分频器)决定了每个TQ的时间长度:TQ = (BRP + 1) / SYSCLKOUT。位时间Bit Time = (TSEG1 + TSEG2 + 1) * TQ。因此,Baud Rate = 1 / Bit Time。配置时需要根据目标波特率和系统时钟仔细计算这些参数,并满足TSEG1 >= TSEG2等规则。 - 配置邮箱:确定哪些邮箱用于发送,哪些用于接收。为每个接收邮箱设置标识符(
MSGID)和局部接收掩码(LAM),掩码为1的位表示“不关心”,实现灵活的过滤。 - 使能邮箱与中断:通过
CANME寄存器使能需要用到的邮箱,通过CANMIM寄存器使能相应邮箱的中断。 - 进入正常工作模式:将
CANMC寄存器中的CCR(改变配置请求)位清0,让模块退出初始化模式,进入正常工作模式。
4.2 高级功能与调试血泪史
- 时间戳:每个邮箱都有一个32位的时间戳计数器(
CANTSC),在报文成功发送或接收时,会将当前计数器的值捕获到报文对象的时间戳寄存器中。这对于网络分析和故障诊断,尤其是需要精确时序的应用(如电机同步)至关重要。 - 自回环测试:在开发初期,没有其他CAN节点时,可以将
CANMC寄存器中的STM(自测试模式)位置1。在此模式下,模块内部将发送端与接收端短接,自己发送的报文自己能收到,用于快速验证软件配置和硬件驱动电路(如CAN收发器)是否基本正常。 - 错误计数与状态:
CANTEC和CANREC寄存器分别记录发送和接收错误计数。当计数值超过一定阈值(如96或128)时,模块会进入“错误被动”或“总线关闭”状态。监控这些寄存器是诊断CAN总线物理层问题(如终端电阻缺失、线缆断裂、干扰)的重要手段。
避坑指南:
- 波特率配置是万恶之源:超过一半的CAN通信问题源于波特率配置错误。务必确保网络所有节点的波特率设置(
BRP,TSEG1,TSEG2)完全一致,哪怕有一个参数不同,通信必然失败。建议将波特率计算过程封装成函数,传入系统时钟和目标波特率,自动计算并校验参数合法性。 - 终端电阻不能省:CAN总线两端(最远距离的两个节点)必须各接一个120欧姆的终端电阻,用于阻抗匹配,消除信号反射。这是硬件设计的基本要求,忘记接电阻会导致通信不稳定,误码率高。
- 邮箱“锁死”问题:在发送邮箱配置为“发送远程帧并自动回复数据帧”的模式下,如果处理不当,可能导致邮箱状态混乱。在修改邮箱配置(如改变ID或数据)前,务必先通过
CANME禁用该邮箱,修改完成后再使能。 - 中断风暴:如果接收邮箱的掩码设置过于宽松,或者总线错误频发,可能导致中断过于频繁,CPU被“淹死”。合理设置接收过滤,并在中断服务程序中高效处理(如快速读取数据、清除标志),必要时可以暂时关闭中断或使用FIFO模式(如果支持)来合并中断。
5. 内部集成电路(I2C)��块:与低速外设的桥梁
I2C是一种两线制(串行数据线SDA,串行时钟线SCL)的同步、半双工通信协议,支持多主多从,在F28035上用于连接EEPROM、传感器、RTC等低速外设。
5.1 I2C工作模式与时钟配置
F28035的I2C模块支持7位和10位地址模式,速率最高400kbps(快速模式)。其核心是状态机,通过操作一系列寄存器来控制通信流程。
关键寄存器与工作流程:
I2CMDR(模式寄存器):这是总指挥。在这里设置主/从模式、启动/停止条件产生、重复启动、发送/接收模式、自由数据格式等。I2CSAR(从机地址寄存器):在主机模式下,存放要通信的从机地址。I2CCNT(数据计数寄存器):在重复模式下非常有用,可以预设要发送/接收的数据字节数,硬件自动计数并在完成后产生中断。I2CDXR(数据发送寄存器)和I2CDRR(数据接收寄存器):顾名思义,存放待发送和已接收的数据。I2CSTR(状态寄存器):反映当前状态,如总线忙(BB)、接收准备好(RXRDY)、发送准备好(TXRDY)、仲裁丢失(ARDY)、无应答(NACK)等。几乎所有操作都需要查询或等待这个寄存器的状态位。
时钟配置详解:I2C的时钟由I2CPSC(预分频)和I2CCLKL/I2CCLKH(时钟低/高时间)寄存器共同决定。假设SYSCLKOUT为60MHz,目标SCL频率为100kHz。
- 首先用
I2CPSC进行粗调。IPSC值决定模块输入时钟:I2C Module Clock = SYSCLKOUT / (I2CPSC + 1)。假设我们设I2CPSC=5,则模块时钟为10MHz。 - 然后,一个SCL时钟周期由低电平时间(
ICCL)和高电平时间(ICCH)组成。ICCL和ICCH的值分别由I2CCLKL和I2CCLKH寄存器设定,它们都是基于模块时钟的计数值。- 目标周期
T = 1 / 100kHz = 10 µs。 - 模块时钟周期
T_mod = 1 / 10MHz = 0.1 µs。 - 因此,一个SCL周期需要的模块时钟数
N = T / T_mod = 10 µs / 0.1 µs = 100。 - 通常设置
ICCL = ICCH = N/2 = 50。所以,I2CCLKL = I2CCLKH = 50。 - 最终SCL频率 = 模块时钟频率 / (
ICCL + ICCH) = 10MHz / 100 = 100kHz。
- 目标周期
5.2 FIFO模式与实战技巧
和SCI一样,I2C也支持4级深度的TX/RX FIFO,可以显著提升批量数据传输的效率。通过I2CFFTX和I2CFFRX寄存器使能和配置FIFO。
典型的主机发送流程(以写EEPROM为例):
- 初始化I2C模块,配置GPIO(SDA和SCL需配置为开漏模式,并接上拉电阻),设置时钟。
- 配置
I2CMDR为主发送模式(MST=1,TRX=1),I2CCNT设置为要发送的字节数(地址+数据)。 - 将7位从机地址(左移一位,最低位写0表示写操作)写入
I2CSAR。 - 将EEPROM的内部存储地址(如2字节)和要写入的数据依次放入
I2CDXR(或TX FIFO)。 - 设置
I2CMDR中的STT位为1,产生起始条件,启动传输。 - 等待
I2CSTR中的ARDY(寄存器访问就绪)中断,或通过查询I2CSTR.TXRDY状态,依次写入后续数据。 - 最后一个字节写入后,硬件在发送完数据后会自动产生停止条件(如果
I2CMDR.STP位已设置)。也可以在最后一个字节后,手动设置STP位。 - 在中断或查询中,检查
I2CSTR.NACK标志,判断从机是否应答。
避坑指南:
- 上拉电阻必须接:SDA和SCL线是开漏输出,必须通过外部上拉电阻(通常4.7kΩ到10kΩ,取决于总线电容和速度)拉到高电平,否则总线永远为低。
- 仲裁丢失处理:在多主系统中,如果两个主机同时发起传输,硬件会进行仲裁。失败的一方会检测到仲裁丢失(
ARDY标志置位),此时软件应转入从机接收模式,并释放总线(将I2CMDR中的MST位清0,FREE位置1)。 - 时钟拉伸:某些低速从设备(如某些传感器)可能在处理数据时需要暂停时钟(将SCL拉低),这称为时钟拉伸。F28035的I2C模块作为主机时能正确处理这种情况,但软件需要意识到传输时间可能比预期长,避免超时误判。
- FIFO使用时机:对于单字节读写,使用FIFO可能增加软件复杂度。但对于连续读写(如从传感器读取多个采样值),使能FIFO并设置合适的触发深度,可以大幅减少中断次数,提升系统效率。
6. 增强型脉宽调制(ePWM)模块:电机与电源控制的核心
ePWM是C2000系列的灵魂,F28035最多有7个独立的ePWM模块(ePWM1-7),每个模块都能产生两路互补或独立的PWM信号(EPWMxA和EPWMxB),是数字电机控制、开关电源、逆变器等应用的核心。
6.1 ePWM子模块协同工作原理
一个ePWM模块并非一个简单的计数器比较单元,而是一个由多个精密协作的子模块构成的系统:
- 时间基准(TB)子模块:核心是一个16位向上/向下/向上向下计数的计数器(
TBCTR)。它决定了PWM的载波频率(周期)。TBPRD寄存器设置周期值。TBPHS寄存器用于设置相位,在多模块同步时至关重要。 - 计数器比较(CC)子模块:包含两个比较寄存器
CMPA和CMPB。当TBCTR的值与CMPA或CMPB匹配时,会产生事件。CMPA和CMPB的值直接决定了PWM的占空比。 - 动作限定器(AQ)子模块:这是将事件转化为具体引脚动作的“翻译官”。当
TBCTR等于CMPA、等于CMPB、等于0或等于TBPRD时,可以触发动作。动作可以是:对EPWMxA/B输出“置高”、“清零”、“翻转”。通过配置AQCTLA和AQCTLB,可以生成对称、非对称、带死区的各种PWM波形。 - 死区发生器(DB)子模块:在电机驱动中,同一桥臂的上下两个开关管(如MOSFET)的驱动信号必须互补且留有死区时间(两者都为低的短暂时间),防止直通短路。DB模块接收AQ模块输出的信号,可以独立地对上升沿和下降沿插入可编程的延迟,生成带死区的互补信号对。
- 事件触发(ET)子模块:当
TBCTR等于CMPA、CMPB、0或TBPRD时,可以产生中断(EPWMxINT)或启动ADC转换的触发信号(EPWMxSOCA/SOCB)。这是实现电流采样与PWM周期精确同步的关键。 - 故障保护(TZ)子模块:当外部故障信号(如过流、过压、过热)输入到TZ1-TZ6引脚时,TZ模块可以强制PWM输出进入预先定义的安全状态(高电平、低电平或高阻态),响应速度极快(纳秒级),是硬件级别的保护。
- 数字比较(DC)子模块:这是更高级的故障保护机制,可以将内部数字信号(如比较器输出)与PWM事件关联,实现更复杂的保护逻辑。
6.2 配置一个完整的互补PWM输出
假设我们需要用ePWM1产生一对频率为10kHz,占空比50%,死区时间为500ns的互补PWM信号,用于驱动一个半桥电路。
步骤1:计算关键参数
- 系统时钟
SYSCLKOUT = 60 MHz,时间基准时钟TBCLK = SYSCLKOUT = 60 MHz(通过TBCTL[HSPCLKDIV, CLKDIV]可分频,这里设为1分频)。 - PWM周期
T = 1 / 10kHz = 100 µs。 TBCLK周期T_tbclk = 1 / 60MHz ≈ 16.67 ns。- 时间基准周期值
TBPRD = T / T_tbclk = 100 µs / 16.67 ns = 6000。 - 对于对称PWM(向上向下计数模式),占空比
D = (TBPRD - CMPA) / TBPRD。要得到50%占空比,CMPA = TBPRD / 2 = 3000。 - 死区时间
T_dead = 500 ns。 - 死区计数器周期数
DBRED = DBFED = T_dead / T_tbclk = 500 ns / 16.67 ns = 30(取整)。
步骤2:寄存器配置代码逻辑(以C语言伪代码为例)
// 1. 使能ePWM1时钟,配置GPIO引脚为ePWM功能 EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 先停止所有ePWM时基时钟同步 SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // 使能ePWM1时钟 GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0 配置为 EPWM1A GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // GPIO1 配置为 EPWM1B EDIS; // 2. 初始化时基子模块 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 对称PWM模式 EPwm1Regs.TBPRD = 6000; // 设置周期值 EPwm1Regs.TBPHS.half.TBPHS = 0; // 相位清零 EPwm1Regs.TBCTR = 0; // 计数器清零 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁止相位加载 EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟预分频 = /1 EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 时钟预分频 = /1 // 3. 设置比较寄存器 EPwm1Regs.CMPA.half.CMPA = 3000; // 设置比较值A,决定占空比 EPwm1Regs.CMPB = 0; // 比较值B本例未使用 // 4. 配置动作限定器 // 向上计数时,当CTR=CMPA, EPWM1A 清零, EPWM1B 置高 EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; // 向下计数时,当CTR=CMPA, EPWM1A 置高, EPWM1B 清零 EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; EPwm1Regs.AQCTLB.bit.CAD = AQ_CLEAR; // 5. 配置死区 EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 使能两路输出的死区 EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 极性选择:高电平有效互补 EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 输入源为EPWMxA EPwm1Regs.DBRED = 30; // 上升沿延迟 EPwm1Regs.DBFED = 30; // 下降沿延迟 // 6. 配置事件触发(例如,在计数器=0时触发ADC采样) EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能SOCA EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // 选择CTR=0为触发源 EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; // 每发生一次事件就触发一次 // 7. 使能时基时钟同步,启动PWM EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS;6.3 高级应用与故障排查
- 多模块同步:在复杂拓扑(如三相逆变器)中,需要多个ePWM模块同步工作。通过
TBCTL[PHSEN]和TBPHS寄存器,可以让后续模块的计数器在收到同步信号(EPWMxSYNCI)时,从指定的相位值开始计数,实现精确的相位差控制。 - 高分辨率PWM(HRPWM):当需要非常精细的占空比控制(步进小于一个
TBCLK周期)时,可以使用HRPWM技术。它通过微边沿定位器(MEP)在传统的PWM边沿上产生亚周期的微调。这涉及到CMPAHR、TBPRDHR等寄存器的配置,计算更为复杂,但对提升控制精度(如电源纹波)效果显著。 - 故障保护(Trip Zone)实战:将过流比较器的输出接到TZ1引脚。配置
TZSEL寄存器选择TZ1作为故障源。在TZCTL寄存器中设置,当TZ1事件发生时,强制EPWM1A和EPWM1B输出高阻态(或强制为低)。在TZEINT中使能故障中断,以便在故障发生后进行软件处理(如记录日志、尝试恢复)。关键点:故障清除后,需要软件清除TZFLG标志,并可能通过TZCLR寄存器来清除强制输出状态,PWM才能恢复正常运行。 - ADC同步采样:利用ePWM的SOC信号精确触发ADC采样,是实现电流、电压环控制的基础。通常在三相系统中,会在PWM周期的中点(向上计数到
TBPRD或向下计数到0)进行采样,以避开开关噪声。这通过配置ET子模块的SOCASEL或SOCBSEL为ET_CTR_ZERO或ET_CTR_PRD来实现。
避坑指南:
- 影子寄存器:
CMPA、CMPB、TBPRD等关键寄存器都有影子寄存器。写入操作是写到影子寄存器,只有在特定的“加载时刻”(如CTR=0时),影子寄存器的值才会被加载到活动寄存器生效。这可以防止PWM波形在周期中间发生畸变。配置时要注意CMPCTL和TBCTL中关于加载模式的设置。 - 死区时间计算误差:死区时间由
DBRED和DBFED寄存器值以及TBCLK频率共同决定。务必根据实际开关器件的开通/关断时间来设置足够(但不过度)的死区。时间过短可能导致直通,过长则会降低有效占空比,影响输出电压。 - PWM输出无信号:首先检查GPIO复用配置是否正确,引脚是否被其他功能占用。其次,检查
TBCTL.bit.CTRMODE是否被误设为TB_FREEZE或TB_STOP。最后,用示波器测量TBCLK时钟是否正常到达ePWM模块。 - 占空比不对或波形异常:检查
CMPA的值是否在0到TBPRD之间。检查AQ模块的配置逻辑,特别是向上计数和向下计数时的动作是否配对正确。对于互补输出,要确保AQCTLA和AQCTLB的设置是逻辑互补的。使用CCS的Graph工具实时观察TBCTR、CMPA和EPWMxA/B引脚波形,是调试AQ逻辑最直观的方法。