TI中文支持网
TI专业的中文技术问题搜集分享网站

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

Part Number:TMS320F28027Other 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 registersPieVectTable.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 INCF0x45, fif( public_var.isr_cnt&0x04 )// 0x45, 02		; 4 次{public_var.isr_cnt=0x00;//;复位 50us*4 = 200us++usr_tim_var.T0_us_cnt; // INCF0x2E, f		;每

200us 加一++usr_tim_var.cnt200us_1;//INCFcnt200us_1, f}if( public_var.isr_cnt&0x01 )	 {  ////BTFSS0x45, 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; // 死区设置 TBCLKs6US---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; // 死区设置 TBCLKs6US----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 moduleEALLOW;
//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的频率,这点代码量不至于大于中断的时间吧,谢谢!

Green Deng:

看了一下,有下面几个疑问:

1、有没有测试过BubbleSort程序总共花费了多少执行时间?

2、

jun liu 说:PWM2和PWM3均已20KHZ,但PWM2会作为PWM3的同步输入 这样PWM3的频率就变成50HZ

这里,20KHz核50Hz是什么关系?

3、

jun liu 说:发现PWM2的频率还是对的PWM3的频率变为10HZ

这里又没看懂。。。

,

jun liu:

PWM2和PWM3均配置成20KHZ,但PWM3的CMPA数值为1,PWM2的是PWM3的同步输入源,在工频的一半周期两者的AQ动作一直,PWM3保持为高电平,在另一半周期AQ的动作和前半周期相反,这样PWM3输出的波形就是50HZ,但加了排序BubbleSort函数就导致PWM3形成的波周期变了

,

jun liu:

BubbleSort程序总共花费了多少执行时间  这个怎么看时间?

,

Green Deng:

额。。。抱歉,我找了一下我的其他同事看这个问题描述,结果我们都没看明白。。。

执行时间的话可以参考这个FAQ的方法:e2echina.ti.com/…/652278

,

jun liu:

你可以验证一下powerSUITE的powerSUITE Solution Adapter下DC-AC模块下中的Single Phase Inverter: Voltage Source TIDM-HV-1PH-DCAC的voltageSourceInverterLCFltr_F28004x代码,我是拿这个代码做参考移植到TMS320F28027上的 

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28027: 目前在做UPS调试到DC-AC部分,发现有个奇怪的现象
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1