<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > SAM4E單片機(jī)之旅——18、通過AFEC(ADC)獲取輸入的電壓

          SAM4E單片機(jī)之旅——18、通過AFEC(ADC)獲取輸入的電壓

          作者: 時(shí)間:2017-04-17 來源:網(wǎng)絡(luò) 收藏

            很多時(shí)候,一個(gè)電壓不僅僅需要定性(高電平或者低電平),而且要定量(了解具體電壓的數(shù)值)。這個(gè)時(shí)候就可以用到模數(shù)轉(zhuǎn)換器()了。這次的內(nèi)容是測(cè)量開發(fā)板搭載的滑動(dòng)變阻器(VR1)的電壓,然后把轉(zhuǎn)換的結(jié)果通過UART打印出來。同時(shí),也簡(jiǎn)單介紹了校準(zhǔn)的方法。

          本文引用地址:http://www.ex-cimer.com/article/201704/346682.htm

            芯片中,是由AFEC管理的。同時(shí),AFEC可以使用一個(gè)多路復(fù)用器以選擇需要轉(zhuǎn)換的信號(hào)的通道,也可以通過平均多次ADC轉(zhuǎn)換的結(jié)果以提高轉(zhuǎn)換精確度。

            一、 電路圖

          image

            通過順時(shí)針方向旋轉(zhuǎn)該變阻器,PB1引腳電壓將變大,其電壓變化范圍為0—3.3V。使用的AFEC為AFEC0,通道編號(hào)為5。

          image

            通過JP3可以選擇參考電壓的大小。默認(rèn)情況下,參考電壓為3.3 V。

            需要注意的是,而在JP3短接2、3腳時(shí),參考電壓為3.0 V。

            二、 ADC電氣特性

          image

            該AFEC有效的時(shí)鐘范圍為1—20 MHz,最大采樣頻率是1 MHz。同時(shí)也需記下啟動(dòng)、跟蹤、設(shè)置等時(shí)間,這在使用AFEC時(shí)會(huì)用到。另外,傳送時(shí)間在芯片手冊(cè)中沒有詳細(xì)說明,只說明將TRANSFER字段設(shè)置為1。

            由于需要使用較高波特率進(jìn)行UART通信,所以將MCK設(shè)置為96 MHz。在此情況下,能設(shè)置的最高的AFEC時(shí)鐘頻率為16 MHz(將AFEC_MR的PRESCAL參數(shù)設(shè)置為2),即每個(gè)AFEC時(shí)鐘的周期為62.5 ns。

            由此可以計(jì)算出,從關(guān)閉狀態(tài)下,完全啟動(dòng)AFEC最多需要512個(gè)AFEC時(shí)鐘。在實(shí)際應(yīng)用中,這個(gè)數(shù)字可以減小。

            三、 AFEC初始化

            準(zhǔn)備工作為將MCK設(shè)置為96 MHz,開啟UART并讓printf通過UART輸出。

            PMC及GPIO設(shè)置。

            AFEC工作模式。有兩個(gè)寄存器可以設(shè)置AFEC的工作模式:

            AFEC0->AFEC_MR =

            AFEC_MR_TRGEN_DIS // 關(guān)閉硬件觸發(fā)

            | AFEC_MR_SLEEP // 轉(zhuǎn)換完成后進(jìn)入睡眠模式

            | AFEC_MR_PRESCAL(2) // AFEC CLK = 96M / 6 = 16 M

            | AFEC_MR_STARTUP_SUT512 // MAX 32 us

            | AFEC_MR_SETTLING_AST3 // MIN 100 ns

            | AFEC_MR_ANACH_ALLOWED

            | AFEC_MR_TRACKTIM(2) // MIN 160 ns

            | AFEC_MR_TRANSFER(1)

            | AFEC_MR_USEQ_NUM_ORDER

            ;

            AFEC0->AFEC_EMR =

            AFEC_EMR_RES_NO_AVERAGE // 進(jìn)行 12bit 采樣

            ;

            設(shè)置增益參數(shù)及關(guān)閉差分模式:

          AFEC0->AFEC_CGR = AFEC_CGR_GAIN5(0);

            AFEC0->AFEC_DIFFR &= ~((uint32_t)1 << 5); // 不使用差分模式

            啟用通道:

            1AFEC0->AFEC_CHER = AFEC_CHER_CH5;

            四、 實(shí)現(xiàn)

            轉(zhuǎn)換指定通道的輸入

            uint16_t GetADCValue(int ch)

            {

            // 軟觸發(fā)以開始轉(zhuǎn)換

            AFEC0->AFEC_CR = AFEC_CR_START;

            // 等待轉(zhuǎn)換完成(通過查詢相應(yīng)的EOC位判斷轉(zhuǎn)換是否完成)

            while ((AFEC0->AFEC_ISR & (1<<CH) )="=" 0);< p> 

            // 設(shè)置通道選擇寄存器,使AFEC_CDR顯示指定通道的轉(zhuǎn)換結(jié)果

            AFEC0->AFEC_CSELR = AFEC_CSELR_CSEL(ch);

            return AFEC0->AFEC_CDR;

            }

            輪詢滑動(dòng)變阻器的電壓,并在電壓波動(dòng)超過指定閥值時(shí)打印出當(dāng)前電壓。

            const int min_diff = 10; // 閥值

            int diff;

            uint16_t adcv; // ADC轉(zhuǎn)換的結(jié)果

            uint16_t last_adcv = ~0;

            while(1){

            adcv = GetADCValue(5);

            //判斷電壓波動(dòng)是否超過閥值

            diff = (int32_t)adcv - last_adcv;

            if (!(diff > (-min_diff) && diff < min_diff))

            {

            last_adcv = adcv;

            printf("%dnr", (int)adcv);

            }

            // 等待

            for (volatile int i=0; i< 0xFFFF; ++i);

            }

            五、 校準(zhǔn)

            在運(yùn)行該示例時(shí),發(fā)現(xiàn)當(dāng)滑動(dòng)變阻器VR1逆時(shí)鐘旋至極限,即PB1引腳電壓為0V時(shí),ADC的輸出為2048左右。而當(dāng)PB1電壓約為3.3 V的一半時(shí),ADC輸出值約為4095——即達(dá)到輸出的最大值。

            可以推測(cè)出存在一個(gè)約為2048的偏移誤差。這個(gè)誤差在一個(gè)ASF的示例中被提及:“AFEC內(nèi)部的偏移為0x800……”。所以我們需要對(duì)此進(jìn)行校準(zhǔn):

            AFEC0->AFEC_CSELR = 5;

            //AFEC內(nèi)部偏移為 0x800

            //該校準(zhǔn)在參考電壓為3.3V 時(shí)有效

            AFEC0->AFEC_COCR = AFEC_COCR_AOFF(0x800);

            AFEC_COCR的寄存器是作用于AFEC內(nèi)部的DAC的:

          image

            同時(shí),通過該模塊圖也可以知道增益與偏移校準(zhǔn)作用于輸入V的方式如下:

            偏移電壓:

            V_offset = ( offset / 4096 ) * V_ref

            ADC進(jìn)行轉(zhuǎn)換的電壓:

            V_adc_in = ( V – V_offset) * gain

            最后,將轉(zhuǎn)換的數(shù)值加上0x800。



          關(guān)鍵詞: SAM4E ADC

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();