keed 发表于 2015-2-5 10:06:34

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;
}

z00 发表于 2015-2-5 10:53:50

ADC_CONV函数里面可以对ADC1_CR1进行清零一下

keed 发表于 2015-2-5 11:04:14

z00 发表于 2015-2-5 10:53
ADC_CONV函数里面可以对ADC1_CR1进行清零一下

清理ADC1_CR1_CON位还是 star位ADC POWERON 模式来回切换那样采样 也还是不准确。

foxglove 发表于 2015-2-5 17:01:32

看看怎么能解决

阿里巴巴 发表于 2015-2-6 21:00:42

lcdi 发表于 2015-2-6 23:18:37

建议AD转换函数里,设置完AD通道后,加少许延时(比如说加一些空指令),然后再启动AD。
试试看?

doctorsoft 发表于 2015-3-15 17:37:53

转换通道后第一次AD值应该丢弃,AVR是这样建议的,不知ST是否这样。
1、建议转换通道后连续采样多次(第一次结果丢弃),得到通道N的AD值(平均法)
2、改变通道N,进行下一个通道的AD采集。

zfz0122 发表于 2015-3-15 19:32:53

不会帮顶

jeromeRo 发表于 2015-3-16 11:25:09

我觉得是通道需要清除,可能没清除引起的,不知道是不是,楼主现在怎么样了

759611 发表于 2015-3-16 12:00:57

楼主误差究竟多大?
页: [1]
查看完整版本: STM8L051,AD值误差大