08 在ATmega8中真实可用的ADC转换器写法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_25505611/article/details/66970634

有些时候我们喜欢用ATmega8中的代码生成编辑器去编辑一个完成的软件架构,但是博主在进行ADC代码测试编写的时候发现,ADC的编辑器是比较坑的,在ATmega8单片机的手册中我们可以发现有左对齐和右对齐的数据读取方法,但是在宏定义的说明上,生成编辑器却仅仅说明宏定义只是一个时钟源的不同的解析,包括晶振源的不同频率。而且在寄存器的配置中,代码生成编辑器仅仅给出了最普遍的寄存器的编写,并不能适用所有的特定场合的ADC采集方式,博主在重新编写了ADC的数据采集代码后贴上真实可信的源码。希望以后编写代码时候不仅仅依靠于代码生成器的架构体系,更要知道是怎么来的的,怎么写的。

首先是宏定义#define  ADC_VREF_TYPE 0x40 //这里的0X40和0x60具体什么意思同学们自行研究

初始化函数:

void adinit(void)
{
    ADCSRA = 0x00;  //ADC关闭
    ACSR   = 0x80;  //禁用模拟比较器
    ADMUX  = 0x40;  //参考电压选择:AVCC     0x40右对齐  如果是0x60则是左对齐
    ADCSRA = 0xE0;  //64分频  125khz
}

ADC采集函数:

float read_adc(u8 adc_input)      
{
    u16 temp2,temp1;              
    // Delay needed for the stabilization of the ADC input voltage
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);      //设置AVCC  AD0  如果input为66则为左对齐
    delay_us(10);
    ADCSRA |=0xE7; 
    while((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    temp1=ADCL;
    temp2=(ADCH<<8)+temp1;    
    return (temp2*5.0)/1024;     
}

调用方式:这里博主分别打开整数和小数,取出不同的需求

     txbuf[33]=(int)adctemp;               
     txbuf[34]=(((adctemp-(int)adctemp)*100)); 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页