打印
[STM8]

STM8S 003 ad使用问题请教

[复制链接]
4168|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huanggang1234|  楼主 | 2013-11-8 08:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的源代码如下:
void Init_Ad(void)
{
   ADC1_DeInit();
   ADC1->CR1 = 0x72;    // fadc = fmaster / 18,使能连续转换模式
   ADC1->CR2 = 0x08;    // 数据右对齐
   ADC1->DRH = 0;
   ADC1->DRL = 0;
//   ADC1->CR3 = 0x00;           // 不使用数据缓冲
//   ADC1->TDRL = 0x4c;   // AIN2、AIN3、AIN6
}
unsigned short Get_Ad(unsigned char Channel)
{
   unsigned char i;
   unsigned short temp = 0;
   unsigned short result = 0;
   Init_Ad();
   ADC1->CSR = Channel&0x0f;
   ADC1->CR1 |= 0x01;                           // 将ADC从休眠状态唤醒
   for (i = 0;i < 100;i++);
   ADC1->CR1 |= 0x01;                           // 启动AD转换
   for (i = 0;i < 8;i++)
   {
      ADC1->CSR &= 0x7f;                        // 清除EOC转换结束标志
      while ((ADC1->CSR & 0x80) == 0){}         // 等待转换完成
//      result += (ADC1->DRH * 256 + ADC1->DRL);  // Then read MSB
   temp = ADC1->DRL;
   temp = temp + ADC1->DRH * 256;
   result = result + temp;
   }
   ADC1->CR1 &= 0xfe;
   return (unsigned short)(result/8);
}

AD是连续模式,单通道使用基本没有问题,但是,如果是多通道轮询,通道之间的影响就比较大,如:
Temp = Get_Ad(BAT_T_CH);
Vol = Get_Ad(BAT_T_CH);

Vol的值受Temp的影响非常大,不知如何解决,请大神们指点。
跪谢了!
沙发
airwill| | 2013-11-8 11:33 | 只看该作者
如果是多通道轮询,通道之间的影响就比较大
那是模拟采样保持时间不够引起的. 加长时间试试

使用特权

评论回复
板凳
honami520| | 2013-11-9 15:42 | 只看该作者
楼上说的有一定道理!不过,楼主说的影响非常大,如果寄存器配置正确,非常大的可能性还是比较小的!
一般通道间的影响应该不会很大,只能算是轻微的。建议楼主看下官方例程。如果实在不行,也可以找我给你提供参考代码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

18

帖子

1

粉丝