TMS28027输出PWM波例程解析

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同理

最后将函数导入主函数即可

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值