This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28027: 目前在做UPS调试到DC-AC部分,发现有个奇怪的现象

Part Number: TMS320F28027
Other Parts Discussed in Thread: POWERSUITE, TIDM-HV-1PH-DCAC,

现象如下:

1.我是PWM2和PWM3均已20KHZ,但PWM2会作为PWM3的同步输入 这样PWM3的频率就变成50HZ

PWM2采取的中断程序,但我在PWM的中断里面只调用一次冒泡函数,发现PWM2的频率还是对的PWM3的频率变为10HZ,这是为什么?

我并没有改变PWM3的设置?难道影响了PWM2的中断执行?就简单的冒泡函数不至于影响这么大吧,谢谢!

冒泡函数如下:

void BubbleSort(uint16_t a[],uint16_t n){
uint8_t t,i,j;

for( i=0;i<n-1;i++){
for(j=n-1;j>i;j--){
if(a[j-1]>a[j]){
t=a[j-1];
a[j-1]=a[j];
a[j]=t;
}
}
}
}

其中PWM代码如下

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
#include "HK_all_include.h"
#include "stdlib.h"
volatile struct SPWM_VAR spwm_var;
PIDType pid;

uint16_t Axis_Flag=0;
uint16_t invSine_cnt=0;
uint16_t spwm_table_cnt=0;
uint32_t D400TOGGLE_cnt=0;
uint16_t spwm_cnt=0;
uint16_t spwm_flg=0;
uint16_t Modul_factor;

#pragma CODE_SECTION(epwm2_isr, "ramfuncs");
#pragma CODE_SECTION(detectZeroCrossingClearPWMTrip , "ramfuncs");
#pragma CODE_SECTION(updateInverterPWM, "ramfuncs");
#pragma DATA_SECTION (Spwm_table,".cio");
//#pragma DATA_SECTION (invVo_L1Val,".cio");
//#pragma DATA_SECTION (invVo_L2Val,".cio");
//#pragma DATA_SECTION (invIo_L1Val,".cio");
//#pragma DATA_SECTION (inv_Io_L1Val,".cio");
//#pragma DATA_SECTION (inv_Io_L2Val,".cio");
//#pragma DATA_SECTION (inv_Vo_L2Val,".cio");
volatile uint16_t  inv_AD_cnt = 0;
//volatile uint16_t  inv_AD_Val[200]={0};//ADC 采样结果
//volatile uint16_t  inv_Vo_L2Val[200]={0};//ADC 采样结果
//volatile uint16_t  inv_Io_L1Val[200]={0};//ADC 采样结果
//volatile uint16_t  inv_Io_L2Val[200]={0};//ADC 采样结果
//volatile uint16_t  invVo_L1Val = 0;//ADC 采样结果
//volatile uint16_t  invVo_L2Val = 0;//ADC 采样结果
//volatile uint16_t  invIo_L1Val = 0;//ADC 采样结果
//volatile uint16_t  invIo_L2Val = 0;//ADC 采样结果
uint16_t Spwm_Vo_Val[Sort_N]={0};
uint16_t Spwm_Io_Val[Sort_N]={0};
uint16_t Spwm_table[200]=

{1476,1452,1429,1405,1382,1358,1335,1312,1288,1265,1242,1218,1195,1172,1149,1126,1104

,1081,1058,1036,1014,991,969,947,925,904,882,861,840,819,798,777,756,736,716,696,676,

656,637,618,599,580,562,543,525,508,490,473,456,439,422,406,390,374,359,344,329,314,3

00,286,272,259,246,233,221,208,197,185,174,163,152,142,132,123,114,105,96,88,80,73,66

,59,53,47,41,36,31,26,22,18,14,11,9,6,4,2,1,0,0,0,0,0,1,2,4,6,9,11,14,18,22,26,31,36,

41,47,53,59,66,73,80,88,96,105,114,123,132,142,152,163,174,185,197,208,221,233,246,25

9,272,286,300,314,329,344,359,374,390,406,422,439,456,473,490,508,525,543,562,580,599

,618,637,656,676,696,716,736,756,777,798,819,840,861,882,904,925,947,969,991,1014,103

6,1058,1081,1104,1126,1149,1172,1195,1218,1242,1265,1288,1311,1335,1358,1382,1405,142

9,1452,1476,1499};
//uint16_t Spwm_table[98]=

{1524,1524,1524,1518,1512,1500,1494,1482,1470,1458,1440,1422,1404,1386,1362,1344,1320

,1290,1266,1236,1206,1176,1146,1116,1080,1044,1008,972,930,894,852,810,768,726,684,64

2,594,552,504,456,408,366,318,270,222,168,120,72,24,24,72,120,168,222,270,318,366,408

,456,504,552,594,642,684,726,768,810,852,894,930,972,1008,1044,1080,1116,1146,1176,12

06,1236,1266,1290,1320,1344,1362,1386,1404,1422,1440,1458,1470,1482,1494,1500,1512,15

18,1524,1524,1524};

__interrupt void  epwm2_isr(void);
void  EPwm2_Configution(void);
void  EPwm3_Configution(void);
void  EPwm4_Configution(void);

//PWM 初始化函数
//pwm 20K 频率,中央对其PWM模式(即计数器增减模式)
//配置GPIO6 GPIO7 为 PWM4A PWM4B功能引脚, 注意D400 D401占用该2个IO口,故LED的IO控制在该

例程暂停使用
//PWM4触发AINB组ADC采样(硬件配置:开发板左上角的J4跳线帽靠左侧短接,提供可调电阻输出到

AINB3接口)
//PWM4B触发AINB组的ADC采样
//-----------------------------------------------
void InitEPWM_AQ_DB(void)
{
	//配置GPIO2 GPIO3 为 PWM2A PWM2B功能引脚
	InitEPwm2Gpio();
	//配置GPIO4 GPIO5 为 PWM3A PWM3B功能引脚
    InitEPwm3Gpio();
    //配置GPIO6 GPIO7 为 PWM4A PWM4B功能引脚
//    InitEPwm4Gpio();

    disablePWMCLKCounting();
    // Enable TZ1 and TZ2 as one shot trip sources

	EPwm2_Configution();
	EPwm3_Configution();
//	EPwm4_Configution();

	spwm_var.EPwm2_EN=0;
	spwm_var.EPwm2_flg=0;
	spwm_var.EPwm2_Postive_START=0;
	spwm_var.EPwm2_Postive_END=0;
	spwm_var.EPwm2_Negative_START=0;
	spwm_var.EPwm2_Negative_END=0;
	spwm_var.EPwm2_Sin_cnt=0;
	spwm_var.EPwm4_EN=1;
	spwm_var.EPwm4_Postive_START=1;
	spwm_var.EPwm4_Negative_START=0;
	spwm_var.EPwm4_Negative_END=0;
	spwm_var.EPwm4_flg=0;
	spwm_var.EPwm4_Sin_cnt=0;

    EALLOW;  // This is needed to write to EALLOW protected registers
    PieVectTable.EPWM2_INT = &epwm2_isr;
    EDIS;
    EALLOW;
    EPwm2Regs.CMPB=EPwm2Regs.TBPRD-25;
	// Interrupt where we will change the Compare Values
	

EPwm2Regs.ETSEL.bit.INTSEL=ET_CTRD_CMPB;///ET_CTR_PRD;//ET_CTR_ZERO;//ET_CTRD_CMPA;//

ET_CTR_PRD;//ET_CTRD_CMPB
	EPwm2Regs.ETSEL.bit.INTEN = 1;
	EPwm2Regs.ETPS.bit.INTPRD = ET_1ST;
	EPwm2Regs.ETCLR.bit.INT= 1;

	EPwm2Regs.ETSEL.bit.SOCAEN	= 1;		// Enable SOC on B group  B通

道触发
	EPwm2Regs.ETSEL.bit.SOCASEL	= ET_CTR_PRD;//在周期达到时进行ADC的触发,即为

中央对其模式的顶端进行ADC的触发采样
	EPwm2Regs.ETPS.bit.SOCAPRD 	= 1;
	EDIS;

//  enablePWMCLKCounting();
}

//volatile uint16_t  inv_AD_cnt = 0;
//volatile uint16_t  invVo_L1Val[200]={0};//ADC 采样结果
//volatile uint16_t  invVo_L2Val[200]={0};//ADC 采样结果
//volatile uint16_t  invIo_L1Val[200]={0};//ADC 采样结果
//volatile uint16_t  invIo_L2Val[200]={0};//ADC 采样结果
//uint32_t total_cnt = 0;
uint16_t inv_Vo_max = 0;
uint16_t inv_Vo[5] = {0};
__interrupt void  epwm2_isr(void){
//	char ii=0;

	inv_var.inv_VbusInst=AdcResult.ADCRESULT4+AdcResult.ADCRESULT5;	//if

(public_bit_var.bat_unusual==1)//	0x3C      , 06电池异常

	if(TZ_flg == 0)	{
		if( spwm_table_cnt == 0 )
			inv_Vo_max = 0;
		if((usr_flg.inv_sin_cnt>=2)&&(usr_flg.inv_sin_cnt<=SPWM_PERIOD_CNT))	

{
 		      if((spwm_table_cnt>=85)&&(spwm_table_cnt<=115)){
				Spwm_Vo_Val[spwm_table_cnt-85]   =  abs

(AdcResult.ADCRESULT1-AdcResult.ADCRESULT3);
				Spwm_Io_Val[spwm_table_cnt-85]   =  abs

(AdcResult.ADCRESULT0-AdcResult.ADCRESULT2);
//				 BubbleSort(Spwm_Vo_Val,31);	//merge_sort

(Spwm_Vo_Val, 0, Sort_N-1);//从大到小排列
		     }
	     }
	}



	 ++public_var.isr_cnt;//0x45 INCF    0x45      , f
	 if( public_var.isr_cnt&0x04 )// 0x45      , 02		; 4 次
	 {
		 public_var.isr_cnt=0x00;//;复位 50us*4 = 200us
		 ++usr_tim_var.T0_us_cnt; // INCF    0x2E      , f		;每

200us 加一
		 ++usr_tim_var.cnt200us_1;//            INCF    cnt200us_1      , f
	 }

	 if( public_var.isr_cnt&0x01 )	 {  ////BTFSS   0x45      , 00		;四个

AD采样函数

         switch(usr_flg.ad_cnt)
         {
			case 0x01:
				

AD_sampl.AD_SAM_CTLREG.bit.ADL_input_flg=1;//ADL_input();
				break;
			case 0x02:
//				ADL__output();
				break;
			case 0x04:
//				ADL_loader();
				break;
			case 0x08:
//				ADL_battery();
				break;
         }

	   if((usr_flg.ad_cnt&=0x0E)==0x00)
			 usr_flg.ad_cnt=0x01;

	 }

	if(usr_flg.USR_CTRL.bit.normal_state == 0)	{
		 public_var.pwm_val_tmp = 0xD9;
		detectZeroCrossingClearPWMTrip(INV_PWM2_BASE,INV_PWM3_BASE);
		updateInverterPWM(INV_PWM2_BASE,INV_PWM3_BASE,Spwm_table

[spwm_table_cnt++]);
	}

//   if(D400TOGGLE_cnt++>10000)
   {
	   D400TOGGLE_cnt=0;
       D600TOGGLE();
   }
    EPwm2Regs.ETCLR.bit.INT = 1;        //写1对ETFLG[INT]状态标志位清零,从而能进行下一

次中断
    PieCtrlRegs.PIEACK.all=PIEACK_GROUP3;
}



void  EPwm2_Configution(void)
 {

	   //
	    EALLOW;
	    EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
	    EPwm2Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
	    EDIS;

		EALLOW;
		EPwm2Regs.DBCTL.bit.HALFCYCLE=0;
		EPwm2Regs.TBPRD = 1500;	   //频率19.6k
		EPwm2Regs.CMPA.half.CMPA = 0; //占空比
		EPwm2Regs.CMPB=0;//省去死区功能后的添加的
		EPwm2Regs.TBPHS.half.TBPHS =0x0000;//120; //0x0000;            // 

Phase is 0
		EPwm2Regs.TBCTR = 0x0000;                       // Clear counter
	//			EPwm2Regs.CMPB= 0x0000;
		//对其模式PWM频率计算    T_PWM =2 x TBPRD x T_TBCLK
		EPwm2Regs.TBCTL.bit.PRDLD=TB_SHADOW;
		EPwm2Regs.TBCTL.bit.CTRMODE =TB_COUNT_UPDOWN;//TB_COUNT_UP; // 

TB_COUNT_UPDOWN;//TB_COUNT_UP; // Count up down 中央对其模式
		EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;  //TB_ENABLE;//TB_DISABLE;    

    // Disable phase loading
		EPwm2Regs.TBCTL.bit.SYNCOSEL = 

TB_CTR_ZERO;//TB_SYNC_DISABLE;//TB_CTR_ZERO;
		EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to 

SYSCLKOUT;
		EPwm2Regs.TBCTL.bit.CLKDIV =    TB_DIV1;
		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;

		//见P54 ----->Figure 31. Configuration Options for the Dead-Band 

Submodule
		//这里采用CPMA做源,PWMxB的输出是PWMxA的取反
		EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;        //S5 = 0; S4 = 0
		EPwm2Regs.DBCTL.bit.OUT_MODE 

=DB_FULL_ENABLE;//0x00;//DB_DISABLE;//DB_FULL_ENABLE;// DB_DISABLE;//DB_FULL_ENABLE;	

//S1 = 1; S0 = 1
		EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; 		//S3 = 1; S2 

= 0

		//设置PWM输出极性,当TB计数到达CMPA时,PWM输出的高低电平确定
		EPwm2Regs.AQCTLA.all=0x00;
	//	EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//AQ_CLEAR;//AQ_SET;  当计数值达到

CMPA时PWM模块的动作
	//	EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;// 

AQ_TOGGLE;//AQ_CLEAR;//AQ_NO_ACTION;//AQ_CLEAR;  本程序只有CAU并无CAD除非是中央对齐模

式
	// 	EPwm2Regs.AQCTLA.bit.ZRO = 

AQ_CLEAR;//AQ_CLEAR;//AQ_TOGGLE;//AQ_CLEAR;  自己添加
		//P57 设置死区, 互补模式下,需要设置死区
		EPwm2Regs.DBFED = 60; // 死区设置 TBCLKs   6US---360
		EPwm2Regs.DBRED = 60; //

		EDIS;

 }

void  EPwm3_Configution(void)
 {
	     EALLOW;
	     EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
	     EPwm3Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
	 //    EPwm3Regs.TZFRC.bit.OST = 1;
	 //    EPwm3Regs.TZFRC.bit.CBC = 1;
	     EDIS;

	 	EALLOW;
	 	EPwm3Regs.DBCTL.bit.HALFCYCLE=0;
	 	EPwm3Regs.TBPRD = 1500;	   //频率19.6k
	 	EPwm3Regs.CMPA.half.CMPA = 0; //占空比
	 	EPwm3Regs.CMPB=0;//省去死区功能后的添加的
	 //	EPwm3Regs.TBPHS.half.TBPHS =0x0001;//120; //0x0000;            // 

Phase is 0
	 	EPwm3Regs.TBCTR = 0x0000;                       // Clear counter
	 //			EPwm2Regs.CMPB= 0x0000;
	 	//对其模式PWM频率计算    T_PWM =2 x TBPRD x T_TBCLK
	 	EPwm3Regs.TBCTL.bit.PRDLD=TB_SHADOW;
	 	EPwm3Regs.TBCTL.bit.CTRMODE =TB_COUNT_UPDOWN;//TB_COUNT_UP; // 

TB_COUNT_UPDOWN;//TB_COUNT_UP; // Count up down 中央对其模式
	 	EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;
	 	EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
	 	EPwm3Regs.TBCTL.bit.PHSDIR =TB_UP;
	 	EPwm3Regs.TBPHS.half.TBPHS =0x0001;
	 	EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to 

SYSCLKOUT;
	 	EPwm3Regs.TBCTL.bit.CLKDIV =    TB_DIV1;
	 	EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE;//CC_SHADOW;
	 //	EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
	 //	EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
	 //	EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

	 	//见P54 ----->Figure 31. Configuration Options for the Dead-Band 

Submodule
	 	//这里采用CPMA做源,PWMxB的输出是PWMxA的取反
	 	EPwm3Regs.DBCTL.bit.IN_MODE = DBA_ALL;        //S5 = 0; S4 = 0
	 	EPwm3Regs.DBCTL.bit.OUT_MODE 

=DB_FULL_ENABLE;//0x00;//DB_DISABLE;//DB_FULL_ENABLE;// DB_DISABLE;//DB_FULL_ENABLE;	

//S1 = 1; S0 = 1
	 	EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; 		//S3 = 1; S2 

= 0
	 	EPwm3Regs.AQCTLA.all=0x00;
	 	//设置PWM输出极性,当TB计数到达CMPA时,PWM输出的高低电平确定
	 //	EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;//AQ_CLEAR;//AQ_SET;  当计数值达到

CMPA时PWM模块的动作
	  	EPwm3Regs.AQCTLA.bit.CAD = 

AQ_CLEAR;//AQ_TOGGLE;//AQ_CLEAR;//AQ_NO_ACTION;//AQ_CLEAR;  本程序只有CAU并无CAD除非是

中央对齐模式
	 ////	EPwm2Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;//AQ_SET;  当计数值达到CMPA时

PWM模块的动作
	 ////	EPwm2Regs.AQCTLA.bit.CBD = AQ_NO_ACTION;//AQ_CLEAR;  本程序只有CAU并无

CAD除非是中央对齐模式
	 // 	EPwm3Regs.AQCTLA.bit.ZRO = AQ_CLEAR;//AQ_TOGGLE;//AQ_CLEAR;  自己添加

	 	//P57 设置死区, 互补模式下,需要设置死区
	 	EPwm3Regs.DBFED = 60; // 死区设置 TBCLKs   6US----360
	 	EPwm3Regs.DBRED = 60; //

	 	EDIS;
 }

void  EPwm4_Configution(void)
 {
	    EALLOW;
	    EPwm4Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
	    EPwm4Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
	    EDIS;

		EALLOW;
		EPwm4Regs.DBCTL.bit.HALFCYCLE=0;
		EPwm4Regs.TBPRD = 600;	   //频率19.6k
		EPwm4Regs.CMPA.half.CMPA = 0; //占空比
	//	EPwm4Regs.CMPB=0;//省去死区功能后的添加的
		EPwm4Regs.TBPHS.half.TBPHS =0x0000;//120; //0x0000;            // 

Phase is 0
		EPwm4Regs.TBCTR = 0x0000;                       // Clear counter
	//			EPwm2Regs.CMPB= 0x0000;
		//对其模式PWM频率计算    T_PWM =2 x TBPRD x T_TBCLK
	//	EPwm4Regs.TBCTL.bit.PRDLD=TB_SHADOW;
		EPwm4Regs.TBCTL.bit.CTRMODE =TB_COUNT_UPDOWN;//TB_COUNT_UP; // 

TB_COUNT_UPDOWN;//TB_COUNT_UP; // Count up down 中央对其模式
		EPwm4Regs.TBCTL.bit.PHSEN = TB_DISABLE;  //TB_ENABLE;//TB_DISABLE;    

    // Disable phase loading
		EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
		EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to 

SYSCLKOUT;
		EPwm4Regs.TBCTL.bit.CLKDIV =    TB_DIV1;
		EPwm4Regs.CMPCTL.bit.SHDWAMODE = 

CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW;
	 	EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
		EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
	 	EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

		//见P54 ----->Figure 31. Configuration Options for the Dead-Band 

Submodule
		//这里采用CPMA做源,PWMxB的输出是PWMxA的取反
		EPwm4Regs.DBCTL.bit.IN_MODE = DBA_ALL;        //S5 = 0; S4 = 0
		EPwm4Regs.DBCTL.bit.OUT_MODE 

=DB_FULL_ENABLE;//0x00;//DB_DISABLE;//DB_FULL_ENABLE;// DB_DISABLE;//DB_FULL_ENABLE;	

//S1 = 1; S0 = 1
		EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; 		//S3 = 1; S2 

= 0

		//设置PWM输出极性,当TB计数到达CMPA时,PWM输出的高低电平确定
		EPwm4Regs.AQCTLA.bit.CAU = AQ_SET;//AQ_CLEAR;//AQ_SET;  当计数值达到

CMPA时PWM模块的动作
		EPwm4Regs.AQCTLA.bit.CAD = 

AQ_TOGGLE;//AQ_CLEAR;//AQ_NO_ACTION;//AQ_CLEAR;  本程序只有CAU并无CAD除非是中央对齐模

式
	 	EPwm4Regs.AQCTLA.bit.ZRO = AQ_CLEAR;//AQ_TOGGLE;//AQ_CLEAR;  自己添加
		//P57 设置死区, 互补模式下,需要设置死区
		EPwm4Regs.DBFED = 120; // 死区设置 TBCLKs
		EPwm4Regs.DBRED = 120; //

		EDIS;
 }

void setupmyBoardProtection(void)
{
	// Enable trip code
	//enableTRIP(INV_PWM1_BASE);
	//enableTRIP(INV_PWM2_BASE);

	//EPwm2Regs.TZSEL.bit.CBC6=TZ_ENABLE;// Emulator Stop
	//EPwm3Regs.TZSEL.bit.CBC6=TZ_ENABLE;// Emulator Stop

	//
	// TZA events can force EPWMxA
	// TZB events can force EPWMxB
	//
	EALLOW;
	EPwm2Regs.TZCTL.bit.TZA=TZ_FORCE_LO;
	EPwm2Regs.TZCTL.bit.TZB=TZ_FORCE_LO;
	EPwm3Regs.TZCTL.bit.TZA=TZ_FORCE_LO;
	EPwm3Regs.TZCTL.bit.TZB=TZ_FORCE_LO;
	EPwm2Regs.TZCLR.bit.OST=1;
	EPwm3Regs.TZCLR.bit.OST=1;
	EPwm2Regs.TZFRC.bit.OST=1;
	EPwm3Regs.TZFRC.bit.OST=1;
	EDIS;
}

uint16_t spwm_cnt1=0;
uint8_t TZ_flg=0;
void detectZeroCrossingClearPWMTrip(uint32_t base1, uint32_t base2)
{

// 	if( public_bit_var.isr_loop_flg  == 1 )
// 	    readCurrVolADCSignals( inv_AD_Val, inv_Vo_L2Val,&invIo_L1Val,&invIo_L1Val 

);
	if(spwm_table_cnt>=200)
	{
		spwm_table_cnt=0;
		Axis_Flag=(Axis_Flag+1)%2;
		inv_var.zeroCrossDetectFlag = 1;//过零点
		usr_flg.inv_sin_cnt++;
		 if(++spwm_cnt1>=2){
			 spwm_cnt1 = 0;
		   public_bit_var.output_end_flg = 1;
		 }
		 if(usr_flg.inv_sin_cnt == 1)
			 public_bit_var.isr_loop_flg  = 1;
		 if(usr_flg.inv_sin_cnt>=SPWM_PERIOD_CNT)//11(发波11-1=10/2)则是5个

周期   101 为50个周期 11到12周期波变了 此外调制比改为0.6的波形也很差
		 {
			usr_flg.inv_sin_cnt=SPWM_PERIOD_CNT;
			EALLOW;
			TZ_flg = 1;
			EPwm2Regs.TZFRC.bit.OST=1;
			EPwm3Regs.TZFRC.bit.OST=1;
			EDIS;
		 }

//		if (((usr_flg.inv_sin_cnt>=21)&&(usr_flg.inv_sin_cnt<=2021))||

((usr_flg.inv_sin_cnt>=2041)&&(usr_flg.inv_sin_cnt<=4041))||

((usr_flg.inv_sin_cnt>=4061)&&(usr_flg.inv_sin_cnt<=6061)))
//		{
//
//			if(usr_flg.inv_sin_cnt>=6061)
//				usr_flg.inv_sin_cnt=6061;
//			TZ_flg=1;
//			EALLOW;
//			EPwm2Regs.TZFRC.bit.OST=1;
//			EPwm3Regs.TZFRC.bit.OST=1;
//			EDIS;
//		}
//		else {
//			if(TZ_flg)
//			{
//			EALLOW;
//			EPwm2Regs.TZCLR.bit.OST=1;
//			EPwm3Regs.TZCLR.bit.OST=1;
//			EDIS;
//			TZ_flg =0;
//			}
//		}


	}
	else
	{
		inv_var.zeroCrossDetectFlag = 0;
	}
//    if((invSinePrev <= (float32)(0.00)) && (invSine > (float32)(0.00)))
//    {
//        zeroCrossDetectFlag = 1;//过零点
//    }
//    else
//    {
//        zeroCrossDetectFlag = 0;
//    }


	if( inv_var.clearInvTrip == 1 &&  inv_var.zeroCrossDetectFlag == 1  )// if( 

zeroCrossDetectFlag == 1)//if(clearInvTrip == 1 && zeroCrossDetectFlag == 1)//if( 

inv_var.clearInvTrip == 1 &&  inv_var.zeroCrossDetectFlag == 1 && spwm_cnt1 >= 21)// 

if( zeroCrossDetectFlag == 1)//if(clearInvTrip == 1 && zeroCrossDetectFlag == 1)
    {
        //
        // clear all the configured trip sources for the PWM module
        EALLOW;
//        if(EPwm2Regs.TZFLG.bit.OST == 1)
//         EPwm2Regs.TZCLR.bit.OST=1;
//        if(EPwm3Regs.TZFLG.bit.OST == 1)
//         EPwm3Regs.TZCLR.bit.OST=1;
//        if(EPwm2Regs.TZFLG.bit.CBC == 1)
//         EPwm2Regs.TZCLR.bit.CBC=1;
//        if(EPwm3Regs.TZFLG.bit.CBC == 1)
//         EPwm3Regs.TZCLR.bit.CBC=1;


			EPwm2Regs.TZCLR.bit.OST=1;
			EPwm3Regs.TZCLR.bit.OST=1;
			EPwm2Regs.TZCLR.bit.CBC=1;
			EPwm3Regs.TZCLR.bit.CBC=1;
//        EPWM_clearTripZoneFlag(base1, EPWM_TZ_FLAG_DCAEVT1);
//        EPWM_clearTripZoneFlag(base2, EPWM_TZ_FLAG_DCAEVT1);
        EDIS;

        inv_var.clearInvTrip = 0;
        inv_var.closeILoopInv = 1;
    }
//	JTAGDEBUG
//    if(invSinePrev < -0.95f && invSine > -0.95f)
//    {
//        if(rlyConnect == 1)
//        {
//            closeRelay();
//        }
//    }
//
//    if(rlyConnect == 0)
//    {
//        openRelay();
//        invVoRef = 0;
//        invIiRef = 0;
//    }

 //   invSinePrev = invSine;
}
uint16_t PWM_duty_cnt=0;

//static void updateInverterPWM(uint32_t base1, uint32_t base2,
//                                     _iq duty)
static void updateInverterPWM(uint32_t base1, uint32_t base2,
		                                        uint16_t duty)
{
    uint16_t invDuty;

	  invDuty  =  (uint16_t)((uint32_t)((uint32_t)duty * (uint32_t)

public_var.pwm_val_tmp)>>8) ;
	  invDuty +=  (uint16_t)((uint32_t)(1500*(uint32_t)(0x100-

public_var.pwm_val_tmp))>>8);

//       invDuty=  duty;

    if(invDuty==EPwm2Regs.TBPRD)//
    {
        invDuty=invDuty-1;
    }
// 	if((spwm_table_cnt>=40)&&(spwm_table_cnt<=170 ))
//    if(invDuty>=1380)
//    	invDuty =1360;
//    if(invDuty<=120)
//    	invDuty =125;

   EPwm2Regs.CMPA.half.CMPA=invDuty;
   EPwm3Regs.CMPA.half.CMPA=1;

     if(Axis_Flag==0)//正半轴
    {
		// CTR = CMPA@UP , set to 1
		EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;
		// CTR = CMPA@Down , toggle
		EPwm2Regs.AQCTLA.bit.CAD= AQ_TOGGLE	;
		// CTR=0, clear to 0
		EPwm2Regs.AQCTLA.bit.ZRO= AQ_CLEAR;
		// CTR = CMPA@Down , clear
		EPwm3Regs.AQCTLA.bit.CAD= AQ_CLEAR;
    }
    else    {
		// CTR = CMPA@UP , clear to 0
		EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
		   // CTR = CMPA@Down , toggle
		EPwm2Regs.AQCTLA.bit.CAD= AQ_TOGGLE	;
		// CTR=0, set to 1
		EPwm2Regs.AQCTLA.bit.ZRO= AQ_SET;
		// CTR = CMPA@Down , set
		EPwm3Regs.AQCTLA.bit.CAD= AQ_SET;

    }

}

//EPwm2Regs.TZFLG.bit.OST
//EPwm2Regs.TZFLG.bit.CBC

//TODO disablePWMCLKCounting
void disablePWMCLKCounting(void)//
{
	EALLOW;
	SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC =0;
	EDIS;
}

//TODO enablePWMCLKCounting
void enablePWMCLKCounting(void)
{
	EALLOW;
	SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC =1;
	EDIS;
}

 

/**冒泡排序改进型*/
void BubbleSort(uint16_t a[],uint16_t n){
		 uint8_t t,i,j;

		for( i=0;i<n-1;i++){
			for(j=n-1;j>i;j--){
					if(a[j-1]>a[j]){
						t=a[j-1];
						a[j-1]=a[j];
						a[j]=t;
					}
			}
		}
}
 
 




 

把BubbleSort(Spwm_Vo_Val,31);去掉就可以了,难道是影响中断了?这样导致中断里面语句执行时间大于中断50us的时间,我才用的是60MHZ的频率,这点代码量不至于大于中断的时间吧,谢谢!