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.

28335 apwm使用



现问题描述:

同时使用ECAP1、ECAP5、ECAP6作为APMW输出,各通道独立;

频率全部配置为10k,仅占空比不同;

配置方式完全一样;

用示波器观察,仅ECAP1的输出复合程序预期,频率和占空比都对;ECAP5、ECAP6波形一致,但频率为9.几k一直在变,占空比也不是我发的那个值;

求指正!!!



配置如下:
//辅助PWM输出初始化                                                   
void  APWM_init(void)
{
    
   //设定ECAP5/6/1作为辅助PWM1/2/3输出

   //设定APWM3    
   // Setup APWM mode on CAP1, set period and compare registers
   InitECap1Gpio();
   ECap1Regs.ECCTL2.bit.CAP_APWM = 1;    // Enable APWM mode
   ECap1Regs.CTRPHS = 0x0;                 // make phase zero
   ECap1Regs.ECCTL2.bit.APWMPOL = APWM_POL;    // 0:Active high
   ECap1Regs.CAP1 = APWM_PRD;            // Set Period value
   ECap1Regs.CAP2 = APWM_CMP_INIT;        // Set Compare value
   ECap1Regs.ECCLR.all = 0x0FF;            // Clear pending interrupts
   //ECap1Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int
 
   //设定APWM1
   // Setup APWM mode on CAP5, set period and compare registers
   InitECap5Gpio();
   ECap5Regs.ECCTL2.bit.CAP_APWM = 1;    // Enable APWM mode
   ECap5Regs.CTRPHS = 0x0;                 // make phase zero
   ECap5Regs.ECCTL2.bit.APWMPOL = APWM_POL;    // 0:Active high
   ECap5Regs.CAP1 = APWM_PRD;            // Set Period value
   ECap5Regs.CAP2 = APWM_CMP_INIT;        // Set Compare value
   ECap5Regs.ECCLR.all = 0x0FF;            // Clear pending interrupts
   //ECap1Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int

   //设定APWM2
   // Setup APWM mode on CAP6, set period and compare registers
   InitECap6Gpio();
   ECap6Regs.ECCTL2.bit.CAP_APWM = 1;    // Enable APWM mode
   ECap6Regs.CTRPHS = 0x0;                 // make phase zero
   ECap6Regs.ECCTL2.bit.APWMPOL = APWM_POL;    // 0:Active high
   ECap6Regs.CAP1 = APWM_PRD;            // Set Period value
   ECap6Regs.CAP2 = APWM_CMP_INIT;        // Set Compare value
   ECap6Regs.ECCLR.all = 0x0FF;            // Clear pending interrupts
   //ECap1Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int

   // Start counters
   ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // 1:Allow TSCTR to run, start counters
   ECap5Regs.ECCTL2.bit.TSCTRSTOP = 1; // 1:Allow TSCTR to run, start counters
   ECap6Regs.ECCTL2.bit.TSCTRSTOP = 1; // 1:Allow TSCTR to run, start counters

}
改变占空比函数:



//设定APWM的有效占空比,输入为PWM编号(1-3),以及Q15的有效占空比
void  APWM_duty_set(long pwm_num,long r)
{
    switch ( pwm_num )
    {
      //下一周期生效
      case 1: //APWM1,对应ECAP5
            ECap5Regs.CAP4 = IQmpy(APWM_PRD,r,15)    ; // Set Compare value
            break;      
      case 2: //APWM2, 对应ECAP6
            ECap6Regs.CAP4 = IQmpy(APWM_PRD,r,15)  ; // Set Compare value
            break;
      case 3: //APMW3, 对应ECAP1
            ECap1Regs.CAP4 = IQmpy(APWM_PRD,r,15)   ; // Set Compare value
            break;
      default:
            break;
    }
    return;
}