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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版