专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

AVR 单片机学习(十)ATmega16 ADC

作者:zww 1988   来源:本站原创   点击数:  更新时间:2014年04月18日   【字体:
模数转换技术概述
  • 性能指标:速度与精度
  • AVR 的模数转换器





  •  

    转换速率:每秒钟采样的次数。常用单位: SPS(每秒次) KSPS(每秒千次) MSPS(每秒百万次)。越快越好。
    转换精度:转换结果的有效位数(二进制)。单位:位
    AVR的片上ADC:
    最高转换速率:15kSPS
    最高转换精度:10位

    AVR片上ADC的特点:
    10 位 精度
    0.5 LSB 的非线性度
    ± 2 LSB 的绝对精度
    65 - 260 μs 的转换时间
    最高分辨率时采样率高达15 kSPS
    8 路复用的单端输入通道
    7 路差分输入通道
    2 路可选增益为10x 与200x 的差分输入通道
    可选的左对齐ADC 读数
    0 - VCC 的 ADC 输入电压范围
    可选的2.56V ADC 参考电压
    连续转换或单次转换模式
    通过自动触发中断源启动ADC 转换
    ADC 转换结束中断
    基于睡眠模式的噪声抑制器
    使用流程:
    1.初始化相关寄存器
    2.读取转换结果
    3.平滑滤波
    4.进行单位制变换



     







    转换结果默认是右对齐的。所以高6位是补0的。  电压增益一般用不到。

     

    相关寄存器

    第一个寄存器:ADMUX

    这个是多工选择寄存器,ADMUX  7 6  是参考电压源选择  ,有表

    一般AVCC不稳定 所以一般不用 一般用 1  内部2.56V

    第5位:是转换结果 左对齐  默认是右对齐   左对齐就是放在高10位  低6位是补0的。

    一般左对齐应用场合是只需要8位的精度,就左对齐 取出高半个字节 就支取了8位精度。



    第4位:模拟通道与增益选择位有个列表 不同的组合 和增益,而我们现在只需要单端输入所以 都设置为0.

     







    第2个寄存器:ADC 控制与状态寄存器


    第7位:ADC 使能  ADEN 置位 就启动ADC

    第6位:ADC 开始转换,启动ADC开始进行转换







     






    第5位:自动触发使能,很多时候需要循环采样模拟信号,自动触发采样很有用的,比如,用定时器100MS 采样一次。触发源下面会有讲。

    第4位:ADC中断标志。 转换结束之后 这个位会置位, 

    第3位:ADC 中断使能

    第2:0位:预分频选择位  是因为它需要一个时钟   看那前面转换时序图194页下图 

    有个表可以晶振时钟 2分频到128分频。

    50----200KHZ的时钟 获得精度。低于10位 可以高于200KHZ

    注意:正常转换需要13个ADC(跟上图有点重复) 200KHZ /13 = 15.384 最高也得 正常就按200KHZ /13就可以


    下面我们计算下 16MHZ的时候它能给ADC 提供一个怎样范围的时钟。

    最大 16000 000  /128  = 125.000 也就是说  ADC时钟最低是 125KHZ

    单次转换速率   125/13= 9.6153846153846153846153846153846   9.615K 这个单位

    超过200KHZ 精度就会降低

    第3个寄存器:ADCH  ADCL 两个8位寄存器

    这个寄存器分两种情况  就是 ADLAR 是左对齐还是右对齐决定





    第4个寄存器:特殊功能IO寄存器

    这个寄存器不是专属于ADC转换寄存器的。只有7、6、5 这3位跟ADC有关。决定ADC触发源

     



     全是0  是连续转换模式。就是 转换率 125/13 大约9.15

    如果连续模式  就是转换结束 立即进入中断 然后中断又立即启动下次转换。所以转换ADC转换频率等于进入中断的频率。

    模拟比较器 就设计到自带的模拟比较器的功能

    外部中断0  来一个外部中断 触发一次转换

    下面都是定时器、计数器的中断。

    最常用的就是连续转换模式。

    adc.h  key.h 是自己编写的头文件

     

    先将  ADC采样到的数据缓冲起来   8个结果都暂存起来

     

    均值滤波  read_adc() 返回read_BUF

    voltile  每次都从寄存器读数据不是从缓存读

    STATIC这个变量尽在本文件有效

    static  voltile unsigned int adc_buffer[MAX_ADC_BUFFER]

    MAX_ADC_BUFFER 是宏   9

     

    void int_adc(void)

    {

       ADUMX |= (1<< 看不清)|(1<<看不清  //是参考电压源 2.56V

       ADCSRA  |= (1<< )|(1<< )|(1<< )|(1<< )   //  ADC使能 ADC 考试转换  连续转换 中断使能 128分频(最后3个置1)

    }

    unsigned int read_adc(void){

        return  adc_buff(0);

    }

     

    //ADC 转换完成中断

    SIGNAL(SIG_ADC){

       unsigned char i;

       unsigned int temp sum =0;

      temp =ADC ;//ADC数据给了temp  注意这个结果是右对齐的因为我们没有置位 左对齐

      for(i=1;i

         //这里是一个求和操作

       adc_fuffer= adc_buffer[i+1];//顺序的将元素向前移动一个位置

       sum += ADC_BUFFER[i];  //累加起来

      }

    //  将本次转换的结果的值  保存在最末的位置

    adc_buffer() = temp;

    sum + = adc_buffer(maxacdbuffer -1);//本次的结果 8次的求和

    下面这个是除以8 相当于 右移动3位

    adc_buffer[[0] = adcbuffer >> 3

    //这样就完成对ADC 转换的结果进行了 平滑滤波

    }

    关闭窗口

    相关文章