68精品久久久久久欧美,最近中文字幕完整在线看一,久久亚洲男人天堂,最近中文字幕完整视频高清1

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

您現(xiàn)在的位置:首頁 新聞資訊 >> 新聞?lì)^條 >> N76E003的學(xué)習(xí)之路(ADC簡(jiǎn)單小例程篇)
新聞資訊
NEWS INFORMATION

N76E003的學(xué)習(xí)之路(ADC簡(jiǎn)單小例程篇)

關(guān)鍵字:MS51FB9AE 8位單片機(jī) 發(fā)布時(shí)間:2019-05-22

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

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

ADC最高時(shí)鐘頻率參考表


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


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

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

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

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

首先設(shè)置ADCEN(ADCCON1.0)位使能ADC電路,從而激活A(yù)DC電路

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

 

 

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

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

 

 

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

 

 首先設(shè)置ADCEN(ADCCON1.0)位使能ADC電路,從而激活A(yù)DC電路

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

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

 根據(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;這部分是一定要加的,因?yàn)樵陧?xiàng)目中必須要先清零在選擇通道,如果涉及多個(gè)通道切換,每個(gè)通道一定要加上這句,否則系統(tǒng)只會(huì)承認(rèn)上一個(gè)通道。

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

也就是說
Enable_ADC_AIN3;這個(gè)宏定義就是將ADC通道進(jìn)行初始化

 初始化完成,接下來來看應(yīng)用:

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

 

 

當(dāng)轉(zhuǎn)換完成后,硬件會(huì)自動(dòng)清除該位,同時(shí)置ADCF
(ADCCON0.7)位,如果之前ADC中斷已使能,則會(huì)產(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;啟動(dòng)AD轉(zhuǎn)換
#define set_ADCS ADCS = 1
while(ADCF == 0);由于其AD轉(zhuǎn)換完成后置位為一,可以進(jìn)行讀取當(dāng)前轉(zhuǎn)換結(jié)果,那么這行代碼的作用是等待該位置一,然后進(jìn)行讀數(shù)

printf ("\n Value = 0x%bx",ADCRH);
            printf ("\n Value = 0x%bx",ADCRL);
            Timer0_Delay1ms(100);
之后進(jìn)行串口打印
完整程序如下:
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);
    }
}
當(dāng)然這只是一個(gè)很簡(jiǎn)單的小程序,如果涉及復(fù)雜程序,歡迎交流。

接下來 就是ADC中斷部分


首先來講講中斷使能

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

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

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

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

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

#define set_EADC    EADC     = 1

可尋址指的是這個(gè)寄存器中各位值可以直接調(diào)用
如:可尋址的IE中有八位EA - ET2 ES ET1 EX1 ET0 EX0可以直接用ET2=1來操作;
不可尋址的TMOD只能用TMOD=0x00來控制其中的各位。N76E003這個(gè)寄存器是可尋址的。
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;將引腳設(shè)為準(zhǔn)雙向模式
 Enable_ADC_AIN0; 初始化0通道
set_EADC; 打開ADC中斷
EA = 1; 打開中斷
中斷服務(wù)函數(shù)
void ADC_ISR (void) interrupt 11
{
    clr_ADCF;                               //clear ADC interrupt flag
        printf ("\n Value = 0x%bx",ADCRH);
}

清楚標(biāo)志,并進(jìn)行打印高位的數(shù)值。

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

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

傳真:0755-82591176

郵箱:vicky@yingtexin.net

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

连江县| 清水河县| 平山县| 察雅县| 梁山县| 九龙坡区| 和田市| 吴忠市| 龙陵县| 确山县| 康平县| 大连市| 澎湖县| 尼玛县| 邛崃市| 古田县| 建昌县| 曲水县| 湘乡市| 孟连| 乐平市| 安国市| 雅江县| 馆陶县| 广昌县| 久治县| 五常市| 廉江市| 铜川市| 麦盖提县| 康平县| 黄山市| 太和县| 华容县| 钟山县| 三都| 庆安县| 宿松县| 巨鹿县| 任丘市| 阿合奇县|