意法半导体社区 发表于 2015-11-12 14:13:04

求STM8L151单片机的AD转换


我使用STM8L151单片机,使用三个AD通道0、1、2三个,单次转换,0通道检测电池电压,目前单步运行是发现第一次结果正确,接下来的结果接错误了,使用16M晶振,程序如下:
GPIO_Init(BATTER_PORT, BATTER_PIN, GPIO_Mode_In_FL_No_IT);//电池检测管脚初始化
GPIO_Init(TEL_AD_PORT, TEL_AD_PINS, GPIO_Mode_In_FL_No_IT);


void AD1_Init(void)//AD初始化
{
      CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,ENABLE);
      ADC_SchmittTriggerConfig(ADC1,BAT_AD_CHANNEL, DISABLE);
      ADC_SchmittTriggerConfig(ADC1,TEL_AD_CHANNEL1, DISABLE);
      ADC_SchmittTriggerConfig(ADC1,TEL_AD_CHANNEL2, DISABLE);
          ADC_Init(ADC1,ADC_ConversionMode_Single,ADC_Resolution_10Bit,ADC_Prescaler_1);
          ADC_SamplingTimeConfig(ADC1,ADC_Group_SlowChannels,ADC_SamplingTime_384Cycles);
          ADC_Cmd(ADC1,ENABLE);
          ADC_DMACmd(ADC1,DISABLE);
          ADC_ChannelCmd(ADC1,BAT_AD_CHANNEL,ENABLE);
          ADC_SoftwareStartConv( ADC1);
}



void AD_Function(void)//AD程序
{
    u16 Temp1,Temp2;

      if(ADC1->SR & ADC_FLAG_EOC){      
                Temp1 = ADC1->DRL;
                Temp2 = ADC1->DRH;
                Temp2 = (Temp2 << 8) | Temp1;      
                ADBuf = Temp2;
                switch(ADChannel){
                        case uaBAT://电池电压检测
                              if(ADBuf < 341){                //1024*(1.1/3.3)
                                        if(ADBuf<311)      //1024*(1/3.3)
                                        {Flag_off=TRUE;}
                                        Change_WriteData(0x12,0x40,5);
                              }
                              else
                              {Change_WriteData(0x12,0x40,6);}
                        break;
                        case uaTEL1:
                              if(ADBuf > 931)                                                                                                                        //1024*(3/3.3)
                              {ErrIn();}
                        break;
                        case uaTEL2:
                              if(ADBuf > 931)                                                                                                                        //1024*(3/3.3)
                              {ErrIn();}
                        break;
                        default:break;
                }
                ADChannel++;
                if(ADChannel == uaMax){
                        ADChannel = uaBAT;
                }
                ADC1->SR &= (~ADC_FLAG_EOC);
                ADC1->SQR &= (~ADC_SQR4_CHSELS);
                ADC1->SQR |= ADChannel;      /*使能通道*/
                ADC1->CR1 |= ADC_CR1_START;
      }
}


typedef enum {
      uaBAT = 0,//电池电压
      uaTEL1,
      uaTEL2,
      uaMax
}T_AD_CHANNEL;

求大神给个解释。。。。。。

逍遥李 发表于 2015-11-12 14:59:55

错误什么现象?你怎么知道出错了?你怎么排查的?你的猜测是哪里出错了?
我手里没有这款,只有8S105,我想大家都不一定刚好有你的芯片,你最好把问题描述清楚一些,

意法半导体社区 发表于 2015-11-12 15:55:48

逍遥李 发表于 2015-11-12 14:59
错误什么现象?你怎么知道出错了?你怎么排查的?你的猜测是哪里出错了?
我手里没有这款,只有8S105,我想 ...

谢谢你 我刚刚解决了,是我的通道选错了
页: [1]
查看完整版本: 求STM8L151单片机的AD转换