大家好
我正在生成一个交流波形、但在每个周期中错过了一个精确的 PWM (100kHz 是开关频率、60Hz 是交流周期);是否有人面临同样的问题。
如果您需要有关波形的其他信息、请告诉我。
此致
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.
大家好
我正在生成一个交流波形、但在每个周期中错过了一个精确的 PWM (100kHz 是开关频率、60Hz 是交流周期);是否有人面临同样的问题。
如果您需要有关波形的其他信息、请告诉我。
此致
感谢您的回复、
下面是我获得的代码和 PWM 波形:
随附代码和图片:
中断 void adca1_ISR (void)
{
V2pk = 50;
del theta=((0xFFFF)*Freq*500*(0.00000001));
Theta=theta+del_theta;
v2_ref[2]=(int16_t) V2pk*(cos ((float) theta*0.000095875);//(2*PI)/65535 = 0.0000958751
如果(theta=65535)
{
Theta=0;
}
如果(V2_ref[2]<0)
{
VSEC_ref[2]=-V2_ref[2];
}
其他
VSEC_ref[2]= V2_ref[2];
//次级直流链路电压感测
VIN[2]=(0.08319*(AdcaResultRegs.ADCRESULT2);
VIN[0]=(Vin[0]+Vin[1]+Vin[2])/3;
VIN[1]=Vin[2];
/* IF (Vin[0]<41)
{
V[2]=Vin[0]-0.1161*Vin[0]*Vin[0]+13.357*Vin[0]-363.01;
}
否则,如果(Vin[0]>41 && Vin[0]<80.4)
V[2]= Vin[0]- 8;
否则,如果(Vin[0]>80.4 && Vin[0]<101)
V[2]=Vin[0]+0.4202*Vin[0]-44.128;
否则*/
V[2]= Vin[0];
//
//电压环路1
V2dc_cnt_in[2]= VSEC_ref[2]-VI[2];//-VI[2];
v2dc_cnnt_out[2]=v2dc_cnt_out[1]+((Kp_v2dc + Ki_v2dc*TS/2)* v2dc_cn_in[2]+(Ki_v2dc*TS/2 - Kp_v2dc)* v2dc_cn_in[1];
if (V2dc_cnt_out[2]>1.2)// 0.075
V2dc_cnt_out[2]=1.2;
IF (V2dc_cnt_out[2]<-0.2)// 0.075
v2dc_cnt_out[2]=-0.2;
phi2=V2dc_cnt_out[2];
v2dc_cnnt_in[1]=v2dc_cnnt_in[2];
v2dc_cnt_out[1]= v2dc_cnt_out[2];
Vi[1]=Vi[2];
/*if (VSEC_ref[2]<100)
{
如果(V2_ref[2]<0)
{
delta1=(1.57)*(1+A);
}
其他
delta1=((1.57)*(1-A));
}
其他
delta1=0;
if (delta1>1.5)
{
delta1=1.5;
}
其他
delta1=delta1;
*
if (VSEC_ref[2]<100)
{
delta1=(((1.57)*(V2pk-VSEC_ref[2])/V2pk);
}
其他
delta1=0;
if (delta1>1.5)
{
delta1=1.5;
}
其他
delta1=delta1;
if (delta1<0)
{
delta1=0;
}
delta2=0;
Delta3=0;
phi3 = 0;
PH2[2]= 159.155*(2*delta1);
PH3[2]= 159.155*(phi2+delta1-delta2);
PH4[2]= 159.155*(phi2+delta1+delta2);
ph5[2]= 159.155*(phi3+delta1-delta3);
ph6[2]= 159.155*(phi3+delta1+Delta3);
/*
如果(PH2>=250)
{
EPwm2Regs.CMPA.bit.CMPA=PH2+1;//PH2=249;
}
如果(PH3>=250)
{
EPwm3Regs.CMPA.bit.CMPA=PH3+1;//PH3=249;
}
如果(PH4>=250)
{
EPwm4Regs.CMPA.bit.CMPA=PH4+1;//PH4=249;
}
如果(ph5>=250)
{
PH5=249;
}
如果(ph6>=250)
{
PH6=249;
}
*
//
IF (250 PH2[2])
{
EPwm2Regs.CMPA.bit.CMPA=(PH2[2]+5);
}
否则为(250>PH2[1]&& 2503 <ph2[2]))
{
EPwm2Regs.CMPA.bit.CMPA=(PH2[2]-5);
}
其他
{
EPwm2Regs.CMPA.bit.CMPA=250;
}
IF (250 PH3[2])
{
EPwm3Regs.CMPA.bit.CMPA=(PH3[2]-1);
}
其他
{
EPwm3Regs.CMPA.bit.CMPA=250;
}
IF (250 PH4[2])
{
EPwm4Regs.CMPA.bit.CMPA=(PH4[2]-1);
}
其他
{
EPwm4Regs.CMPA.bit.CMPA=250;
}
IF (250 ph5[2])
{
EPwm5Regs.CMPA.bit.CMPA=(ph5[2]-1);
}
其他
{
EPwm5Regs.CMPA.bit.CMPA=250;
}
IF (250 ph6[2])
{
EPwm6Regs.CMPA.bit.CMPA=(ph6[2]-1);
}
其他
{
EPwm6Regs.CMPA.bit.CMPA=250;
}
如果(PH2[2]>=0)
{
EPwm2Regs.TBPHS.bit.TBPHS = PH2[2];
EPwm2Regs.TBCTL.bit.PHSDIR = TB_DOWN;
}
如果(PH2[2]<0)
{
EPwm2Regs.TBPHS.bit.TBPHS =-PH2[2];
EPwm2Regs.TBCTL.bit.PHSDIR = TB_UP;
}
//
如果(PH3[2]>=0)
{
EPwm3Regs.TBPHS.bit.TBPHS = PH3[2];
EPwm3Regs.TBCTL.bit.PHSDIR = TB_DOWN;
}
如果(PH3[2]<0)
{
EPwm3Regs.TBPHS.bit.TBPHS =-PH3[2];
EPwm3Regs.TBCTL.bit.PHSDIR = TB_UP;
}
//
如果(PH4[2]>=0)
{
EPwm4Regs.TBPHS.bit.TBPHS = PH4[2];
EPwm4Regs.TBCTL.bit.PHSDIR = TB_DOWN;
}
如果(PH4[2]<0)
{
EPwm4Regs.TBPHS.bit.TBPHS =-PH4[2];
EPwm4Regs.TBCTL.bit.PHSDIR = TB_UP;
}
//
如果(ph5[2]>=0)
{
EPwm5Regs.TBPHS.bit.TBPHS = ph5[2];
EPwm5Regs.TBCTL.bit.PHSDIR = TB_DOWN;
}
否则、如果(ph5[2]<0)
{
EPwm5Regs.TBPHS.bit.TBPHS =-ph5[2];
EPwm5Regs.TBCTL.bit.PHSDIR = TB_UP;
}
//
如果(ph6[2]>=0)
{
EPwm6Regs.TBPHS.bit.TBPHS = ph6[2];
EPwm6Regs.TBCTL.bit.PHSDIR = TB_DOWN;
}
否则、如果(ph6[2]<0)
{
EPwm6Regs.TBPHS.bit.TBPHS =-ph6[2];
EPwm6Regs.TBCTL.bit.PHSDIR = TB_UP;
}
PH2[1]=PH2[2];
PH3[1]=PH3[2];
PH4[1]=PH4[2];
ph5[1]=ph5[2];
ph6[1]=ph6[2];
//
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
空 InitEPwm1Examples()
{
EPwm1Regs.TBPRD =周期;//设置定时器周期
EPwm1Regs.TBPHS.bit.TBPHS = 0;//相位为0
EPwm1Regs.TBCTR =周期;//0x0000;//清除计数器
//
//设置 TBCLK
//
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
/* EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;*/
//
//设置比较
EPwm1Regs.CMPA.bit.CMPA = Period_Half;
//Period_Half;
//
//设置操作
//
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//将 PWM1A 设置为零
EPwm1Regs.AQCTLA.bit.CAD= AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;//将 PWM1A 设置为零
EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;
//
//低电平有效 PWM -设置死区
//
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm1Regs.DBRED.bit.DBRED = EPWM1_MIN_DB;
EPwm1Regs.DBFED.bit.DBFED = EPWM1_MIN_DB;
EPwm1_DB_DIRECTION = DB_UP;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//禁用组上的 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 2;//在发生第一个事件时生成脉冲
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
//
//中断,我们将在其中更改死区
//
/*
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT
EPwm1Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_3rd;//在第三个事件发生时生成 INT
*
}
//
// InitEPwm2Example-Initialize EPWM2配置
//
空 InitEPwm2Examples()
{
EPwm2Regs.TBPRD =周期;//设置定时器周期
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
EPwm2Regs.TBCTR =周期;//0x0000;//清除计数器
//设置 TBCLK
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;
// EPwm2Regs.TBCTL.bit.PHSDIR = TB_DOWN;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;//慢、只观察
//范围
//设置比较
//EPwm2Regs.CMPA.bit.CMPA = Period_Half;
//设置操作
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;//将 PWM2A 设置为零
EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm2Regs.AQCTLB.bit.CAU = AQ_SET;//将 PWM2A 设置为零
EPwm2Regs.AQCTLB.bit.CAD = AQ_CLEAR;
//低电平有效互补 PWM -设置死区
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm2Regs.DBRED.bit.DBRED = EPWM2_MIN_DB;
EPwm2Regs.DBFED.bit.DBFED = EPWM2_MIN_DB;
EPwm2_DB_DIRECTION = DB_UP;
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
}

