打印
[STM8]

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

[复制链接]
2634|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 | 只看该作者
这是初始化代码
static void AD_Configuration(void)
{
  GPIO_Init(GPIOD,GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);           
  GPIO_Init(GPIOD,GPIO_PIN_5, GPIO_MODE_IN_FL_NO_IT);         
  GPIO_Init(GPIOD,GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT);
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, ENABLE);

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

void ReadAdResult(void)
{
        DS_INT16U  i,ADResult[3];
  SYSGLDATA *pSysData=NULL;
  DS_INT16U  *pDataPtr=NULL;

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

  pSysData->Ptr++;
  if(pSysData->Ptr>=10) pSysData->Ptr=0;
  pDataPtr=pSysData->AD1;
  for(i=0;i<3;i++)  ADResult[i]=0;
  for(i=0;i<10;i++)
  {
    ADResult[0]+=*(pDataPtr+i);
    ADResult[1]+=*(pDataPtr+i+10);
                ADResult[2]+=*(pDataPtr+i+20);
  }
  pSysData->ADdata1=ADResult[0]/10;
  pSysData->ADdata2=ADResult[1]/10;
        pSysData->ADdata3=ADResult[2]/10;//1.8
       
  g_pSysGloble->SysData.ADVoltage1=(g_pSysGloble->SysData.ADdata1*1.82)/g_pSysGloble->SysData.ADdata3;    //vo报警点
  g_pSysGloble->SysData.ADVoltage2=(g_pSysGloble->SysData.ADdata2*1.82)/g_pSysGloble->SysData.ADdata3;    // TEST  自检点
  //g_pSysGloble->SysData.ADVoltage3=(g_pSysGloble->SysData.ADdata3*4.95)/1023;    //1.8V   
        g_pSysGloble->SysData.ADVoltage3=(g_pSysGloble->SysData.ADdata3*5)/1023;    //1.8V   


        /* De-Init ADC peripheral*/
   ADC1_DeInit();
  /* Init ADC1 peripheral */
  ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, (ADC1_CHANNEL_4|ADC1_CHANNEL_5|ADC1_CHANNEL_6), ADC1_PRESSEL_FCPU_D2,\
    ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT,  ADC1_SCHMITTTRIG_CHANNEL4,DISABLE);
               
        ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL5,DISABLE);           //ad功能 关闭施密特触发器 减少对ad影响
        ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL6,DISABLE);
  ADC1_ScanModeCmd(ENABLE);
  ADC1_DataBufferCmd(ENABLE);
  ADC1_ITConfig(ADC1_IT_EOCIE,DISABLE);
  /*Start Conversion */
  ADC1_Cmd(ENABLE);//启用ADC1
  ADC1_StartConversion();
}

  /*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

粉丝