haihao0711 发表于 2011-8-18 10:09:48

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

马老师您好!我想问一下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;
}

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

zhuilovelyan 发表于 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);
页: [1]
查看完整版本: 求教马老师AVR内部AD的用法