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 + -
显示快捷键?