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的频率,这点代码量不至于大于中断的时间吧,谢谢!