你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8L051 AD精度

[复制链接]
keed 提问时间:2015-2-3 18:58 /
前段时间在使用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;
}

收藏 评论3 发布时间:2015-2-3 18:58

举报

3个回答
拼命三郎V5 回答时间:2015-2-4 08:28:51
ssss.jpg
lcdi 回答时间:2015-2-4 14:25:56
是否sample时间不够?
keed 回答时间:2015-2-4 18:10:38
lcdi 发表于 2015-2-4 14:25
是否sample时间不够?

感觉不像 ,我使用仿真单步跑采样效果都是一样,和采样时间应该没关系。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版