日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

您好,歡迎進入深圳市穎特新科技有限公司官方網(wǎng)站!

您現(xiàn)在的位置:首頁 新聞資訊 >> 新聞頭條 >> N76E003的學習之路(ADC簡單小例程篇)
新聞資訊
NEWS INFORMATION

N76E003的學習之路(ADC簡單小例程篇)

關鍵字:MS51FB9AE 8位單片機 發(fā)布時間:2019-05-22

N76E003內(nèi)嵌12位逐次逼近寄存器型(SAR)的模擬數(shù)字轉(zhuǎn)換器(ADC)。模數(shù)轉(zhuǎn)換模塊負責將管腳上的模擬
信號轉(zhuǎn)換為12位二進制數(shù)據(jù)。N76E003支持8通道單端輸入模式。內(nèi)部帶隙電壓(band-gap voltage)為
1.22V,同時也可用作內(nèi)部ADC輸入端。所有模擬電路復用同一組采樣電路和同一組采樣保持電容。該組
采樣保持電容為轉(zhuǎn)換電路的輸入端。然后轉(zhuǎn)換器通過逐次逼近的方式得到有效結(jié)果并存放在ADC結(jié)果寄
存器中。

在開始ADC轉(zhuǎn)換前,通過設置ADCEN (ADCCON1.0)位使能ADC電路,從而激活ADC電路,由于ADC
模塊需要額外功耗,一旦ADC轉(zhuǎn)換模塊不再使用,建議清零ADCEN位關閉ADC模塊電路以節(jié)省功耗。
ADC轉(zhuǎn)換輸入管腳需要特別配置,通過ADCHS[2:0] 來選擇采樣所需要的ADC通道連接到采樣電路上。
同時,用戶需要通過PxMn寄存器把采樣所用的管腳配置為“輸入高阻模式” (input-only high
impedance) 。配置后用于ADC管腳與數(shù)字輸出電路將斷開,但數(shù)字輸入電路仍然可以工作,因此數(shù)字
輸入將可能產(chǎn)生漏電流。所以還需要通過配置AINDIDS寄存器相應位來關閉數(shù)字輸入緩沖區(qū)。如上配置
后,ADC輸入腳將變成純模擬輸入電路。同樣ADC采樣時鐘也需要認真考慮。

ADC最高時鐘頻率參考表


表 31-9. 當采樣時鐘設置超過最大值時,采樣結(jié)果數(shù)據(jù)為不可預測。


通過置ADCS位(ADCCON0.6)開啟AD轉(zhuǎn)換。當轉(zhuǎn)換完成后,硬件會自動清除該位,同時置ADCF
(ADCCON0.7)位,如果之前ADC中斷已使能,則會產(chǎn)生ADC中斷。轉(zhuǎn)換結(jié)果存放在ADCRH (高8位) 及
ADCRL (低4位)中。12位轉(zhuǎn)換結(jié)果值為REF

內(nèi)部及外部數(shù)字電路,可能影響采樣結(jié)果的準確度。所以如果需要高精準的轉(zhuǎn)換結(jié)果,請參考如下應
用,以降低噪聲電平干擾。
1. 模擬輸入腳盡量離芯片越近越好,避免管腳附近有高速數(shù)字電路經(jīng)過,并離高速數(shù)字電路越遠越好。
2. 在轉(zhuǎn)換過程中,將芯片進入空閑模式。
3. 如果模擬輸入腳AIN在系統(tǒng)中同時需要切換做數(shù)字管腳,請確保在轉(zhuǎn)換過程中不要做數(shù)字/模擬切換動
作。

現(xiàn)在我們可以根據(jù)功能描述來編寫程序

在開始ADC轉(zhuǎn)換前,通過設置ADCEN (ADCCON1.0)位使能ADC電路,從而激活ADC電路,由于ADC
模塊需要額外功耗,一旦ADC轉(zhuǎn)換模塊不再使用,建議清零ADCEN位關閉ADC模塊電路以節(jié)省功耗。
ADC轉(zhuǎn)換輸入管腳需要特別配置,通過ADCHS[2:0] 來選擇采樣所需要的ADC通道連接到采樣電路上。
同時,用戶需要通過PxMn寄存器把采樣所用的管腳配置為“輸入高阻模式” (input-only high
impedance) 。配置后用于ADC管腳與數(shù)字輸出電路將斷開,但數(shù)字輸入電路仍然可以工作,因此數(shù)字
輸入將可能產(chǎn)生漏電流。所以還需要通過配置AINDIDS寄存器相應位來關閉數(shù)字輸入緩沖區(qū)。如上配置
后,ADC輸入腳將變成純模擬輸入電路。同樣ADC采樣時鐘也需要認真考慮。

首先設置ADCEN(ADCCON1.0)位使能ADC電路,從而激活ADC電路

由于ADC模塊需要額外功耗,一旦ADC轉(zhuǎn)換模塊不再使用,建議清零ADCEN位關閉ADC模塊電路以節(jié)省功耗。

 

 

ADC轉(zhuǎn)換輸入管腳需要特別配置,通過ADCHS[2:0] 來選擇采樣所需要的ADC通道連接到采樣電路上。
同時,用戶需要通過PxMn寄存器把采樣所用的管腳配置為“輸入高阻模式” (input-only high
impedance) 。

用戶需要通過PxMn寄存器把采樣所用的管腳配置為“輸入高阻模式” (input-only high
impedance) 。

 

 

配置后用于ADC管腳與數(shù)字輸出電路將斷開,但數(shù)字輸入電路仍然可以工作,因此數(shù)字
輸入將可能產(chǎn)生漏電流。所以還需要通過配置AINDIDS寄存器相應位來關閉數(shù)字輸入緩沖區(qū)。如上配置
后,ADC輸入腳將變成純模擬輸入電路。同樣ADC采樣時鐘也需要認真考慮。

 

 首先設置ADCEN(ADCCON1.0)位使能ADC電路,從而激活ADC電路

ADC轉(zhuǎn)換輸入管腳需要特別配置,通過ADCHS[2:0] 來選擇采樣所需要的ADC通道連接到采樣電路上。
同時,用戶需要通過PxMn寄存器把采樣所用的管腳配置為“輸入高阻模式” (input-only high
impedance) 。

配置后用于ADC管腳與數(shù)字輸出電路將斷開,但數(shù)字輸入電路仍然可以工作,因此數(shù)字
輸入將可能產(chǎn)生漏電流。所以還需要通過配置AINDIDS寄存器相應位來關閉數(shù)字輸入緩沖區(qū)。如上配置
后,ADC輸入腳將變成純模擬輸入電路。同樣ADC采樣時鐘也需要認真考慮。

 根據(jù)上述內(nèi)容,程序具體如下:

Enable_ADC_AIN3; // Enable AIN0 P1.7 as ADC input, Find in "Function_define.h" - "ADC INIT"

#define Enable_ADC_AIN3 ADCCON0&=0xF0;ADCCON0|=0x03;P06_Input_Mode;AINDIDS=0x00;AINDIDS|=SET_BIT3;ADCCON1|=SET_BIT0 //P06
ADCCON0&=0xF0;ADCCON0|=0x03;這部分的意思是選中引腳3 具體看上面的ADCCON0部分  //注意
ADCCON0&=0xF0;這部分是一定要加的,因為在項目中必須要先清零在選擇通道,如果涉及多個通道切換,每個通道一定要加上這句,否則系統(tǒng)只會承認上一個通道。

P06_Input_Mode;是將通道三即P06引腳設為輸入高阻模式,
#define P00_Input_Mode                P0M1|=SET_BIT0;P0M2&=~SET_BIT0
 P0M1|=SET_BIT0;P0M2&=~SET_BIT0 這部分看上文配置即可
AINDIDS=0x00;AINDIDS|=SET_BIT3;這部分意思是將第三通道數(shù)字輸入功能關閉,由此三通道即P06引腳將變成純模擬輸入
ADCCON1|=SET_BIT0  是將ADCEN使能位使能 

也就是說
Enable_ADC_AIN3;這個宏定義就是將ADC通道進行初始化

 初始化完成,接下來來看應用:

通過置ADCS位(ADCCON0.6)開啟AD轉(zhuǎn)換。

 

 

當轉(zhuǎn)換完成后,硬件會自動清除該位,同時置ADCF
(ADCCON0.7)位,如果之前ADC中斷已使能,則會產(chǎn)生ADC中斷。

 

轉(zhuǎn)換結(jié)果存放在ADCRH (高8位) 及ADCRL (低4位)中。12位轉(zhuǎn)換結(jié)果值為REF

程序如下:

while(1)
    {
            clr_ADCF;
            set_ADCS;                                    // ADC start trig signal
            while(ADCF == 0);
            printf ("\n Value = 0x%bx",ADCRH);
            printf ("\n Value = 0x%bx",ADCRL);
            Timer0_Delay1ms(100);
    }
 clr_ADCF;以防萬一,軟件清零
#define clr_ADCF    ADCF     = 0

 

 set_ADCS;啟動AD轉(zhuǎn)換
#define set_ADCS ADCS = 1
while(ADCF == 0);由于其AD轉(zhuǎn)換完成后置位為一,可以進行讀取當前轉(zhuǎn)換結(jié)果,那么這行代碼的作用是等待該位置一,然后進行讀數(shù)

printf ("\n Value = 0x%bx",ADCRH);
            printf ("\n Value = 0x%bx",ADCRL);
            Timer0_Delay1ms(100);
之后進行串口打印
完整程序如下:
void main (void) 
{
        InitialUART0_Timer1(115200);
 
        Enable_ADC_AIN3;                        // Enable AIN0 P1.7 as ADC input, Find in "Function_define.h" - "ADC INIT"
        while(1)
    {
            clr_ADCF;
            set_ADCS;                                    // ADC start trig signal
      while(ADCF == 0);
            printf ("\n Value = 0x%bx",ADCRH);
            printf ("\n Value = 0x%bx",ADCRL);
            Timer0_Delay1ms(100);
    }
}
當然這只是一個很簡單的小程序,如果涉及復雜程序,歡迎交流。

接下來 就是ADC中斷部分


首先來講講中斷使能

每一個中斷源都可以通過各自的中斷使能位開啟或關閉,這些位在IE和EIE特殊功能寄存器SFRs中。有一個全局使能中斷EA(IE.7)位,清0將關閉所有中斷,置位啟用已單獨使能了的中斷,清0不管單獨的中斷源,是否使能了都關閉所有中斷。注意:當EA為0時有中斷請求,所有中斷會被掛起直到EA恢復為1,才去執(zhí)行該中斷。所有中斷標志位可以用軟件置位,也可以用軟件啟動中斷。
注意:每一個中斷產(chǎn)生時對應中斷標志位都會被置1,不管是通過硬件還是軟件。用戶在中斷服務程序里應該小心處理中斷標志位,大多數(shù)中斷標志位都是寫0清除,這樣可以避免遞歸中斷請求。

中斷服務
中斷標志位在每個系統(tǒng)時鐘周期都會被采樣。在同一個周期內(nèi),被采樣到的中斷和優(yōu)先級都會被解決。如果滿足特定的條件硬件將執(zhí)行內(nèi)部產(chǎn)生的LCALL指令,目標地址是中斷向量地址。能產(chǎn)生LCALL條件如下:
1. 沒有相同或更高優(yōu)先級中斷服務程序在執(zhí)行。
2.當前查詢中斷標志周期正好是當前執(zhí)行指令的最后一個周期。
3. 當前指令不是寫任何中斷使能位或優(yōu)先級位且也不能是中斷返回指令RETI。
如果以上任何一個條件不滿足,就不能產(chǎn)生LCALL指令。在每一個指令周期都會重新檢測中斷標志。當某個中斷標志位被置起,但沒有滿足上述條件都不會被響應,即使后面滿足上述條件,沒有立即執(zhí)行的中斷仍然不會執(zhí)行LCALL指令。這個中斷標志生效,但沒有進入中斷服務程序,下一個指令周期需要重新檢測中斷標志。

處理器響應一個有效的中斷,通過執(zhí)行一個LCALL 指令將程序轉(zhuǎn)移到中斷入口地址。對應的中斷標志根據(jù)不同的中斷源在執(zhí)行中斷服務程序時,可能被硬件清除,也可能不被清除。硬件LCALL與軟件LCALL指令相同,執(zhí)行LCALL指令,保存程序計數(shù)器PC內(nèi)容到堆棧,但不保存程序狀態(tài)字PSW,PC指針重新裝載產(chǎn)生中斷的中斷向量地址,從向量地址繼續(xù)執(zhí)行程序直到執(zhí)行RETI指令。在執(zhí)行RETI指令時,處理器彈出堆棧,將棧頂內(nèi)容加載到程序計數(shù)器PC。用戶必須注意堆棧的狀態(tài),如果堆棧的內(nèi)容被修改,處理器不會被通知,將會從堆棧加載的地址繼續(xù)執(zhí)行。注,RET指令與RETI指令表現(xiàn)相同,但它不會通知中斷控制器中斷服務已經(jīng)完成,致使控制器認為中斷服務仍在進行。使中斷不可能再產(chǎn)生。

中斷的目的是讓軟件處理非常規(guī)或異步的事件。N76E003有 4個中斷優(yōu)先級、18個中斷源。每個中斷源都有獨立的優(yōu)先級、標志位、中斷向量和使能位。另外,中斷可被全局使能或關閉。當中斷發(fā)生時,CPU將執(zhí)行對應的中斷服務子程序(ISR)。 ISR被分配到預先指定的地址如中斷向量表表20-1.中斷向量. 如果中斷使能,當中斷發(fā)生時,CPU 將根據(jù)中斷源跳轉(zhuǎn)到相應的中斷向量地址,執(zhí)行此地址處的程序,保持中斷服務狀態(tài)直到執(zhí)行中斷服務程序ISR。 一旦ISR 開始執(zhí)行, 僅能被更高優(yōu)先級的中斷搶占。 ISR 通過指令RETI返回,該指令強迫CPU回到中斷發(fā)生前所執(zhí)行指令的下一條指令。

從上表可以看出,EADC是使能ADC中斷的指令,所以有了下面的這行代碼

#define set_EADC    EADC     = 1

可尋址指的是這個寄存器中各位值可以直接調(diào)用
如:可尋址的IE中有八位EA - ET2 ES ET1 EX1 ET0 EX0可以直接用ET2=1來操作;
不可尋址的TMOD只能用TMOD=0x00來控制其中的各位。N76E003這個寄存器是可尋址的。
void main (void) 
{
    Set_All_GPIO_Quasi_Mode;
        InitialUART0_Timer1(115200);
/*---------------------------------------------------------------
    ADC port trig initial setting toggle P0.4 to start ADC 
----------------------------------------------------------------*/
        Enable_ADC_AIN0;                                                            // Enable AIN0 P1.7 as ADC pin
        P04_FALLINGEDGE_TRIG_ADC;                                            // P0.4 falling edge as adc start trig signal
// find ADC result in ADC interrupt
    set_EADC;                                                                            // Enable ADC interrupt (if use interrupt)
        EA = 1;                                                                                // Enable global interrupt
//    set_ADCS;                                                                            // Trig P04 falling edge to start adc, no need set ADCS bit
        while(1);                                                                            // Wait ADC interrupt


}

Set_All_GPIO_Quasi_Mode;將引腳設為準雙向模式
 Enable_ADC_AIN0; 初始化0通道
set_EADC; 打開ADC中斷
EA = 1; 打開中斷
中斷服務函數(shù)
void ADC_ISR (void) interrupt 11
{
    clr_ADCF;                               //clear ADC interrupt flag
        printf ("\n Value = 0x%bx",ADCRH);
}

清楚標志,并進行打印高位的數(shù)值。

先開始轉(zhuǎn)換然后打開中斷,然后進行配置。

 
聯(lián)系方式0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

涟源市| 巴东县| 沈丘县| 武乡县| 田东县| 隆子县| 昌都县| 二连浩特市| 措美县| 香格里拉县| 云阳县| 勐海县| 团风县| 东宁县| 汉中市| 太和县| 普洱| 孟村| 安福县| 股票| 同德县| 江津市| 丰台区| 会理县| 临漳县| 桐庐县| 文登市| 山阳县| 左贡县| 温宿县| 格尔木市| 扎赉特旗| 延津县| 美姑县| 营山县| 三亚市| 洞口县| 泰宁县| 阿鲁科尔沁旗| 通海县| 资溪县|