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上的