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.

[参考译文] CCS/TMS320F2.8027万:PWM问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/575156/ccs-tms320f28027-pwm-problem

部件号:TMS320F2.8027万

工具/软件:Code Composer Studio

您好,

我目前正在使用具有电压控制回路的ADC通过PWM工作。 我在我的循环中发出了一个命令,如果我的ADC输入大于2.5 v,我的脉冲应该关闭。我激活了ePWM1。

但现在发生的是ePWM1A正在关闭,而ePWM1B却没有关闭。 我将包含我的program..please帮助

/configure ADCINA4
       ADC_setIntPulseGenMode (myAdc1,ADC_IntPulseGenMode_Prior);
      ADC_enableInt (myAdc1,ADC_IntNumber_1);
      ADC_setIntMode (myAdc1,ADC_IntNumber_1,ADC_IntMode_ClearFlag);//ADCINT1在AdcResults锁定后跳闸
      ADC_setIntSrc (myAdc1,ADC_IntNumber_1,ADC_IntSrc_EOC2);                //将EOC2设置为触发ADCINT1
      ADC_setSocChanNumber (myAdc1,ADC_SocNumber_0,ADC_SocChanNumber_A4);   //将SOC0通道选择设置为ADCINA4
      ADC_setSocChanNumber (myAdc1,ADC_SocNumber_1,ADC_SocChanNumber_A4);   //将SOC1通道选择设置为ADCINA4
      ADC_setSocChanNumber (myAdc1,ADC_SocNumber_2,ADC_SocChanNumber_A4);   //将SOC2信道选择设置为ADCINA2
      ADC_setSocTrigSrc (myAdc1,ADC_SocNumber_0,ADC_SocTrigSrc_EPWM1_ADCSOCA);   //由于循环SOC0先转换SOC1,因此在EPWM1A上设置SOC0启动触发器
      ADC_setSocTrigSrc (myAdc1,ADC_SocNumber_1,ADC_SocTrigSrc_EPWM1_ADCSOCA);   //由于循环SOC0先转换,然后转换SOC1,所以在EPWM1A上设置SOC1启动触发器
      ADC_setSocTrigSrc (myAdc1,ADC_SocNumber_2,ADC_SocTrigSrc_EPWM1_ADCSOCA);   //由于循环SOC0先转换为SOC1,然后转换为SOC2,因此在EPWM1A上设置SOC2启动触发器

      ADC_setSocSampleWindow (myAdc1,ADC_SocNumber_0,ADC_SocSampleWindow ow_7_Cycles);  //将SOC0 S/H Window设置为7个ADC时钟周期,(6个ACQPS加1个)
      ADC_setSocSampleWindow (myAdc1,ADC_SocNumber_1,ADC_SocSampleWindow ow_7_Cycles);  //将SOC1 S/H Window设置为7个ADC时钟周期,(6 ACQPS加1)
      ADC_setSocSampleWindow (myAdc1,ADC_SocNumber_2,ADC_SocSampleWindow ow_7_Cycles);

 PWM_enableSocAPulse (myPwm1);
   //在组上启用SOC
 // pwm_setSocBPulseSrc (myPwm2, PWM_SocPulseSrc_CounterEqualCmpAIncr);
   PWM_setSocAPulseSrc (myPwm1,PWM_SocPulseSrc_CounterEqualCmpAIncr);//在计数时从CPMA中选择SOC
   //PWM_setSocBPeriod (myPwm2,PWM_SocPeriod_FirstEvent);
   PWM_setSocAPeriod (myPwm1,PWM_SocPeriod_FirstEvent);//在第一个事件上生成脉冲
   //PWM_setCmpA (myPwm2,0x0000);                                        //设置比较值
   //PWM_setPeriod (myPwm2,0x05DC);
   PWM_setPeriod (myPwm12500);    //周期= 1500 (对于20Khz采样频率)
  // PWM_setCounterMode (myPwm2,PWM_CounterMode_up);
   PWM_setCounterMode (myPwm1,PWM_CounterMode_up);

clk_enableTbClockSync(myClk);

对于(;;)

PWM_setCmpA (myPwm1,VPI_5);   

void InitEPwm1()

   clk_disableTbClockSync(myClk);
   clk_enablePwmClock (myClk,PWM_Number_1);
   GPIO设置上拉(myGpio,GPIO编号_0,GPIO _上拉_禁用);
   GPIO设置上拉(myGpio,GPIO编号_1,GPIO _上拉_禁用);
   GPIO设置模式(myGpio,GPIO编号_0,GPIO _0_Mode_EPWM1A);
   GPIO_setMode (myGpio,GPIO编号_1,GPIO _1_Mode_EPWM1B);
    //设置同步
   PWM_setSyncMode (myPwm1,PWM_SyncMode_EPWMxSYNC);
 // PWM_setSyncMode (myPwm2,PWM_SyncMode_EPWMxSYNC);
   //允许每个计时器同步
   PWM_enableCounterLoad (myPwm1);

PWM_setPeriod (myPwm1,PWM1_TIMER_TBPRD);
   PWM_setCounterMode (myPwm1,PWM_CounterMode_up);        //计数
   PWM_setIntMode (myPwm1,PWM_IntMode_CounterEqualZero);  //在零事件中选择INT
   PWM_enableInt (myPwm1);                                 //启用INT
   PWM_setIntPeriod (myPwm1,PWM_IntPeriod_FirstEvent);    //在第一个事件上生成INT

   PWM_setActionQual_Period_PwmA (myPwm1,PWM_ActionQual_Set);
   PWM_setActionQual_CntUp_CmpA_PwmA (myPwm1,PWM_ActionQual_Clear);

      PWM_setActionQual_Period_PwmB (myPwm1,PWM_ActionQual_Clear);
   PWM_setActionQual_CntUp_CmpA_PwmB (myPwm1,PWM_ActionQual_Set);

  clk_enableTbClockSync(myClk);

}

__interrupt void ADC_ISR(void)

 {
 Voltage1[ConversionCount]= ADC_readResult (myAdc1,ADC_ResultNumber_1);
 //Voltage2[ConversionCount]= ADC_readResult (myAdc2,ADC_ResultNumber_2);

 sum1 += Voltage1[ConversionCount];
 //sum2 += Voltage2[ConversionCount];
  IF (ConversionCount == 40)
  {

  vout计数1= sum1/ConversionCount;

    VA1 =(Vout计数1 * 3.3)/(4096);//以3.3V格式检测到的电压

    ERR_5 = 3.15 - VA1;

    a_5 =(err_5 * kp);// kp b
    B_5 =(ERR_5 * KI);// KI乘法
    V_5 = k_5 +(B_5 + IN_A);
    如果(v_5 >= 1200) v_5 = 1200; //最大占空比限制
    如果(v_5 <= 10) v_5 = 10;
    K_5 = v_5;
    IN_A = B_5;
    VPI_5 = a_5 + v_5;


 

    如果(VPI_5 >= 1200) VPI_5 = 1200;//最大占空比限制
    如果(VPI_5 <= 10) VPI_5 = 10;
    如果(VA1 > 2.50) VPI_5 = 0;//最小占空比限制


  ConversionCount = 0;
  相扑1=0;


  }


  Else ConversionCount++;
   //清除ADCINT1标志,为下一个SOC重新初始化
   ADC_clearIntFlag (myAdc1,ADC_IntNumber_1);
   //确认中断到PIE
   PIE_clearInt (myPie,PIE_GroupNumber_10);
}

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

    您好,Madhuri,

    Madhuri Depuru 说:
    但发生的是ePWM1A正在关闭,而ePWM1B未关闭。

    您是否将相应的CMPA和CMBB值更改为0?

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

    PWM_setCmpA (myPwm1,0);
    PWM_setCmpB (myPwm1,0);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试一次软件跳闸(OSHT跳闸区域)。 请告诉我们!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Gautam:

    我们没有使用OSHT TRIP。我们使用操作限定符集来关闭两个脉冲。

    谢谢你