keed 发表于 2015-2-3 18:58:16

STM8L051 AD精度

前段时间在使用STM8S在一个锂电池管理项目上,但是发现给MCU供电不是很好处理,故改用STM8L051 发现一个比较奇怪的问题!
单独转换通道 AD值还是比较准确的,但是4个通道轮番扫描一次就 ,AD值就有比较大的误差,程序如下
程序放在中断里面,无关部分省略…………
for(ADCCH=0;ADCCH<4;)
{
   if(ADCCH == 0)
      {
      InputTep = InputTep + ADC_CONV(ADCCH);      
      }
    if(ADCCH == 1)
      {
      BattTep = BattTep + ADC_CONV(ADCCH);
      }
    if(ADCCH == 2)
      {
      VBusTep = VBusTep + ADC_CONV(ADCCH);
      }
    if(ADCCH == 3)
      {
      LoadCurrTep = LoadCurrTep + ADC_CONV(ADCCH);
      }
    ADCCH++;
}
ADCCNT++;
if(ADCCNT == 8)
{
    InputAVGOld = InputAVG;
    BattAVGOld = BattAVG;
    VBusAVGOld = VBusAVG;
    LoadCurrAVGOld = LoadCurrAVG;
    InputAVG = InputTep>>3;
    BattAVG = BattTep>>3;
    VBusAVG = VBusTep>>3;
    LoadCurrAVG = LoadCurrTep>>3;
    InputTep = 0;
    BattTep = 0;
    VBusTep = 0;
    LoadCurrTep = 0;
    ADCCNT = 0;

}

void Init_AD(void)
{
                ADC1_CR2 = 0x83;
                ADC1_CR3 = 0x80;
                ADC1_SQR1 = 0x80;
                ADC1_SQR2 = 0;
                ADC1_SQR4 = 0;
}

unsigned int ADC_CONV(unsigned char ADCH)
{
   unsigned int DataTep;
   unsigned int DataTep1;
    ADC1_SQR3 = 0x08<<ADCH;
    ADC1_CR1|=0x02;
    while(ADC1_SR_EOC == 0);
    DataTep = ADC1_DRL;
    DataTep1 = ADC1_DRH;
    DataTep1 = DataTep1<<8;
    DataTep = DataTep|DataTep1;
    ADC1_SR_EOC = 0;
    ADC1_SQR3 = 0;
    return DataTep;
}

拼命三郎V5 发表于 2015-2-4 08:28:51

lcdi 发表于 2015-2-4 14:25:56

是否sample时间不够?

keed 发表于 2015-2-4 18:10:38

lcdi 发表于 2015-2-4 14:25
是否sample时间不够?

感觉不像 ,我使用仿真单步跑采样效果都是一样,和采样时间应该没关系。
页: [1]
查看完整版本: STM8L051 AD精度