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上的
TI中文支持网


