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.

[参考译文] MSPM0C1104:计时器 PWM 和放大器;ADC 中断不工作。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1596264/mspm0c1104-timer-pwm-adc-interrupt-not-working

器件型号: MSPM0C1104

尊敬的先生:

 

我们正在对 PWM 变化进行编码、并考虑 ADC 的变化

代码随附在下方。

已尝试使用 ADC 中断启用进行调试、计时器中断不工作。

但当我们禁用 ADC 中断时、计时器中断开始工作。

如果需要进行任何更改、请告知。

 

 

包含“ti_msp_dl_config.h"</s>“

#define PWM_PERIOD_UPDATE_CNT (10U)

const uint32_t period = 1599;
const uint32_t gDutyVal[3] ={799,499、49};

易失性 uint32_t gIndex;
易失性 uint32_t gUpdateCnt;

Volatile bool gCheckADC;
易失性 uint16_t gAdcResult;
Volatile int16_t gADCOffset;

内部 main (void)

  SYSCFG_DL_init ();

   /*获得校准后的 ADC 偏移量 — ADC_ERR_09 的权变措施*/
  gADCOffset =
    DL_ADC12_getADCOffsetCalibration (ADC12_0_ADCMEM_0_REF_VOLTAGE_V);

  gIndex = 0;
  gUpdateCnt = PWM_PERIOD_UPDATE_CNT;

  NVIC_EnableIRQ (PWM_0_INST_INT_IRQN);
  DL_TimerA_startCounter (PWM_0_INST);

  //NVIC_EnableIRQ (ADC12_0_INST_INT_IRQN);

  gCheckADC = false;

   
 DL_GPIO_clearPins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN |
    GPIO_LEDS_USER_TEST_PIN);

  while (1)
  {   
     DL_ADC12_startConversion (ADC12_0_INST);

    while (false == gCheckADC){
      __ WFE ();
    }

    gAdcResult = DL_ADC12_getMemResult (ADC12_0_INST、DL_ADC12_MEM_IDX_0);

    /*应用校准后的 ADC 偏移 — ADC_ERR_09 的权变措施*/
    int16_t adcRaw =(int16_t) gAdcResult + gADCOffset;
    if (adcRaw < 0){
      adcRaw = 0;
    }
    如果 (adcRaw > 4095){
      adcRaw = 4095;
    }
    gAdcResult =(uint16_t) adcRaw;
   // gCheckADC = false;
    DL_ADC12_enableConversions (ADC12_0_INST);

   //
    //__ WFI ();
  }
}

void PWM_0_INST_IRQHandler (void)

  开关 (DL_TimerA_getPendingInterrupt (PWM_0_INST))
  {
    用例 DL_TIMERA_IIDX_CC0_DN:
        

    if (gAdcResult > 0x00 & gAdcResult <0x64) // 0 至 100
     {
      gIndex = 0;
     }  
    Else if (gAdcResult > 0x64 & gAdcResult < 0xc8) // 100 至 200
     {
      gIndex = 1;
     }
    Else if (gAdcResult > 0xc8 & gAdcResult < 0xff) // 200 至 300
     {
     gIndex = 2;
     }       
       

    DL_TimerA_setLoadValue (PWM_0_INST、PERIOD);
    DL_TimerA_setCaptureCompareValue (PWM_0_INST、gDutyVal[gIndex]、
          DL_TIMERA_CAPTURE_COMPARE_0_INDEX);             
             gCheckADC = false;

    默认值:
    休息;
  }
}

void ADC12_0_INST_IRQHandler (void)

  开关 (DL_ADC12_getPendingInterrupt (ADC12_0_INST))
  {
    用例 DL_ADC12_IIDX_MEM0_RESULT_LOADED:
      gAdcResult = DL_ADC12_getMemResult (ADC12_0_INST、DL_ADC12_MEM_IDX_0);
      gCheckADC = true;
      DL_ADC12_startConversion (ADC12_0_INST);
      休息;

    默认值:
      休息;
  }
}

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

    尊敬的 Seema:

    当 ADC 中断处理程序被启用时、计时器中断处理程序永远不会工作的原因是 ADC 中断处理程序会导致无限的 ADC 转换。  在 ISR 中移动 DL_ADC12_startConversion 函数调用、其中 DL_ADC12_enableConversions 函数调用位于 main 中(您无需在此处调用此函数)。

    您的 PWM 中断处理程序中有几个问题。 您的 if/else 陈述应具有&&而不是&。 对于第一个案例、您也缺少 break;语句。

    此致、

    Owen