MAX32630/MAX32625學習:MAX32630本身存在問題:AD通道切換引起的干擾

MAX32630的10位AD有多個通道,每個通道共用一個寄存器,如圖

 


我在調試的時候使用1個通道AIN0的時候,用示波器查看波形並沒有問題,但是在使用AIN0和AIN1時就出現問題,代碼程序如下:
  1. void TMR0_IRQHandler(void)
  2. {
  3.         static uint8_t ADC_GET_Time=0;
  4.         
  5.                 ADC_GET_Time++;
  6.                 if(ADC_GET_Time % 10==0)
  7.                 {
  8.                         adc_Channel=2;
  9.                         //ADC0_StartConvert(ADC_CH_0, 0, 1,4);                //¿aê¼ADC0×a»»
  10.                         //ADC_StartConvert(ADC_CH_0_DIV_5, 0, 0);
  11.                         ADC_StartConvert(ADC_CH_0, 0, 0);
  12.                         ADC_GET_Time = 1;
  13.                 }
  14.                 else if((ADC_GET_Time % 2==0)&&(adc_Channel==0))
  15.                 {
  16.                         adc_Channel=1;
  17.                         //ADC0_StartConvert(ADC_CH_1, 0, 1,5);                //¿aê¼ADC0×a»»
  18.                         ADC_StartConvert(ADC_CH_1, 0, 0);
  19.                         //ADC_StartConvert(ADC_CH_1_DIV_5, 0, 0);
  20.                 }
  21.                 TMR32_ClearFlag(MXC_TMR0);
  22. }
複製代碼

程序的功能是用定時器計時切換AD通道,切換週期爲10ms,其他程序如下:
  1. #define USE_INTERRUPTS 1
  2. //#undef USE_INTERRUPTS
  3. /***** Globals *****/
  4. //#ifdef USE_INTERRUPTS
  5. volatile unsigned int adc_Channel = 0;

  6. //#endif

  7. /***** Functions *****/

  8. #ifdef USE_INTERRUPTS
  9. void AFE_IRQHandler(void)
  10. {
  11.     uint16_t ADC_Value_Temp=0;
  12.     ADC_GetData(&ADC_Value_Temp);
  13.     /* Signal bottom half that data is ready */
  14.                 if(adc_Channel == 1)
  15.     {
  16.                         //LED1_OFF;
  17.                         Get_ADC1_Data(ADC_Value_Temp);
  18.                         
  19.                 }
  20.                 else if(adc_Channel == 2)
  21.     {
  22.                         Get_ADC2_Data(ADC_Value_Temp);
  23.                 }
  24.                 adc_Channel = 0;
  25. //                LED0_TURN;
  26.                 ADC_ClearFlags(MXC_F_ADC_INTR_ADC_DONE_IF);
  27.     return;
  28. }
  29. #endif

  30. void ADC0_Init()
  31. {
  32.     /* Initialize ADC */
  33.     ADC_Init();
  34.     #ifdef USE_INTERRUPTS
  35.                 //        NVIC_EnableIRQ(AFE_IRQn);
  36.                         NVIC_ClearPendingIRQ(AFE_IRQn);
  37.                         NVIC_DisableIRQ(AFE_IRQn);
  38.                         NVIC_SetPriority(AFE_IRQn, 1);
  39.                         NVIC_EnableIRQ(AFE_IRQn);
  40.                 #endif
  41. }
  42. /* ************************************************************************* */
  43. void ADC0_StartConvert(mxc_adc_chsel_t channel, unsigned int adc_scale, unsigned int bypass, uint32_t mode)
  44. {
  45.   uint32_t ctrl_tmp;

  46.   /* Clear the ADC done flag */
  47.   ADC_ClearFlags(MXC_F_ADC_INTR_ADC_DONE_IF);
  48.   /* Enable done interrupt */
  49.   MXC_ADC->intr = MXC_F_ADC_INTR_ADC_DONE_IE;
  50.   /* Insert channel selection */
  51.   ctrl_tmp = MXC_ADC->ctrl;
  52.   ctrl_tmp &= ~(MXC_F_ADC_CTRL_ADC_CHSEL);
  53.   ctrl_tmp |= ((channel << MXC_F_ADC_CTRL_ADC_CHSEL_POS) | (mode<<MXC_F_ADC_CTRL_ADC_CHSEL_POS));
  54.         //ctrl_tmp |= ((channel << MXC_F_ADC_CTRL_ADC_CHSEL_POS) & MXC_F_ADC_CTRL_ADC_CHSEL);
  55.   
  56.   /* Clear channel configuration */
  57.   ctrl_tmp &= ~(MXC_F_ADC_CTRL_ADC_REFSCL | MXC_F_ADC_CTRL_ADC_SCALE | MXC_F_ADC_CTRL_BUF_BYPASS);

  58.   /* ADC reference scaling must be set for all channels but two*/
  59.   if ((channel != ADC_CH_VDD18) && (channel != ADC_CH_VDD12)) {
  60.     ctrl_tmp |= MXC_F_ADC_CTRL_ADC_REFSCL; 
  61.   }

  62.   /* Finalize user-requested channel configuration */
  63.   if (adc_scale || channel > ADC_CH_3) {
  64.     ctrl_tmp |= MXC_F_ADC_CTRL_ADC_SCALE;
  65.   }
  66.   if (bypass) {
  67.     ctrl_tmp |= MXC_F_ADC_CTRL_BUF_BYPASS;
  68.   }
  69.   
  70.   /* Write this configuration */
  71.   MXC_ADC->ctrl = ctrl_tmp;
  72.   
  73.   /* Start conversion */
  74.   MXC_ADC->ctrl |= MXC_F_ADC_CTRL_CPU_ADC_START;
  75.         
  76. }
複製代碼


這個問題美信技術支持也沒有解決,這個問題無法避免,但是還是可以解決的,先來看現象

圖1


圖2


圖3

從圖2和圖3可以看出,雜波出現的週期剛好是10ms一次,所以我們可以這樣處理,(1)降採樣;(2)延時10ms以上採樣(具體看你切換的時間週期)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章