打印
[AVR单片机]

AVRmega88 adc的问题

[复制链接]
1299|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heaven_xiyu|  楼主 | 2013-9-6 18:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uint ReadADC(uchar chanl)
{
    uint i,p;
float n;
    ADMUX = 0xc0|chanl;     //内部电压 右对齐 选择ADC通道
ADCSRA = 0xC0;              //            
    ADCSRA |= 0x40;                             
    while (!(ADCSRA & 0x10));               
    ADCSRA |= 0x10;                          
    i = ADCL;                              
    i += (int)ADCH << 8;                    

n=((float)(1.1/0x3ff))*i;  //(标准电压/0x3ff)/*测量电压=当前电压值 测量值为峰值
p=(uint)(n*1000);    //乘以1000转化成正数
    return p;
}
程序已经在protues上仿真没错误, 但是在实物上的时候 我输入了0.5V的电压, 显示屏一直都显示1.1V,直到我在   i += (int)ADCH << 8;   下面写了一段 if(i=0x3ff) return 0; 的时候就一直显示0; 这说明转化的结果一直大于1.1v(我用的是片内1.1v基准电压)。
即使我把引脚翘起,不输入任何电压时 还是显示1.1V 。 好像得到的电压永远大于基准电压,很不解。
很纠结到底是那里出了问题。
求高手指点!!!
还有mega88pa的avcc管脚外置的电感手册上要求10uH我焊了个30uH的是否有影响?

相关帖子

沙发
fp123123| | 2013-9-7 07:28 | 只看该作者
改成这样,不明白的地方,仔细看一下PDF

uint ReadADC(uchar chanl)
{
  uint i,p;
  float n;

  ADMUX = 0xc0|chanl;   //内部电压 右对齐 选择ADC通道
  ADCSRA = 0x80;        // 打开ADC,ADC时钟设置为主频/2

  // 切换了通道,需要丢弃第一次结果
  ADCSRA |= 0x40;       // 开始转换
  while(ADCSRA & 0x40); // 等待结束

  ADCSRA |= 0x40;       // 开始转换
  while(ADCSRA & 0x40); // 等待结束

  i = ADCL;                              
  i += (((int)ADCH) << 8);                    
  n=((float)(1.1/0x3ff))*i; //(标准电压/0x3ff)/*测量电压=当前电压值 测量值为峰值
  p=(uint)(n*1000);         //乘以1000转化成正数

  return p;
}

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6
板凳
dqyubsh1| | 2013-9-9 10:15 | 只看该作者
本帖最后由 dqyubsh1 于 2013-9-9 10:17 编辑

首先你的程序有问题,需要改正。还有,模拟输入电路必须加上有效输入才可以,输入悬空是无法准确测到电压值的。

使用特权

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

本版积分规则

144

主题

219

帖子

1

粉丝