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.

[参考译文] TMS320F28379D:

Guru**** 2576195 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1181564/tms320f28379d

器件型号:TMS320F28379D

大家好  

我正在生成一个交流波形、但在每个周期中错过了一个精确的 PWM (100kHz 是开关频率、60Hz 是交流周期);是否有人面临同样的问题。
如果您需要有关波形的其他信息、请告诉我。

此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能否共享 PWM 波形和 CCS 代码以在我的结尾进行检查  

    最棒的

    Uttam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复、
    下面是我获得的代码和 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;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Payam:

    在我看来、在设置 ePWM 方面代码是可以接受的。  

    您能否通信哪个 ePWM 模块缺少输出? 这可能是由于逻辑错误造成的?

    如果  发生这种情况、请仔细检查 ISR 逻辑。

    请告诉我问题是否仍然存在。  

    最棒的

    Uttam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Thabk You Uttam、

    ePWM2缺少周期;OUT 是交流波形、在每个交流周期、在黄色波形所示的同一时刻、ePWM2丢失。