ePWM模块-时基模块(2)

ePWM模块(2)

时基模块的使用

TBPRD:周期寄存器 (设置的时钟周期存入此,可通过阴影寄存器缓冲后写入,也可通过活动寄存器立即写入)

TBCTR:时基计数变值寄存器 (时基当前所计数的值存入,用于和所设定周期值比较)
在这里插入图片描述

TBPHS:时基相位寄存器
在这里插入图片描述

TBSTS:时基状态寄存器
在这里插入图片描述

TBCTL:控制寄存器 (重要)

在这里插入图片描述
CTRMOD:计数模式
00:加
01:减
10:加减
11:停止计数

PHSEN:使能相位
0:禁止加载
1:加载相位寄存器值

PRDLD:周期寄存器阴影加载方式
0:加载阴影寄存器值
1:不加载阴影

SYNCOSEL:选择ePWMxSYNCO信号输出源
00:ePWMxSYNCI
01:CTR=ZER0:时基计数器为0
10:CTR=CMPA:时基计数器等于比较寄存器A
11:禁止输出

SWFSYNC:软件强制同步脉冲
0:无效果
1:强制一次

HSPCLKDIV:分频,同CLKDIV用。TBCLK=SYSCLKOUT/(HSPCLKDIV×CLKDIV)

CLKDIV:分频,同HSPCLKDIV用
000:1分频
001:2分频
010:4分频

111:128分频

PHSDIR: 增减模式下,同步信号到来时,装载相位值后增减状态的计数方向
0:减计数
1:增计数

#include "EPWM.h"
#include "leds.h"

//时基模块 TB 单独的应用,使用中断实现呼吸灯
void EPWM1_Init(Uint16 tbprd) //输入参数为PWM的周期
{
    //使能 ePWM 外设时钟及失能时基模块时钟
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//失能TBCLKSYNC
    SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;//使能ePWM1外设时钟
    EDIS;

    //中断向量表
    EALLOW;
    PieVectTable.EPWM1_INT = &epwm1_timer_isr;
    EDIS;

    //使能时基时钟
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//使能TBCLKSYNC
    EDIS;

    //设置同步
    EPwm1Regs.TBCTL.bit.SYNCOSEL= 0x0;//TB_SYNC_IN
    //允许每个使用被同步
    EPwm1Regs.TBCTL.bit.PHSEN = 0x1;//TB_ENABLE
    时基相位寄存器赋值0
    EPwm1Regs.TBPHS.half.TBPHS = 0;
    //设置周期数值
    EPwm1Regs.TBPRD = tbprd;
    // 递增计数模式
    EPwm1Regs.TBCTL.bit.CTRMODE = 0x0;//TB_COUNT_UP
    //TBCLK=SYSCLKOUT/(HSPCLKDIV×CLKDIV)
    EPwm1Regs.TBCTL.bit.HSPCLKDIV=0x0;//不分频TB_DIV1
    EPwm1Regs.TBCTL.bit.CLKDIV=0x0;//不分频TB_DIV1
    // 在零事件上选择INT
    EPwm1Regs.ETSEL.bit.INTSEL = 0x1;//ET_CTR_ZERO
    // 使能 INT
    EPwm1Regs.ETSEL.bit.INTEN = 1;  //ET_1ST
    // 在第一个事件上生成INT
    EPwm1Regs.ETPS.bit.INTPRD = 0x1;
    // 同步启动所有计时器
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;

    // 使能连接EPWM1-6 INT的CPU INT3:
    IER |= M_INT3;

    // 使能PIE中的EPWM INTn:组3中断1-6
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

   // 启用全局中断和更高优先级的实时调试事件:
   EINT;   // 启用全局中断INTM
   ERTM;   // 启用全局实时中断DBGM
}

interrupt void epwm1_timer_isr(void)
{
    static Uint16 cnt = 0;
    cnt++;
    if(cnt==5000)
    {
        cnt=0;
        LED3_TOGGLE;
    }
    // 清除此计时器的INT标志
    EPwm1Regs.ETCLR.bit.INT = 1;
    // 确认此中断以接收来自组3的更多中断
    PieCtrlRegs.PIEACK.bit.ACK3 = 1;
}

#ifndef APP_EPWM_EPWM_H_
#define APP_EPWM_EPWM_H_

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

void EPWM1_Init(Uint16 tbprd);
interrupt void epwm1_timer_isr(void);



#endif /* APP_EPWM_EPWM_H_ */
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
任务一:生成一个正弦波 ```c #include "DSP2833x_Device.h" #include "DSP2833x_Examples.h" #define PI 3.14159265358979323846 Uint16 sine_table[256]; void Init_Sine_Table(void) { int i; for(i = 0; i < 256; i++) { sine_table[i] = (Uint16)(2047*sin(2*PI*i/256) + 2047); } } void main(void) { InitSysCtrl(); InitPieCtrl(); InitPieVectTable(); Init_Sine_Table(); EALLOW; GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //PWM1A GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; //PWM1B EDIS; EPwm1Regs.TBPRD = 7500; //设置PWM周期为10kHz EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; EPwm1Regs.CMPA.bit.CMPA = sine_table[0]; EPwm1Regs.ETSEL.bit.SOCAEN = 1; EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; EPwm1Regs.TBCTL.bit.CLKDIV = 0; EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm1Regs.CMPA.bit.CMPA = sine_table[0]; EPwm1Regs.CMPB.bit.CMPB = sine_table[0]; EPwm1Regs.ETSEL.bit.SOCAEN = 1; EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; EPwm1Regs.TBCTL.bit.CLKDIV = 0; EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm1Regs.CMPA.bit.CMPA = sine_table[0]; EPwm1Regs.CMPB.bit.CMPB = sine_table[0]; EPwm1Regs.ETSEL.bit.SOCAEN = 1; EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; while(1) { } } ``` 任务二:实现PWM波形调制 ```c #include "DSP2833x_Device.h" #include "DSP2833x_Examples.h" void main(void) { InitSysCtrl(); InitPieCtrl(); InitPieVectTable(); EALLOW; GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; EDIS; EPwm1Regs.TBPRD = 4500; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm1Regs.CMPA.bit.CMPA = 2250; //占空比50% EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; //高电平 EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; //低电平 EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR; EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; while(1) { } } ``` 任务三:实现ADC采样和输出 ```c #include "DSP2833x_Device.h" #include "DSP2833x_Examples.h" #define ADC_SOC_NUMBER 0 //使用的ADC SOC号码 Uint16 AdcData[2]; //存放ADC采样结果的数组 void ADC_Init(void) { EALLOW; AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; //内部参考电压 AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; //开启内部参考电压缓冲区 AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; //开启内部参考电压缓冲区 AdcRegs.ADCCTL1.bit.ADCPWDN = 1; //开启ADC电源 AdcRegs.ADCCTL2.bit.CLKDIV2EN = 0; //不分频 AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1; //非重叠采样 AdcRegs.ADCCTL2.bit.CHARGEPUMPEN = 1; //开启充电泵 AdcRegs.ADCCTL2.bit.INTPULSEPOS = 1; //中断脉冲在采样之后 AdcRegs.ADCSOC0CTL.bit.CHSEL = 0; //采样通道 AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; //采样保持时间 AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; //触发源EPWM1SOCA AdcRegs.ADCSOC0CTL.bit.HI_PRIORITY = 1; //高优先级 AdcRegs.INTSEL1N2.bit.INT1SEL = ADC_SOC_NUMBER; //中断1与ADC SOC关联 AdcRegs.INTSEL1N2.bit.INT1E = 1; //开启ADC中断1 AdcRegs.INTSEL1N2.bit.INT1CONT = 1; //循环模式 AdcRegs.INTSEL1N2.bit.INT1SEL2 = 0; //中断1触发源为EOC0 AdcRegs.INTSEL1N2.bit.INT1SEL1 = 0; //中断1触发源为EOC0 PieCtrlRegs.PIEIER1.bit.INTx6 = 1; //开启ADC中断1 IER |= M_INT1; AdcRegs.ADCSOCFRC1.all = 0x0001; //启动ADC SOC0采样 EDIS; } interrupt void Adc_ISR(void) { AdcData[0] = AdcResult.ADCRESULT0; //存放采样结果 AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //清除ADC中断1标志位 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //清除PIE中断标志位 } void main(void) { InitSysCtrl(); InitPieCtrl(); InitPieVectTable(); ADC_Init(); EALLOW; GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; EDIS; EPwm1Regs.TBPRD = 4500; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm1Regs.CMPA.bit.CMPA = 2250; //占空比50% EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; //高电平 EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; //低电平 EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR; EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; while(1) { EPwm1Regs.CMPA.bit.CMPA = AdcData[0]; //将ADC采样结果输出到PWM的占空比上 } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

傻童:CPU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值