[STM8] stm8s003F3的ADC采集影响到有adc功能管脚的正常输出

[复制链接]
2887|2
 楼主| sy34424 发表于 2016-12-2 16:06 | 显示全部楼层 |阅读模式

本人用的stm8s003,AIN2,3脚用作普通的OUT模式的GPIO, AIN4,5,6采集ad。

ad初始化用的单次扫描模式,每次adc转换的时候,AIN2,3脚的输出会出现一个7us的杂波,影响甚大。

手册上说,扫描模式会把初始化设置的通道之前的所有通道都转换,我判断为这个影响GPIO的输出。请问大家碰到过类似问题吗?或者大神能指教下有什么方式可以避免这种情况吗?
 楼主| sy34424 发表于 2016-12-2 16:19 | 显示全部楼层
  1. 这是初始化代码
  2. static void AD_Configuration(void)
  3. {
  4.   GPIO_Init(GPIOD,GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);           
  5.   GPIO_Init(GPIOD,GPIO_PIN_5, GPIO_MODE_IN_FL_NO_IT);         
  6.   GPIO_Init(GPIOD,GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);
  7.   CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, ENABLE);

  8.   /* De-Init ADC peripheral*/
  9.   ADC1_DeInit();
  10.   /* Init ADC1 peripheral */
  11.                  ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, (ADC1_CHANNEL_4|ADC1_CHANNEL_5|ADC1_CHANNEL_6), ADC1_PRESSEL_FCPU_D2,\
  12.             ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT,  ADC1_SCHMITTTRIG_CHANNEL4,DISABLE);
  13.   
  14.         ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL5,DISABLE);           //ad功能 关闭施密特触发器 减少对ad影响
  15.         ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL6,DISABLE);
  16.         ADC1_ScanModeCmd(ENABLE);
  17.   ADC1_DataBufferCmd(ENABLE);
  18.   ADC1_ITConfig(ADC1_IT_EOCIE,DISABLE);
  19. }
  20. [code]这是读数据的代码,在timer4中断中调用,4ms一次,ad读取正常,只是会影响AIN2,3的输出

  21. void ReadAdResult(void)
  22. {
  23.         DS_INT16U  i,ADResult[3];
  24.   SYSGLDATA *pSysData=NULL;
  25.   DS_INT16U  *pDataPtr=NULL;

  26.   pSysData=&g_pSysGloble->SysData;
  27.   pSysData->AD1[pSysData->Ptr]=ADC1_GetBufferValue(4);
  28.   pSysData->AD2[pSysData->Ptr]=ADC1_GetBufferValue(5);
  29.         pSysData->AD3[pSysData->Ptr]=ADC1_GetBufferValue(6);

  30.   pSysData->Ptr++;
  31.   if(pSysData->Ptr>=10) pSysData->Ptr=0;
  32.   pDataPtr=pSysData->AD1;
  33.   for(i=0;i<3;i++)  ADResult[i]=0;
  34.   for(i=0;i<10;i++)
  35.   {
  36.     ADResult[0]+=*(pDataPtr+i);
  37.     ADResult[1]+=*(pDataPtr+i+10);
  38.                 ADResult[2]+=*(pDataPtr+i+20);
  39.   }
  40.   pSysData->ADdata1=ADResult[0]/10;
  41.   pSysData->ADdata2=ADResult[1]/10;
  42.         pSysData->ADdata3=ADResult[2]/10;//1.8
  43.        
  44.   g_pSysGloble->SysData.ADVoltage1=(g_pSysGloble->SysData.ADdata1*1.82)/g_pSysGloble->SysData.ADdata3;    //vo报警点
  45.   g_pSysGloble->SysData.ADVoltage2=(g_pSysGloble->SysData.ADdata2*1.82)/g_pSysGloble->SysData.ADdata3;    // TEST  自检点
  46.   //g_pSysGloble->SysData.ADVoltage3=(g_pSysGloble->SysData.ADdata3*4.95)/1023;    //1.8V   
  47.         g_pSysGloble->SysData.ADVoltage3=(g_pSysGloble->SysData.ADdata3*5)/1023;    //1.8V   


  48.         /* De-Init ADC peripheral*/
  49.    ADC1_DeInit();
  50.   /* Init ADC1 peripheral */
  51.   ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, (ADC1_CHANNEL_4|ADC1_CHANNEL_5|ADC1_CHANNEL_6), ADC1_PRESSEL_FCPU_D2,\
  52.     ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT,  ADC1_SCHMITTTRIG_CHANNEL4,DISABLE);
  53.                
  54.         ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL5,DISABLE);           //ad功能 关闭施密特触发器 减少对ad影响
  55.         ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL6,DISABLE);
  56.   ADC1_ScanModeCmd(ENABLE);
  57.   ADC1_DataBufferCmd(ENABLE);
  58.   ADC1_ITConfig(ADC1_IT_EOCIE,DISABLE);
  59.   /*Start Conversion */
  60.   ADC1_Cmd(ENABLE);//启用ADC1
  61.   ADC1_StartConversion();
  62. }

  /*Start Conversion */
  ADC1_Cmd(ENABLE);//启用ADC1
  ADC1_StartConversion();

}[/code]
 楼主| sy34424 发表于 2016-12-2 16:21 | 显示全部楼层
还有一个问题就是,读ad的函数中,ADC1_DeInit();如果注释掉,AIN4之前的ad值正常,5,6通道值就不正常。 有大神吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部