搜索
bottom↓
回复: 1

求教马老师AVR内部AD的用法

[复制链接]

出0入0汤圆

发表于 2011-8-18 10:09:48 | 显示全部楼层 |阅读模式
马老师您好!我想问一下ATmega128 内部AD的用法,寄存器我都设置了,但是发现AD一直都在转换,得不到转换结束标志位,这是为什么呢?下面是我的AD初始化程序和获取函数:  
void init_adc()
{
  ADCSR=0x00;     //设置ADC前,禁止ADC
  ADCSR=BIT(ADEN)|BIT(ADPS1)|BIT(ADPS0)|BIT(ADPS2);  //ADC使能,128分频
  ADMUX=BIT(REFS1)|BIT(REFS0);   //设置ADC内置参考电压为2.56V的片内基准电源
  ADMUX|=BIT(ADLAR);     //ADC转换结果左对齐,直接取ADCH的8位数据
//  ADCSR=BIT(ADEN)|BIT(ADPS1)|BIT(ADPS0)|BIT(ADPS2);  //ADC使能,128分频
}

unsigned char get_adcdata(void)
{
  unsigned char volt;
//  ADMUX=BIT(MUX0)|BIT(MUX1)|BIT(MUX2)|BIT(MUX3);           //选择通道,电池电压通道
  ADMUX|=0;
  ADCSR|=BIT(ADSC);  //启动单次ADC转换
  while (!(ADCSR&BIT(ADIF)))  //等待转换结束
  {
    PORTD &= ~BIT(0);
    delay_ms(100);
    PORTD |= BIT(0);
    delay_ms(100);
  }
  ADCSR&=~(BIT(ADIF));    //清楚ADIF位
  volt=ADCH;
  return volt;
}

恳请马老师帮忙解决!我都纠结好一阵子了

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-9-4 08:37:31 | 显示全部楼层
你的程序有问题,这个是我以前写的,Atmega16右对齐的,跟128差不多,你可以参考一下:
uchar adc_l,adc_h;
uint adc_result;
ADMUX=0x00;//基准AREF(0x00),AVCC(0x40),2.56v(0xC0),转换结果右对齐,通道0单端输入
ADCSRA=0xC6;//启动ADC,开始转换,64分频
while(!(ADCSRA&(1<<ADIF)));//等待采样完成,ADIF是否置位
adc_l=ADCL;
adc_h=ADCH;
adc_result=(uint)((((uint)adc_h)<<8)+adc_l);
ADCSRA&=~(1<<ADIF);//清除ADC中断标志
ADCSRA&=~(1<<ADEN);//关闭ADC转换
return adc_result;


先在端口初始化里边加上这个:
DDRF&=~BIT(0);//PF0输入
PORTF&=~BIT(0);
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-19 05:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表