ePWM模块(3)

比较模块

CMPA:比较寄存器A,其值与TBCTR值比较,相同时,事件发送到动作模块。
CMPB:比较寄存器B,其值与TBCTR值比较,相同时,事件发送到动作模块。
CMPCTL:控制寄存器(重要)
在这里插入图片描述
SHDWAFULL(或SHDWBFULL):CMPA(或B)阴影寄存器满标志位
0:未满
1:满了
SHDWAMODE(或SHDWBMODE):CMPA(或B)写入值是否使用阴影
0:通过阴影寄存器写入
1:直接写入
LOADAMODE(或LOADBMODE):若使用阴影,加载条件模式选择
00:CTR=ZERO时
01:CTR=PRD时
10:CTR=ZERO或CTR=PRD是
11:禁止
在这里插入图片描述

动作限定模块

AQCTLA:动作限定输出A控制寄存器
AQCTLB:动作限定输出A控制寄存器
在这里插入图片描述
在这里插入图片描述
ZRO:当计数器等于0时
00:无动作
01:清除,使ePWMxA输出低
10:置位,使ePWMxA输出高
11:切换,使ePWMxA输出翻转(高变低,低变高)

PRD:当计数器等于周期动作
00:无动作
01:清除,使ePWMxA输出低
10:置位,使ePWMxA输出高
11:切换,使ePWMxA输出翻转(高变低,低变高)

CAU:计数器等于CMPA且计数为增时
00:无动作
01:清除,使ePWMxA输出低
10:置位,使ePWMxA输出高
11:切换,使ePWMxA输出翻转(高变低,低变高)

CAD:计数器等于CMPA且计数为减时
00:无动作
01:清除,使ePWMxA输出低
10:置位,使ePWMxA输出高
11:切换,使ePWMxA输出翻转(高变低,低变高)

CBU:计数器等于CMPB且计数为增时
00:无动作
01:清除,使ePWMxA输出低
10:置位,使ePWMxA输出高
11:切换,使ePWMxA输出翻转(高变低,低变高)

CBD:时间基准计数器等于CMPB寄存器且计数为减时
00:无动作
01:清除,使ePWMxA输出低
10:置位,使ePWMxA输出高
11:切换,使ePWMxA输出翻转(高变低,低变高)
在这里插入图片描述
ACTSFA:当一次性软件强制A被调用时行动
00:禁止
01:清除(低)
10:设定(高)
11:切换(高低切换)

OTSFA:对输出事件A一次性软件强制
0:写0无效果,始终读0
1:触发单一S/W事件

ACTSFB:当一次性软件强制B被调用时行动
00:禁止
01:清除(低)
10:设定(高)
11:切换(高低切换)

OTSFB:对输出事件B一次性软件强制
0:写0无效果,始终读0
1:触发单一S/W事件

BLDCSF:主寄存器从映射选项重新加载
00:遇到计数器等于0的事件加载
01:遇到计数器等于周期的事件加载
10:遇到计数器等于0或周期的事件加载
11:直接加载,不经过映射

在这里插入图片描述
CSFA:对输出A连续软件强制
00:无作用
01:对输出A强制产生连续低信号
10:对输出A强制产生连续高信号
11:软件强制被禁用且无效

CSFB:对输出B连续软件强制
00:无作用
01:对输出B强制产生连续低信号
10:对输出B强制产生连续高信号
11:软件强制被禁用且无效

事件触发模块

在这里插入图片描述
在这里插入图片描述
INTESEL:EPWM中断选项
000:保留
001:时基计数器(TBCTR)为0
010:TBCTR=TBPRD
011:保留
100:定时器递增时时间基准计数器等于CMPA
101:定时器递减时时间基准计数器等于CMPA
110:定时器递增时时间基准计数器等于CMPB
111:定时器递减时时间基准计数器等于CMPB

INTEN:使能EPWM中断生成
0:禁止生成
1:启动生成

SCOASEL:决定EPWMxSOCB脉冲何时被生成
000:保留
001:时基计数器(TBCTR)为0
010:TBCTR=TBPRD
011:保留
100:定时器递增时时间基准计数器等于CMPA
101:定时器递减时时间基准计数器等于CMPA
110:定时器递增时时间基准计数器等于CMPB
111:定时器递减时时间基准计数器等于CMPB

SOCAEN:使能ADC转换A(EPWMxSOCA)脉冲
0:禁止
1:使能

SCOBSEL:决定EPWMxSOCB脉冲何时被生成
000:保留
001:时基计数器(TBCTR)为0
010:TBCTR=TBPRD
011:保留
100:定时器递增时时间基准计数器等于CMPA
101:定时器递减时时间基准计数器等于CMPA
110:定时器递增时时间基准计数器等于CMPB
111:定时器递减时时间基准计数器等于CMPB

SCOBEN:使能ADC转换B(EPWMxSOCB)脉冲
0:禁止
1:使能

在这里插入图片描述
INTPRD:在第几个事件发生中断
00:禁用
01:在第一个事件发生时中断,ETPS[INTCNT]=0,1
10:在第二个事件发生时中断,ETPS[INTCNT]=1,0
11:在第三个事件发生时中断,ETPS[INTCNT]=1,1

NTCNT:EPWM中断技术寄存器
00:没有事件发生
01:1个
10:2个
11:3个

SOCBCNT:EPWM ADC开始变换B事件(EPWMxSOCB)计数器寄存器,这些位决定有多少选定ETSEL(SOCBSEL)事件已经发生
00:没有
01:1个
10:2个
11:3个

SOCBPRD:EPWMxSOCB脉冲信号生成事件选择
00:禁用
01:第一个事件上生成EPWMxSOCB脉冲:ETPS[SOCBCNT]=0,1
10:第二个事件上生成EPWMxSOCB脉冲:ETPS[SOCBCNT]=1,0
11:第三个事件上生成EPWMxSOCB脉冲:ETPS[SOCBCNT]=1,1

PWM配置的步骤:
(1) 使能 ePWM 外设时钟及失能时基模块时钟
(2) 开启 ePWM 对应 GPIO 时钟及初始化配置
(3) 初始化时基模块, 即配置 TB 相关寄存器值
(4) 初始化比较模块, 即配置 CC 相关寄存器值
(5) 初始化动作限定模块, 即配置 AQ 相关寄存器值
(6) 初始化事件触发模块, 即配置 ET 相关寄存器值
(7) 初始化死区模块、 斩波模块, 即配置 DB、 PC 相关寄存器值
(8) 使能时基计数器时钟


#include "epwm.h"

//进行PWM6的初始化,参数输入参数为PWM波的周期
void EPWM6_Init(Uint16 tbprd)
{
    //使能 ePWM 外设时钟及使能时基模块时钟
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;
    EDIS;

    //初始化GPIO    GPIO输出PWM波
    InitEPwm6Gpio();

    //初始化时基模块
    //设置同步
    EPwm6Regs.TBCTL.bit.SYNCOSEL = 0x0;//TB_SYNC_IN
    //允许每个使用被同步
    EPwm6Regs.TBCTL.bit.PHSEN = 0x1;//TB_ENABLE
    //时基相位寄存器赋值0
    EPwm6Regs.TBPHS.half.TBPHS = 0;
    // 清零计数器
    EPwm6Regs.TBCTR = 0x0000;
    //设置周期数值
    EPwm6Regs.TBPRD = tbprd;
    // 递增计数模式
    EPwm6Regs.TBCTL.bit.CTRMODE = 0x0;//TB_COUNT_UP
    //TBCLK=SYSCLKOUT/(HSPCLKDIV×CLKDIV)
    EPwm6Regs.TBCTL.bit.HSPCLKDIV=0x0;//不分频TB_DIV1
    EPwm6Regs.TBCTL.bit.CLKDIV=0x0;//不分频TB_DIV1

    // 初始化比较模块
    // 将影子寄存器加载设置为零
    //使用影子寄存器
    EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//0x0
    EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//0x0
    //等于0时,加载事件
    EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//0x0
    EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;//0x0
    // 设置比较值为0
    EPwm6Regs.CMPA.half.CMPA = 0;
    EPwm6Regs.CMPB = 0;

    //初始化动作限定模块
    // A计数到0时触发事件,并且在A向上计数的时候触发
    EPwm6Regs.AQCTLA.bit.ZRO = AQ_CLEAR;// 0x1
    EPwm6Regs.AQCTLA.bit.CAU = AQ_SET; // 0x2
    // B计数到0时触发事件,并且在B向上计数的时候触发
    EPwm6Regs.AQCTLB.bit.ZRO = AQ_CLEAR; // 0x1
    EPwm6Regs.AQCTLB.bit.CBU = AQ_SET;// 0x2

    //初始化事件触发模块
    //选择0匹配事件中断
    EPwm6Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//0x1
    //使能事件触发中断
    EPwm6Regs.ETSEL.bit.INTEN = 1;
    //一次中断请求
    EPwm6Regs.ETPS.bit.INTPRD = ET_1ST;//0x1

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Start all the timers synced
    EDIS;
}
void EPwm6A_SetCompare(Uint16 val)
{
    EPwm6Regs.CMPA.half.CMPA = val;  //设置占空比
}
void EPwm6B_SetCompare(Uint16 val)
{
    EPwm6Regs.CMPB = val;  //设置占空比
}

#ifndef APP_EPWM_EPWM_H_
#define APP_EPWM_EPWM_H_

#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件

void EPWM6_Init(Uint16 tbprd);
void EPwm6A_SetCompare(Uint16 val);
void EPwm6B_SetCompare(Uint16 val);

#endif /* APP_EPWM_EPWM_H_ */

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻童:CPU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值