PWM波模块由Time-Base(时基)、Counter-Compare(计数器比较)、Action-Qualifier(波形发生器)、Dead-Band(死区设置)、Trip-Zone(错误处理)、Event-Trigger(事件触发)、PWM-Chopper(PWM斩波器)、HRPWM(高分辨率脉宽调制器)、Digital Compare Event(数字比较事件)这些子模块组成
例程中输出一个PWM波只需要用到TB(Time-Base)、CC(Counter-Compare)、AQ(Action-Qualifier)、ET(Event-Trigger)模块
首先看TB模块包含的寄存器
TBPRD 决定时基计数器的周期(设置 PWM 频率)。
TBPHS 设置所选 ePWM 相对于提供同步输入信号的时基的时基计数器相位。
TBCTR 读取当前时基计数器值
TBCTL 控制时基行为
TBSTS
TBPRDHR(1)
TBPHSHR(1)
TBPRDHRM(1)
TBPRDM(1)
(1)该寄存器仅在包含高分辨率扩展 (HRPWM) 的 ePWM 实例上可用。 在不包含 HRPWM 的 ePWM 模块上,此位置是保留的。
CC包含的寄存器
CMPCTL 控制计数器比较寄存器的工作模式、状态标志等
CMPA CMPA 寄存器中的值不断与时基计数器 (TBCTR) 进行比较。 当值相等时,计 数器比较模块生成“时基计数器等于计数器比较 A”事件。 此事件被发送到动作限定符, 在那里它被限定并将其转换为一个或多个动作。 这些操作可应用于 EPWMxA 或 EPWMxB 输出,具体取决于 AQCTLA 和 AQCTLB 寄存器的配置。
CMPB同理
AQ包含的寄存器
ET包含的寄存器
PWM模块各寄存器更详细的介绍我整理在了pdf里https://download.csdn.net/download/asbcddasds/20430625
例程中用PWM3模块,对应的引脚为gpio4、5。
初始化程序
GPIO的初始化以及PWM模块的设定
void InitEPwm3Gpio(void)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 1; // Disable pull-up on GPIO4 (EPWM3A)
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 1; // Disable pull-up on GPIO5 (EPWM3B)
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; // Configure GPIO4 as EPWM3A
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1; // Configure GPIO5 as EPWM3B
EDIS;
}
void InitEPwm3Example(void)
{EALLOW;
EPwm3Regs.TBPRD = 2000; // Set timer period计数为2001(设置频率)
// Setup TB
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 模式选择Count up
EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用相位加载
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1; //分频设置
EPwm3Regs.TBPHS.half.TBPHS = 0x0000; // 相位设置为0
EPwm3Regs.TBCTR = 0x0000; //清除时基计数器
// Setup shadow register load on ZERO
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; //计数器计较A寄存器工作在影子模式
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; //计数器计较B寄存器工作在影子模式
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//计数器比较A从影子模式加载,时基计数器初始置零
EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Set Compare values确定占空比
EPwm3Regs.CMPA.half.CMPA = 50; // 设定比较值A为50
EPwm3Regs.CMPB = 1950; // 设定比较值B为1950
// Set Actions
EPwm3Regs.AQCTLA.bit.CAU = AQ_SET; // 当计数器等于CMPA寄存器且计数器为递增时,强制epwm3a输出高电平
EPwm3Regs.AQCTLA.bit.CBU = AQ_SET;
EPwm3Regs.AQCTLA.bit.ZRO = AQ_CLEAR; // 当计数器为0时切换epwm3A的输出
EPwm3Regs.AQCTLB.bit.ZRO = AQ_CLEAR;
// Interrupt where we will change the Compare Values
EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //使能事件计数器为零
EPwm3Regs.ETSEL.bit.INTEN = 1; //启用 ePWM 中断 (EPWMx_INT) 生成
EPwm3Regs.ETPS.bit.INTPRD = ET_3RD; //在 ETPS[INTCNT] = 1,1(第三个事件)上产生中断
EDIS;
// Start by increasing the compare A and decreasing compare B
}
PWM周期计算=(TBPRD+1)xTBCLK————TBCLK=SYSCLKOUT / (HSPCLKDIV × CLKDIV)
对于TMS28027来说SYSCLKOUT=60MHZ
例程中,HSPCLKDIV和CLKDIV都等于1,则TBCLK=60MHZ/1=16.67ns
周期为2001*16.67ns=33.4ms
占空比计算:
PWM3A通道占空比为(2000-50)/2000=97.5%
PWM3B同理
最后将函数导入主函数即可