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

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

        AVR單片機多路ADC轉換程序

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年04月25日   【字體:

         AVRAD轉換使用注意: 絕對的應用經驗!

         
        1、注意采樣保持時間要足夠長 最少62us
        2、注意AREF的穩定性
        3、注意懸空的引腳無意義
        4、注意切換通道后首次測量結果應該舍棄
         
        AVR各種學習開發工具 搜索 “SHOP AVRVI”
         
        給你一個tiny13寫的多路AD采集的例子。
        僅提供思路的主要部分,其余部分暫不方便提供,ICC編寫。
         
        程序自動采集并放入數組中,需要使用前調用GetAD將結果存到多維數組搜索的最后,四個數取平均。
         
        volatile unsigned char time_count=0,AD_datai=0,channer=0;
        volatile unsigned char AD_data_buf[3][4];
        unsigned char AD_sel[3]={0x00,0x03,0x02}; //對應P1 P2 P3 選通為AD輸入
         
        #pragma interrupt_handler adc_isr:10
        void adc_isr(void)
        {
        //conversion complete, read value (int) using...
        // value=ADCL;         //Read 8 low bits first (important)
        // value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
        unsigned int value;
        value=ADCL;
        value|=(int)ADCH << 8;
        AD_datai--;
         
        if(AD_datai<4) //切換通道后首次結果拋棄,即=4拋棄
        {
          AD_data_buf[channer][AD_datai]=value;
        }
        if(AD_datai==0)
          {
            AD_datai=5;
            channer++;
            if(channer==3) channer=0;
            ADCMUX = AD_sel[channer];         //切換通道
           }
         
        ADCSRA = 0xEE; //再次啟動AD
        }
         
        // ADC initialize
        // Conversion time: 86uS
         
        void adc_init(void)
        {
        ADCSRA = 0x00; //disable adc
        // ADCMUX = 0x03; //第二腳 ADC3 PB3 作為AD輸入通道,10位精度 右對齊,VCC做參考電壓
        ADCMUX = 0x00;
        ACSR = 0x80;   //禁用模擬比較器
        ADCSRB = 0x00; //自動觸發 連續轉換模式
        ADCSRA = 0xEE; //ADC使能,ADC開始轉換,ADC自動觸發使能,ADC中斷使能,128預分頻
        DIDR0 = ((1<<ADC1D)| (1<<ADC2D)| (1<<ADC3D)); //禁用ADC123的數字緩沖功能 以降低功耗
        }
         
        //將AD結果放到多維數組最后
        void GetAD(void)
        {
        unsigned int ADtemp=0;
        unsigned char i=0,cha=0;
        for(cha=0;cha<3;cha++)
        {
            for(i=0;i<4;i++)
            {
            ADtemp+=AD_data_buf[cha][i];
            }
            AD_data_buf[cha][4]=ADtemp>>2; //除以4
        }
        關閉窗口

        相關文章

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