<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        AVR 單片機學習(十)ATmega16 ADC

        作者:zww 1988   來源:本站原創   點擊數:  更新時間:2014年04月18日   【字體:
        模數轉換技術概述
      2. 性能指標:速度與精度
      3. AVR 的模數轉換器





      4.  

        轉換速率:每秒鐘采樣的次數。常用單位: 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 轉換的結果進行了 平滑濾波

        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮