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;
}