專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

AVR 單片機學(xué)習(xí)(十)ATmega16 ADC

作者:zww 1988   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年04月18日   【字體:
模數(shù)轉(zhuǎn)換技術(shù)概述
  • 性能指標(biāo):速度與精度
  • AVR 的模數(shù)轉(zhuǎn)換器





  •  

    轉(zhuǎn)換速率:每秒鐘采樣的次數(shù)。常用單位: SPS(每秒次) KSPS(每秒千次) MSPS(每秒百萬次)。越快越好。
    轉(zhuǎn)換精度:轉(zhuǎn)換結(jié)果的有效位數(shù)(二進制)。單位:位
    AVR的片上ADC:
    最高轉(zhuǎn)換速率:15kSPS
    最高轉(zhuǎn)換精度:10位

    AVR片上ADC的特點:
    10 位 精度
    0.5 LSB 的非線性度
    ± 2 LSB 的絕對精度
    65 - 260 μs 的轉(zhuǎn)換時間
    最高分辨率時采樣率高達15 kSPS
    8 路復(fù)用的單端輸入通道
    7 路差分輸入通道
    2 路可選增益為10x 與200x 的差分輸入通道
    可選的左對齊ADC 讀數(shù)
    0 - VCC 的 ADC 輸入電壓范圍
    可選的2.56V ADC 參考電壓
    連續(xù)轉(zhuǎn)換或單次轉(zhuǎn)換模式
    通過自動觸發(fā)中斷源啟動ADC 轉(zhuǎn)換
    ADC 轉(zhuǎn)換結(jié)束中斷
    基于睡眠模式的噪聲抑制器
    使用流程:
    1.初始化相關(guān)寄存器
    2.讀取轉(zhuǎn)換結(jié)果
    3.平滑濾波
    4.進行單位制變換



     







    轉(zhuǎn)換結(jié)果默認(rèn)是右對齊的。所以高6位是補0的。  電壓增益一般用不到。

     

    相關(guān)寄存器

    第一個寄存器:ADMUX

    這個是多工選擇寄存器,ADMUX  7 6  是參考電壓源選擇  ,有表

    一般AVCC不穩(wěn)定 所以一般不用 一般用 1  內(nèi)部2.56V

    第5位:是轉(zhuǎn)換結(jié)果 左對齊  默認(rèn)是右對齊   左對齊就是放在高10位  低6位是補0的。

    一般左對齊應(yīng)用場合是只需要8位的精度,就左對齊 取出高半個字節(jié) 就支取了8位精度。



    第4位:模擬通道與增益選擇位有個列表 不同的組合 和增益,而我們現(xiàn)在只需要單端輸入所以 都設(shè)置為0.

     







    第2個寄存器:ADC 控制與狀態(tài)寄存器


    第7位:ADC 使能  ADEN 置位 就啟動ADC

    第6位:ADC 開始轉(zhuǎn)換,啟動ADC開始進行轉(zhuǎn)換







     






    第5位:自動觸發(fā)使能,很多時候需要循環(huán)采樣模擬信號,自動觸發(fā)采樣很有用的,比如,用定時器100MS 采樣一次。觸發(fā)源下面會有講。

    第4位:ADC中斷標(biāo)志。 轉(zhuǎn)換結(jié)束之后 這個位會置位, 

    第3位:ADC 中斷使能

    第2:0位:預(yù)分頻選擇位  是因為它需要一個時鐘   看那前面轉(zhuǎn)換時序圖194頁下圖 

    有個表可以晶振時鐘 2分頻到128分頻。

    50----200KHZ的時鐘 獲得精度。低于10位 可以高于200KHZ

    注意:正常轉(zhuǎn)換需要13個ADC(跟上圖有點重復(fù)) 200KHZ /13 = 15.384 最高也得 正常就按200KHZ /13就可以


    下面我們計算下 16MHZ的時候它能給ADC 提供一個怎樣范圍的時鐘。

    最大 16000 000  /128  = 125.000 也就是說  ADC時鐘最低是 125KHZ

    單次轉(zhuǎn)換速率   125/13= 9.6153846153846153846153846153846   9.615K 這個單位

    超過200KHZ 精度就會降低

    第3個寄存器:ADCH  ADCL 兩個8位寄存器

    這個寄存器分兩種情況  就是 ADLAR 是左對齊還是右對齊決定





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

    這個寄存器不是專屬于ADC轉(zhuǎn)換寄存器的。只有7、6、5 這3位跟ADC有關(guān)。決定ADC觸發(fā)源

     



     全是0  是連續(xù)轉(zhuǎn)換模式。就是 轉(zhuǎn)換率 125/13 大約9.15

    如果連續(xù)模式  就是轉(zhuǎn)換結(jié)束 立即進入中斷 然后中斷又立即啟動下次轉(zhuǎn)換。所以轉(zhuǎn)換ADC轉(zhuǎn)換頻率等于進入中斷的頻率。

    模擬比較器 就設(shè)計到自帶的模擬比較器的功能

    外部中斷0  來一個外部中斷 觸發(fā)一次轉(zhuǎn)換

    下面都是定時器、計數(shù)器的中斷。

    最常用的就是連續(xù)轉(zhuǎn)換模式。

    adc.h  key.h 是自己編寫的頭文件

     

    先將  ADC采樣到的數(shù)據(jù)緩沖起來   8個結(jié)果都暫存起來

     

    均值濾波  read_adc() 返回read_BUF

    voltile  每次都從寄存器讀數(shù)據(jù)不是從緩存讀

    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 考試轉(zhuǎn)換  連續(xù)轉(zhuǎn)換 中斷使能 128分頻(最后3個置1)

    }

    unsigned int read_adc(void){

        return  adc_buff(0);

    }

     

    //ADC 轉(zhuǎn)換完成中斷

    SIGNAL(SIG_ADC){

       unsigned char i;

       unsigned int temp sum =0;

      temp =ADC ;//ADC數(shù)據(jù)給了temp  注意這個結(jié)果是右對齊的因為我們沒有置位 左對齊

      for(i=1;i

         //這里是一個求和操作

       adc_fuffer= adc_buffer[i+1];//順序的將元素向前移動一個位置

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

      }

    //  將本次轉(zhuǎn)換的結(jié)果的值  保存在最末的位置

    adc_buffer() = temp;

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

    下面這個是除以8 相當(dāng)于 右移動3位

    adc_buffer[[0] = adcbuffer >> 3

    //這樣就完成對ADC 轉(zhuǎn)換的結(jié)果進行了 平滑濾波

    }

    關(guān)閉窗口

    相關(guān)文章