#include “DSP2833x_Device.h” // DSP2833x Headerfile Include File
#include “DSP2833x_Examples.h” // DSP2833x Examples Include File
// InitPWM:PWM使能
//必要的函数声明//
void InitPwm(int16 c,float32 f);
void UpdatePwm(int16 c,float32 pw,float32 f);
void InitPwm1AB(float32 f);
void InitPwm2AB(float32 f);
void InitPwm3AB(float32 f);
void InitPwm4AB(float32 f);
void InitPwm5AB(float32 f);
void InitPwm6AB(float32 f);
void UpdatePwm1A(float32 pw,float32 f);
void UpdatePwm1B(float32 pw,float32 f);
void UpdatePwm2A(float32 pw,float32 f);
void UpdatePwm2B(float32 pw,float32 f);
void UpdatePwm3A(float32 pw,float32 f);
void UpdatePwm3B(float32 pw,float32 f);
void UpdatePwm4A(float32 pw,float32 f);
void UpdatePwm4B(float32 pw,float32 f);
void UpdatePwm5A(float32 pw,float32 f);
void UpdatePwm5B(float32 pw,float32 f);
void UpdatePwm6A(float32 pw,float32 f);
void UpdatePwm6B(float32 pw,float32 f);
//初始化PWM函数//
void InitPwm(int16 c,float32 f){
switch ( c )
{
case 0:
InitPwm1AB(f);
break;
case 1:
InitPwm1AB(f);
break;
case 2:
InitPwm2AB(f);
break;
case 3:
InitPwm2AB(f);
break;
case 4:
InitPwm3AB(f);
break;
case 5:
InitPwm3AB(f);
break;
case 6:
InitPwm4AB(f);
break;
case 7:
InitPwm4AB(f);
break;
case 8:
InitPwm5AB(f);
break;
case 9:
InitPwm5AB(f);
break;
case 10:
InitPwm6AB(f);
break;
case 11:
InitPwm6AB(f);
break;
default: break;
}
}
//PWM信号产生函数//
void UpdatePwm(int16 c,float32 pw,float32 f)//入口参数:通道、占空比、频率
{
if(pw<=0.0001)
pw=0.0001;
else if(pw>99.9999)
pw=99.9999;
pw = pw/100.0;
switch(c)
{
case 0:
UpdatePwm1A(pw,f);
break;
case 1:
UpdatePwm1B(pw,f);
break;
case 2:
UpdatePwm2A(pw,f);
break;
case 3:
UpdatePwm2B(pw,f);
break;
case 4:
UpdatePwm3A(pw,f);
break;
case 5:
UpdatePwm3B(pw,f);
break;
case 6:
UpdatePwm4A(pw,f);
break;
case 7:
UpdatePwm4B(pw,f);
break;
case 8:
UpdatePwm5A(pw,f);
break;
case 9:
UpdatePwm5B(pw,f);
break;
case 10:
UpdatePwm6A(pw,f);
break;
case 11:
UpdatePwm6B(pw,f);
break;
default:break;
}
}
//初始化子函数,对第一个函数作注释//
void InitPwm1AB(float32 f)
{
Uint16 T= 2343750/f-1.0;//系统时钟SYSCLKOUT=150MHz,TBCLK=6.6666667ns,在连续增计数模式下,f=150000000/(TBPDR+1)
// T = 150 000 000 /CLKDIV/HSPCLKDIV/f - 1.0
EALLOW;
//先初始化通用输入输出口//
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;
EPwm1Regs.TBPHS.half.TBPHS = 0; // 在相位寄存器中设置计数器的起始计数位置
//下面两条语句组合对PWM的时钟进行分频
EPwm1Regs.TBCTL.bit.CLKDIV = 6;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.TBPRD = T; //在周期寄存器中设置计数器的计数周期
//TBCTL为定时器控制寄存器
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //设置计数模式位为连续增计数模式,产生对称方波
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 将定时器相位使能位关闭
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;//映射寄存器SHADOW使能并配置映射寄存器为自动读写
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 定时器时钟源选择,一共有四种时钟源
EPwm1Regs.CMPA.half.CMPA= 0.0001*T;// 设置EPWM1A比较值寄存器的比较值,即体现EPWM1A的占空比
EPwm1Regs.CMPB= 0.0001*T;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//A模块比较模式
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//B模块比较模式
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // A模块比较使能,通过写0来清除SHDWAMODE位来使能load on CTR=Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // B模块比较使能,通过写0来清除SHDWBMODE位来使能load on CTR=Zero
//AQCTLA为输出A比较方式控制寄存器
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // TBCTR(计数器)计到零时使输出为反向
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//TBCTR(计数器)与CMPA在up计数时相等使输出为high,这关系的输出的占空比
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EDIS;
}
void InitPwm2AB(float32 f)
{
Uint16 T= 2343750/f-1.0;
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;
EPwm1Regs.TBCTL.bit.CLKDIV = 6;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.TBPRD = T;
EPwm2Regs.TBPHS.half.TBPHS = 0;
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm2Regs.CMPA.half.CMPA= 0.0001*T;
EPwm2Regs.CMPB= 0.0001*T;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EDIS;
}
void InitPwm3AB(float32 f)
{
Uint16 T= 2343750/f-1.0;
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1;
EPwm1Regs.TBCTL.bit.CLKDIV = 6;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.TBPRD = T;
EPwm3Regs.TBPHS.half.TBPHS = 0;
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm3Regs.CMPA.half.CMPA= 0.0001*T;
EPwm3Regs.CMPB= 0.0001*T;
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm3Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm3Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EDIS;
}
void InitPwm4AB(float32 f)
{
Uint16 T= 2343750/f-1.0;
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 1;
EPwm1Regs.TBCTL.bit.CLKDIV = 6;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.TBPRD = T;
EPwm4Regs.TBPHS.half.TBPHS = 0;
EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm4Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm4Regs.CMPA.half.CMPA= 0.0001*T;
EPwm4Regs.CMPB= 0.0001*T;
EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm4Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm4Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm4Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm4Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EDIS;
}
void InitPwm5AB(float32 f)
{
Uint16 T= 2343750/f-1.0;
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO9 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 1;
EPwm1Regs.TBCTL.bit.CLKDIV = 6;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.TBPRD = T;
EPwm5Regs.TBPHS.half.TBPHS = 0;
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm5Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm5Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm5Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm5Regs.CMPA.half.CMPA= 0.0001*T;
EPwm5Regs.CMPB= 0.0001*T;
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm5Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm5Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm5Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm5Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm5Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm5Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EDIS;
}
void InitPwm6AB(float32 f)
{
Uint16 T= 2343750/f-1.0;
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO10 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO11 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 1;
EPwm1Regs.TBCTL.bit.CLKDIV = 6;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.TBPRD = T;
EPwm6Regs.TBPHS.half.TBPHS = 0;
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm6Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm6Regs.CMPA.half.CMPA= 0.0001*T;
EPwm6Regs.CMPB= 0.0001*T;
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm6Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm6Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm6Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm6Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EDIS;
}
//PWM信号生成子函数//
void UpdatePwm1A(float32 pw,float32 f)
{
Uint16 T=2343750/f-1.0;
EPwm1Regs.CMPA.half.CMPA= pw*T;// 设置EPWM1A比较值寄存器的比较值,即体现EPWM1A的占空比
}
void UpdatePwm1B(float32 pw,float32 f)
{
Uint16 T=2343750/f-1.0;
EPwm1Regs.CMPB= pw*T;// 设置EPWM1A比较值寄存器的比较值,即体现EPWM1A的占空比
}
void UpdatePwm2A(float32 pw,float32 f)
{
Uint16 T=2343750/f-1.0;
EPwm2Regs.CMPA.half.CMPA= pw*T;
}
void UpdatePwm2B(float32 pw,float32 f)
{
Uint16 T=2343750/f-1.0;
EPwm2Regs.CMPB= pw*T;
}
void UpdatePwm3A(float32 pw,float32 f)
{
Uint16 T=2343750/f-1.0;
EPwm3Regs.CMPA.half.CMPA= pw*T;
}
void UpdatePwm3B(float32 pw,float32 f)
{
Uint16 T=2343750/f-1.0;
EPwm3Regs.CMPB= pw*T;
}
void UpdatePwm4A(float32 pw,float32 f)
{
Uint16 T=2343750/f-1.0;
EPwm4Regs.CMPA.half.CMPA= pw*T;
}
void UpdatePwm4B(float32 pw,float32 f)
{
Uint16 T=2343750/f-1.0;
EPwm4Regs.CMPB= pw*T;
}
void UpdatePwm5A(float32 pw,float32 f)
{
Uint16 T=2343750/f-1.0;
EPwm5Regs.CMPA.half.CMPA= pw*T;
}
void UpdatePwm5B(float32 pw,float32 f)
{
Uint16 T=2343750/f-1.0;
EPwm5Regs.CMPB= pw*T;
}
void UpdatePwm6A(float32 pw,float32 f)
{
Uint16 T=2343750/f-1.0;
EPwm6Regs.CMPA.all= pw*T;
}
void UpdatePwm6B(float32 pw,float32 f)
{
Uint16 T=2343750/f-1.0;
EPwm6Regs.CMPB= pw*T;
}
//===========================================================================
// End of file.
//===========================================================================