dsp280x_epwm.c
来自「2808单相全桥spwm逆变工程.rar」· C语言 代码 · 共 814 行 · 第 1/3 页
C
814 行
//set Deadband
// Active Low PWMs - Setup Deadband
EPwm6Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
EPwm6Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //启用epwmxa,epwmxb互补对称,并且死区为低有效模式
EPwm6Regs.DBCTL.bit.IN_MODE = DBA_ALL; //这种模式实际上只需要epwmxa作为输入,即可产生带死区的两路xa,xb输出了
EPwm6Regs.DBRED = 0;//EPWMW_MIN_DB; //上升沿延时
EPwm6Regs.DBFED = 0;//EPWMW_MIN_DB; //下降沿延时
/*
// 时间触发寄存器
// 中断发生在计数器为0的时候
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero event
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on 第一个 event
*/
/*
EPwm3Regs.AQCSFRC.bit.CSFA=0x1;
EPwm3Regs.AQCSFRC.bit.CSFB=0x1;
*/
}
void SetupEPwmGD1(void) //by yb
{
//setup TB
EPwm3Regs.TBPRD = EPWMDC_PERIOD; //60k // Set timer period 50us
EPwm3Regs.TBPHS.half.TBPHS = 0; // Phase is 0
EPwm3Regs.TBCTR = 0x0000; // Clear counter
// Setup TBCTL
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // up-down count mode
EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Master module
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync down-stream module 移相角度从计数器为0时算起
EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW; //变化TBPRD时,使用shadow寄存器(即当计数器为0时才更新)
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1; //两个均直通,即计数器时钟为系统时钟
// Setup CMPCTL
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Setup CMP
EPwm3Regs.CMPA.half.CMPA = DCADuty;//初始值d=0.43
// Set actions
// Set PWM2A
EPwm3Regs.AQCTLA.bit.CAU=AQ_CLEAR; //计数器(增加时)=比较器A时,输出low
EPwm3Regs.AQCTLA.bit.CAD=AQ_SET; //计数器(减小时)=比较器A时,输出high
// Set PWM2B
EPwm3Regs.AQCTLB.bit.CAU=AQ_SET; //计数器(增加时)=比较器A时,输出high
EPwm3Regs.AQCTLB.bit.CAD=AQ_CLEAR; //计数器(减小时)=比较器A时,输出low
//set Deadband
// Active Low PWMs - Setup Deadband
EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //启用epwmxa,epwmxb互补对称,并且死区为低有效模式
EPwm3Regs.DBCTL.bit.IN_MODE = DBA_ALL; //这种模式实际上只需要epwmxb作为输入,即可产生带死区的两路xa,xb输出了
EPwm3Regs.DBRED = EPWMGD1_MIN_DB; //上升沿延时
EPwm3Regs.DBFED = EPWMGD1_MIN_DB; //下降沿延时
}
void SetupEPwmGD2(void) //by yb
{
//setup TB
EPwm4Regs.TBPRD = EPWMDC_PERIOD; //60k // Set timer period 50us
EPwm4Regs.TBPHS.half.TBPHS = EPWMDC_PERIOD; // Phase is 180
EPwm4Regs.TBCTR = 0x0000; // Clear counter
// Setup TBCTL
EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // up-down count mode
EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE; // slaver module
EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync down-stream module 移相角度从计数器为0时算起
EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW; //变化TBPRD时,使用shadow寄存器(即当计数器为0时才更新)
EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1; //两个均直通,即计数器时钟为系统时钟
// Setup CMPCTL
EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO
EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Setup CMP
EPwm4Regs.CMPA.half.CMPA = DCADuty;//初始值d=0.43
// Set actions
// Set PWM2A
EPwm4Regs.AQCTLA.bit.CAU=AQ_CLEAR; //计数器(增加时)=比较器A时,输出low
EPwm4Regs.AQCTLA.bit.CAD=AQ_SET; //计数器(减小时)=比较器A时,输出high
// Set PWM2B
EPwm4Regs.AQCTLB.bit.CAU=AQ_SET; //计数器(增加时)=比较器A时,输出high
EPwm4Regs.AQCTLB.bit.CAD=AQ_CLEAR; //计数器(减小时)=比较器A时,输出low
//set Deadband
// Active Low PWMs - Setup Deadband
EPwm4Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //启用epwmxa,epwmxb互补对称,并且死区为低有效模式
EPwm4Regs.DBCTL.bit.IN_MODE = DBA_ALL; //这种模式实际上只需要epwmxb作为输入,即可产生带死区的两路xa,xb输出了
EPwm4Regs.DBRED = EPWMGD2_MIN_DB; //上升沿延时
EPwm4Regs.DBFED = EPWMGD2_MIN_DB; //下降沿延时
}
void SetupEPwmGD3(void) //by yb
{
//setup TB
EPwm5Regs.TBPRD = EPWMDC_PERIOD; //60k // Set timer period 50us
EPwm5Regs.TBPHS.half.TBPHS = EPWMDC_PERIOD; // Phase is 180
EPwm5Regs.TBCTR = 0x0000; // Clear counter
// Setup TBCTL
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // up-down count mode
EPwm5Regs.TBCTL.bit.PHSEN = TB_ENABLE; // slaver module
EPwm5Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync down-stream module 移相角度从计数器为0时算起
EPwm5Regs.TBCTL.bit.PRDLD = TB_SHADOW; //变化TBPRD时,使用shadow寄存器(即当计数器为0时才更新)
EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1; //两个均直通,即计数器时钟为系统时钟
// Setup CMPCTL
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO
EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm5Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm5Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Setup CMP
EPwm5Regs.CMPA.half.CMPA = DCBDuty;
// Set actions
// Set PWM2A
EPwm5Regs.AQCTLA.bit.CAU=AQ_CLEAR; //计数器(增加时)=比较器A时,输出low
EPwm5Regs.AQCTLA.bit.CAD=AQ_SET; //计数器(减小时)=比较器A时,输出high
// Set PWM2B
EPwm5Regs.AQCTLB.bit.CAU=AQ_SET; //计数器(增加时)=比较器A时,输出high
EPwm5Regs.AQCTLB.bit.CAD=AQ_CLEAR; //计数器(减小时)=比较器A时,输出low
//set Deadband
// Active Low PWMs - Setup Deadband
EPwm5Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
EPwm5Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //启用epwmxa,epwmxb互补对称,并且死区为低有效模式
EPwm5Regs.DBCTL.bit.IN_MODE = DBA_ALL; //这种模式实际上只需要epwmxb作为输入,即可产生带死区的两路xa,xb输出了
EPwm5Regs.DBRED = EPWMGD3_MIN_DB; //上升沿延时
EPwm5Regs.DBFED = EPWMGD3_MIN_DB; //下降沿延时
}
void SetupEPwmGD4(void) //by yb
{
//setup TB
EPwm6Regs.TBPRD = EPWMDC_PERIOD; //60k // Set timer period 50us
EPwm6Regs.TBPHS.half.TBPHS = EPWMDC_PERIOD; // Phase is 180
EPwm6Regs.TBCTR = 0x0000; // Clear counter
// Setup TBCTL
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // up-down count mode
EPwm6Regs.TBCTL.bit.PHSEN = TB_ENABLE; // slaver module
EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync down-stream module 移相角度从计数器为0时算起
EPwm6Regs.TBCTL.bit.PRDLD = TB_SHADOW; //变化TBPRD时,使用shadow寄存器(即当计数器为0时才更新)
EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1; //两个均直通,即计数器时钟为系统时钟
// Setup CMPCTL
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO
EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Setup CMP
EPwm6Regs.CMPA.half.CMPA = DCBDuty;
// Set actions
// Set PWM2A
EPwm6Regs.AQCTLA.bit.CAU=AQ_CLEAR; //计数器(增加时)=比较器A时,输出low
EPwm6Regs.AQCTLA.bit.CAD=AQ_SET; //计数器(减小时)=比较器A时,输出high
// Set PWM2B
EPwm6Regs.AQCTLB.bit.CAU=AQ_SET; //计数器(增加时)=比较器A时,输出high
EPwm6Regs.AQCTLB.bit.CAD=AQ_CLEAR; //计数器(减小时)=比较器A时,输出low
//set Deadband
// Active Low PWMs - Setup Deadband
EPwm6Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
EPwm6Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //启用epwmxa,epwmxb互补对称,并且死区为低有效模式
EPwm6Regs.DBCTL.bit.IN_MODE = DBA_ALL; //这种模式实际上只需要epwmxb作为输入,即可产生带死区的两路xa,xb输出了
EPwm6Regs.DBRED = EPWMGD4_MIN_DB; //上升沿延时
EPwm6Regs.DBFED = EPWMGD4_MIN_DB; //下降沿延时
}
void SetupEPwm(void) //by yb
{
//初始化epwm模块, epwm时钟为系统时钟
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; //启用epwm时钟同步,可以使所有epwm模块完美同步,不过必须按一定步骤,要先不启用,然后将每个epwm模块的tbctl配置成一致
EDIS;
//为了同步,必须将每个epwm模块的tbctl配置成一致
//DCDC
SetupEPwmGD1();
SetupEPwmGD2();
SetupEPwmGD3();
SetupEPwmGD4();
//DCAC
SetupEPwmUExample();
// SetupEPwmVExample(); //单极性倍频
SetupEPwmUOppExample(); //单相全桥
// SetupEPwmWExample(); //DA
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; //最后启用epwm时钟同步
EDIS;
}
//---------------------------------------------------------------------------
// Example: InitEPwmGpio:
//---------------------------------------------------------------------------
// This function initializes GPIO pins to function as ePWM pins
//
// Each GPIO pin can be configured as a GPIO pin or up to 3 different
// peripheral functional pins. By default all pins come up as GPIO
// inputs after reset.
//
void InitEPwmGpio(void)
{
InitEPwm1Gpio();
InitEPwm2Gpio();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?