1812|0

131

帖子

0

资源

一粒金砂(中级)

MAX32630FTHR设计笔记(10):MAX32630本身存在问题:AD通道切换引起的干扰 [复制链接]

本帖最后由 Justice_Gao 于 2017-9-12 22:32 编辑

MAX32630的10位AD有多个通道,每个通道共用一个寄存器,如图 QQ截图20170912214330.png

我在调试的时候使用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. }
复制代码


这个问题美信技术支持也没有解决,这个问题无法避免,但是还是可以解决的,先来看现象
微信图片_20170912215422.jpg

图1

微信图片_20170912215431.jpg

图2

微信图片_20170912215425.jpg

图3

从图2和图3可以看出,杂波出现的周期刚好是10ms一次,所以我们可以这样处理,(1)降采样;(2)延时10ms以上采样(具体看你切换的时间周期)


回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    关闭
    站长推荐上一条 1/9 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表