LPC1343內(nèi)部ADC的使用
這次仍然以NXP提供的example作為例子,但是LPC1343內(nèi)部ADC工作方式眾多,所以該example用了許多的預(yù)編譯結(jié)構(gòu),筆者在此將本次實驗不會用到的語句全部去掉,程序變得簡潔,也更易于理解。
同樣的,在此節(jié)中將不再將所用到的寄存器一一列出,而只是一個各個寄存器設(shè)置的“線索”,因為至此各個讀者一定已經(jīng)擁有了自己翻閱用戶手冊查看對應(yīng)寄存器內(nèi)容的能力。
從主函數(shù)我們可以看出本次實驗的進(jìn)展過程:
int main (void)
{
}
大家應(yīng)該在幾個8位單片機(jī)上都設(shè)計過這種ADC轉(zhuǎn)換程序,相信大家也肯定經(jīng)歷過這個基礎(chǔ)的過程。
UART的初始化在上一節(jié)已經(jīng)詳述了,我們直接來看看ADC的初始化ADCInit():
void ADCInit( uint32_t ADC_Clk )
{
#if ADC_INTERRUPT_FLAG
#endif
}
1、該函數(shù)唯一的參數(shù)填入欲設(shè)置的ADC工作速率,單位是Hz,本次實驗填入4500000,即4.5MHz;
2、ADC初始化不同于前面其他設(shè)備的一個地方,在于它的電源是默認(rèn)關(guān)閉的,所以首先要打開它的電源,明顯是一個降低功耗的措施;
3、ADC的工作速率,從用戶手冊可以查看到如下描述:
The APB clock (PCLK) is divided by CLKDIV +1 to produce the clock for the ADC, which should be less than or equal to 4.5 MHz.由此我們知道該ADC的最大驅(qū)動時鐘頻率是4.5MHz。同時分頻數(shù)是CLKDIV +1,所以程序中要“ADC_Clk-1”,至于為什么要左移8位呢?那是因為設(shè)置的分頻數(shù)是存放于ADCCR(ADC控制寄存器)中的第8:15位。
4、如果使用中斷功能,則除了要設(shè)置NVIC控制器之外,還需要在ADCINTEN中打開各個通道的中斷功能,當(dāng)某通道轉(zhuǎn)換完成時,會觸發(fā)對于中斷。
初始化完畢之后,就可以開啟ADC進(jìn)行轉(zhuǎn)換了。首先是ADCRead():
uint32_t ADCRead( uint8_t channelNum )
{
}
1、本函數(shù)要求填入的唯一參數(shù)是所希望進(jìn)行ADC的通道號;
2、轉(zhuǎn)換前應(yīng)該清除上一次通道被選狀態(tài);
3、在CR控制器中的26:24位控制著ADC的多種轉(zhuǎn)換啟動方式,本實驗中使用最普通的一種:立即開始轉(zhuǎn)換。
4、因為本實驗使用了ADC的中斷功能,轉(zhuǎn)換結(jié)果在ADC中斷中存儲,所以此函數(shù)在使用ADC中斷功能的情況下返回的是轉(zhuǎn)換的通道號。
ADC中斷功能的情況下返回的是轉(zhuǎn)換的通道號。
所以當(dāng)本函數(shù)運(yùn)行結(jié)束之后,ADC轉(zhuǎn)換開始,等待進(jìn)入中斷服務(wù)函數(shù):
void ADC_IRQHandler (void)
{
}
1、進(jìn)入中斷服務(wù)程序之后,首先停止AD轉(zhuǎn)換;
2、和UART一樣,ADC中斷標(biāo)志也是通過讀取來清除的;
3、首先要檢查溢出錯誤,如果有,則數(shù)據(jù)無效,要通道讀取來清除ADC轉(zhuǎn)換數(shù)據(jù)寄存器(ADCDR);
4、ADC中斷有兩種,一種是任何一個通道完成轉(zhuǎn)換都會觸發(fā),一種是某個中斷完成轉(zhuǎn)換就會觸發(fā),本實驗中兩種中斷都打開了,因此先判斷是否有轉(zhuǎn)換完成,再判斷是哪個通道完成轉(zhuǎn)換;
中斷函數(shù)的結(jié)束意味著讀取完成,剩下的就是將讀出數(shù)據(jù)發(fā)送到UART去顯示了。但在這之前,因為LPC1343的ADC默認(rèn)情況下是10位精度,而我們的UART是以字符為數(shù)據(jù)長度發(fā)送的,所以筆者特意將轉(zhuǎn)換結(jié)果轉(zhuǎn)換成了16位長度,分兩次發(fā)送?,F(xiàn)將本次實驗運(yùn)行過程概況如下:
UART初始化——ADC初始化——開始轉(zhuǎn)換——轉(zhuǎn)換結(jié)束觸發(fā)中斷——判斷有無錯誤——有錯誤則放棄無效數(shù)據(jù),無錯誤則讀出有效數(shù)據(jù)——數(shù)據(jù)處理——發(fā)至UART
附上運(yùn)行結(jié)果jpg兩張,第一張,0通道引腳接在GND:
第二張,0通道接在VCC 3.3:
理論上3.3V為滿賦值,轉(zhuǎn)換結(jié)果應(yīng)該是是11 1111 1111=0x3ff,不過實際并非如此,說明其實我們板子上引出的電源還是有一定波動的。
評論