⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inv_isr.c

📁 SVPWM算法的DSP源码已通过硬件验证
💻 C
📖 第 1 页 / 共 2 页
字号:

       switch (PhaseSector.ulRegion)
		{
			case 0:
					EPwm1Regs.CMPA.half.CMPA = PhaseSector.uiV01;
					EPwm1Regs.CMPB = PhaseSector.uiV01;

					EPwm3Regs.CMPA.half.CMPA = PhaseSector.uiTi + PhaseSector.uiTj + PhaseSector.uiV01;
					EPwm3Regs.CMPB = PhaseSector.uiTi + PhaseSector.uiTj + PhaseSector.uiV01;

					EPwm2Regs.CMPA.half.CMPA = PhaseSector.uiTi + PhaseSector.uiV01 ;
					EPwm2Regs.CMPB = PhaseSector.uiTi + PhaseSector.uiV01;
					break;
			case 1:
					EPwm1Regs.CMPA.half.CMPA = PhaseSector.uiTj + PhaseSector.uiV01;
					EPwm1Regs.CMPB = PhaseSector.uiTj + PhaseSector.uiV01;

					EPwm2Regs.CMPA.half.CMPA = PhaseSector.uiV01;
					EPwm2Regs.CMPB = PhaseSector.uiV01;

					EPwm3Regs.CMPA.half.CMPA = PhaseSector.uiTi + PhaseSector.uiTj + PhaseSector.uiV01;
					EPwm3Regs.CMPB = PhaseSector.uiTi + PhaseSector.uiTj + PhaseSector.uiV01;
					break;
			case 2:
					EPwm2Regs.CMPA.half.CMPA = PhaseSector.uiV01;
					EPwm2Regs.CMPB = PhaseSector.uiV01;

					EPwm1Regs.CMPA.half.CMPA = PhaseSector.uiTi + PhaseSector.uiTj + PhaseSector.uiV01;
					EPwm1Regs.CMPB = PhaseSector.uiTi + PhaseSector.uiTj + PhaseSector.uiV01;

					EPwm3Regs.CMPA.half.CMPA = PhaseSector.uiTi + PhaseSector.uiV01;
					EPwm3Regs.CMPB = PhaseSector.uiTi + PhaseSector.uiV01;
					break;
			case 3:
					EPwm2Regs.CMPA.half.CMPA = PhaseSector.uiTj + PhaseSector.uiV01;
					EPwm2Regs.CMPB = PhaseSector.uiTj + PhaseSector.uiV01;

					EPwm3Regs.CMPA.half.CMPA = PhaseSector.uiV01;
					EPwm3Regs.CMPB = PhaseSector.uiV01;

					EPwm1Regs.CMPA.half.CMPA = PhaseSector.uiTi + PhaseSector.uiTj + PhaseSector.uiV01;
					EPwm1Regs.CMPB = PhaseSector.uiTi + PhaseSector.uiTj + PhaseSector.uiV01;
					break;
			case 4:
					EPwm3Regs.CMPA.half.CMPA =  PhaseSector.uiV01;
					EPwm3Regs.CMPB =  PhaseSector.uiV01;

					EPwm2Regs.CMPA.half.CMPA = PhaseSector.uiTi + PhaseSector.uiTj + PhaseSector.uiV01;
					EPwm2Regs.CMPB = PhaseSector.uiTi + PhaseSector.uiTj + PhaseSector.uiV01;

					EPwm1Regs.CMPA.half.CMPA = PhaseSector.uiTi + PhaseSector.uiV01;
					EPwm1Regs.CMPB = PhaseSector.uiTi+ PhaseSector.uiV01;
					break;
			case 5:
					EPwm3Regs.CMPA.half.CMPA = PhaseSector.uiTj + PhaseSector.uiV01;
					EPwm3Regs.CMPB = PhaseSector.uiTj + PhaseSector.uiV01;

					EPwm1Regs.CMPA.half.CMPA =  PhaseSector.uiV01;
					EPwm1Regs.CMPB =  PhaseSector.uiV01;

					EPwm2Regs.CMPA.half.CMPA = PhaseSector.uiTi + PhaseSector.uiTj + PhaseSector.uiV01;
					EPwm2Regs.CMPB = PhaseSector.uiTi + PhaseSector.uiTj + PhaseSector.uiV01;
					break;
			default:
					break;
	    }
	}
    // Clear INT flag for this timer
    EPwm1Regs.ETCLR.bit.INT = 1;

    // Acknowledge this interrupt to receive more interrupts from group 3
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}

interrupt void ecap4_isr(void)
{

  

  
 
   Gpio8_toggle;
   //-------------------------------------------------------------------------
  //同频同相子程序
  //----------------------------------------------
  
   if(uiECapTime1 == 0)
	{
		uiECapTime1 = uiFacSDCnt;
        uiECapTime2 = uiFacSDCnt;
		//PhaseSector.ulPhaseSum = 0;
		ulECapCnt1   = ECap4Regs.CAP1;
        
		
	}
	else 
	{   				
		uiECapTime = (Uint32)(uiFacSDCnt) - uiECapTime2;
        ulECapCnt = ECap4Regs.CAP1 - ulECapCnt1 ;
        ulECapCnt1 = ECap4Regs.CAP1;
	    
	    if((ulECapCnt > ECAP48HZ)||( ulECapCnt < ECAP52HZ )||(!uiPhaseOk))//旁路频率超限
		{   
		    uiPhaseOK = 0;
			//PhaseSector.ulPhaseSum = 0;
			OutputVar.uiTargetFreq = 5000;         //旁路频率回到5000HZ
            vInvCon(); 
        }                           //调节逆变频率到5000HZ
		else if(((PhaseSector.ulPhaseSum < 0xE100000) && (PhaseSector.ulPhaseSum >= 0xE060000))||(PhaseSector.ulPhaseSum < 0xA0000))//2度以内
	//	else if(((PhaseSector.ulPhaseSum < 0xD920000) && (PhaseSector.ulPhaseSum >= 0xD7E0000))||((PhaseSector.ulPhaseSum >0xD980000)&&(PhaseSector.ulPhaseSum < 0xDAC0000)))//2度以内
		{   
			OutputVar.uiTargetFreq = 10000000000 / ulECapCnt ;        
			uiPhaseOK = 1; 
			//PhaseSector.ulPhaseSum = 0x480000;
            PhaseSector.ulPhaseSum = 0;
			vInvCon(); 
		
								
		}
		else 
		{
			if((PhaseSector.ulPhaseSum < 0xE060000) && (PhaseSector.ulPhaseSum >=0xC4E0000))//// 旁路频率更新时,逆变频率滞后(逆变频率比市电频率小),则立即停止再发这一周期波形,而是发下一周期的波形,且将逆变频率往市电频率的趋势方向调整
			{   
				uiPhaseOK = 1;
				//PhaseSector.ulPhaseSum = 0x480000;
				PhaseSector.ulPhaseSum = 0;
				OutputVar.uiTargetFreq = 10000000000 / ulECapCnt ;

				//vInvCon(); 
				OutputVar.uiCurrFreq +=2;
				if(OutputVar.uiCurrFreq >= 5200)
				{
					OutputVar.uiCurrFreq = 5200;
				}
			PhaseSector.ulPhaseNew = (Uint32)OutputVar.uiCurrFreq * (Uint32)PhaseSector.uiCalDat / 4;


				
			}		
			else if((PhaseSector.ulPhaseSum < 0x1C20000) && (PhaseSector.ulPhaseSum >= 0xA0000))// 逆变频率超前(逆变频率比市电频率大),将逆变频率往市电频率的趋势方向调整	
		    {
				uiPhaseOK = 1;
			//	PhaseSector.ulPhaseSum  = 0;
				OutputVar.uiTargetFreq = 10000000000 / ulECapCnt;
				//vInvCon(); 
				OutputVar.uiCurrFreq -=2;
				if(OutputVar.uiCurrFreq <= 4800)
				{
					OutputVar.uiCurrFreq = 4800;
				}
				PhaseSector.ulPhaseNew = (Uint32)OutputVar.uiCurrFreq * (Uint32)PhaseSector.uiCalDat / 4;
			}
		    else
			{
				uiPhaseOK = 0;
			}
		
       }
        uiECapFlag++;
		if((uiECapFlag == 2)&&(ulECapCnt < ECAP48HZ)&&( ulECapCnt > ECAP52HZ )) //求市电有效值
  		{    
   			uiAvgSDW = (Uint16)(uiAddSDW / (Uint32)uiECapTime );
			uiAvgSDV = (Uint16)(uiAddSDV / (Uint32)uiECapTime );
			uiAvgSDU = (Uint16)(uiAddSDU / (Uint32)uiECapTime );
			uiRmsSDW = (Uint16)((uiAvgSDW * 75)>>7);
			uiRmsSDV = (Uint16)((uiAvgSDV * 75)>>7);
			uiRmsSDU = (Uint16)((uiAvgSDU * 75)>>7);
			uiRmsSDAvg = (Uint16)((((uiRmsSDV+ uiRmsSDW +uiRmsSDU) * 6)>>4)-10);
			uiAddSDW = 0;
			uiAddSDV = 0;
			uiAddSDU= 0;
			
			uiECapFlag = 1;
		
	    	uiFacSDCnt = 0;
			uiECapTime2 = 0;					
       }
	}
	
   ECap4Regs.ECCLR.bit.CEVT1 = 1;
   ECap4Regs.ECCLR.bit.INT = 1;
   ECap4Regs.ECCTL2.bit.REARM = 1;                           

   // Acknowledge this interrupt to receive more interrupts from group 4
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}


/*interrupt void ecap4_isr(void)
{
    
	
	//DelayUs(2);	
					// delay 2uS

	//GpioDataRegs.GPATOGGLE.bit.GPIO30 = 1;

   Gpio8_toggle;
  //-------------------------------------------------------------------------
 //同频同相子程序
  //----------------------------------------------
  
    if(uiECapTime1 == 0)
	{
		uiECapTime1 = uiFacSDCnt;
        uiECapTime2 = uiFacSDCnt;
       //PhaseSector.ulPhaseSum = 0x00;
		
	}
	else 
	{   
		
		
		uiECapTime = (Uint32)(uiFacSDCnt) - uiECapTime2;

		if(307 < uiECapTime < 334)  //307*62.5/100000 =1/52;
		{   
		    
		//	uiPhaseCnt++;
				
			uiTmpC1 = (Uint16)((Uint32)(1600000) / uiECapTime); //市电频率4800~5200
           	OutputVar.uiTargetFreq = uiTmpC1;
            //if(uiPhaseCnt >= 20)
		   // {   
		    //	uiPhaseCnt = 0;
				if(((PhaseSector.ulPhaseSum < 0xE100000) && (PhaseSector.ulPhaseSum >= 0xDFC0000))||(PhaseSector.ulPhaseSum < 0x140000))
				{   
			        
				//PhaseSector.ulPhaseSum = 0x00; 
					uiPhaseOk = 0;
									//旁路频率更新时,逆变在过零点附近,可以免调同频同相
				}
				else if((PhaseSector.ulPhaseSum < 0xDFC0000) && (PhaseSector.ulPhaseSum >= 0xC4E0000)) //逆变秃螅

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -