DSP 外设篇

DSP-280025 PWM 调试

#include "f28002x_device.h"
#include "f28002x_examples.h"

/****************************************************************************************************/
#define CPU_CLOCK  100e6                    //系统时钟100MHz
//#define USR_PWM_FREQ   1039               //PWM 设定频率 1K  ,修正系数0.9623
#define PWM_CORRECTION_FACTOR  1.039
//#define PWM_PERIOD (CPU_CLOCK/(2*USR_PWM_FREQ)) //周期寄存器的值, 向上向下计数,所以*2
#define TBCTLVAL   0x200E                   //控制寄存器的值

//#define DUTY_CIRCUL  60
//#define PWM_CMPA_VALUE  (PWM_PERIOD*DUTY_CIRCUL/100)


#define ON_GET_PWM_TIMBASW_PERIOD(usr_PWM_Freq)  (CPU_CLOCK/(2 * usr_PWM_Freq))
#define ON_GET_PWM_CMPA(usr_PWM_Freq,usr_PWM_DutyHigh)  ((CPU_CLOCK/(2 * usr_PWM_Freq)) * usr_PWM_DutyHigh / 100)
//

static void bsp_s_ePWMGpioInit(void)
{
    EALLOW;
    /*设置时钟允许*/
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;   //BIT2 TBCLKSYNC
    CpuSysRegs.PCLKCR2.bit.EPWM5 = 1;       // ePWM5

    GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0;      //使能GPIO8 内部上拉
    GpioCtrlRegs.GPAQSEL1.bit.GPIO8 = 0;    // Synch to SYSCLKOUT GPIO8 (ePWM5_A)
    GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1;     // 00:GPIO8   01:ePWM5_A  10:Reserved  11:Reserved
    GpioCtrlRegs.GPADIR.bit.GPIO8 = 1;
    EDIS;
}

//This function will initialize the pwm module with the
//specified frequence and duty,
//And start the pwm module.
void bsp_ePWMSetUp(float _pwmFreq,float _pwmDutyHigh)
{
    
    EALLOW;
    //Enable the clock
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;   //BIT2 TBCLKSYNC
    CpuSysRegs.PCLKCR2.bit.EPWM5 = 1;       // ePWM5

    bsp_s_ePWMGpioInit(); //初始化GPIO
 

   #if 1
    //时间基准寄存器
    EPwm5Regs.TBPRD = ON_GET_PWM_TIMBASW_PERIOD(_pwmFreq) - 1;   // 时基计数周期
    EPwm5Regs.TBPHS.all = 0;          // Set Phase register to zero
    EPwm5Regs.TBCTR = 0;              //Clear TB counter,计数器初始值为零

    EPwm5Regs.CMPA.bit.CMPA = ON_GET_PWM_CMPA(_pwmFreq,_pwmDutyHigh) * PWM_CORRECTION_FACTOR; //设定Capture A 的捕获值

    //设置TBCLK = ?M
    EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;    // TBCLK = SYSCLK
    EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    //设置计数模式
    EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;  //UP_DOWMCount Mode

    //设定动作
    EPwm5Regs.AQCTLA.bit.CAU = AQ_CLEAR; //当计数器等于主CMPA寄存器并且计数递增时动作:计数器等于CPMA时ePWMA输出变低
    EPwm5Regs.AQCTLA.bit.CAD = AQ_SET;   //当计数器等于主CMPA寄存器并且计数递减时动作:计数器等于周期值时wPWMA输出变高

   EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE;
    //EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm5Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zero
    //EPwm5Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zero
    //EPwm5Regs.AQCTLA.bit.ZRO = AQ_SET;

    EPwm5Regs.TBCTL.bit.FREE_SOFT = 2;
    EPwm5Regs.TBCTL.bit.PHSEN = TB_DISABLE;     //Phase loading disabled
    EPwm5Regs.TBCTL.bit.PRDLD = TB_SHADOW; //主周期寄存器

    EPwm5Regs.TZCLR.all = 0x0000;
    EPwm5Regs.TZSEL.all = 0x0000; //TZ2使能  0x0200
    EPwm5Regs.TZCTL.all = 0x0000;

    EPwm5Regs.AQSFRC.all  = 0x0;
    EPwm5Regs.AQCSFRC.all = 0x0;
    EPwm5Regs.DBCTL.all = 0x0;   //If trip,Do nothing, no action is taken on EPWMxA.
    #endif
    EDIS;
}

void bsp_ePWM_UpdateFreqAndPeriod(float _pwmFreq,float _pwmDutyHigh)
{
    EPwm5Regs.TBPRD = ON_GET_PWM_TIMBASW_PERIOD(_pwmFreq) - 1;   // 时基计数周期
    EPwm5Regs.CMPA.bit.CMPA = ON_GET_PWM_CMPA(_pwmFreq,_pwmDutyHigh)*PWM_CORRECTION_FACTOR; //设定Capture A 的捕获值
}

void bsp_ePWMSetStop()
{
    EPwm4Regs.CMPA.bit.CMPA = 5000;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值