您好,歡迎進入深圳市穎特新科技有限公司官方網(wǎng)站!
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)換然后打開中斷,然后進行配置。
上一篇:在線電路編程 (ICP)