在電子世界中,市場上有多種模擬傳感器用于測量溫度、速度、位移、壓力等。模擬傳感器用于產(chǎn)生隨時間不斷變化的輸出。這些來自模擬傳感器的信號的值往往很小,從幾微伏 (uV) 到幾毫伏 (mV),因此需要某種形式的放大。為了在微控制器中使用這些模擬信號,我們需要將模擬信號轉(zhuǎn)換為數(shù)字信號,因為微控制器只理解和處理數(shù)字信號。因此,大多數(shù)微控制器都有一個內(nèi)置的重要功能,稱為ADC(模數(shù)轉(zhuǎn)換器)。我們的微控制器ARM7-LPC2148還具有 ADC 功能。
在本教程中,我們將了解如何在 ARM7-LPC2148 中使用 ADC,方法是向模擬引腳提供不同的電壓,并在模數(shù)轉(zhuǎn)換后將其顯示在16x2 LCD 屏幕上。
什么是ADC?
如前所述,ADC 代表模數(shù)轉(zhuǎn)換,它用于將模擬值從現(xiàn)實世界轉(zhuǎn)換為數(shù)字值,如 1 和 0。那么這些模擬值是什么?這些是我們在日常生活中看到的,例如溫度、速度、亮度等。這些參數(shù)由各自的傳感器作為模擬電壓測量,然后這些模擬值被轉(zhuǎn)換為微控制器的數(shù)字值。
讓我們假設(shè)我們的 ADC 范圍是從 0V 到 3.3V,并且我們有一個 10 位 ADC,這意味著我們的輸入電壓 0-3.3 伏將被分成 1024 個離散模擬值級別(2 10 = 1024)。含義 1024 是 10 位 ADC 的分辨率,類似地,8 位 ADC 的分辨率為 512 (28),16 位 ADC 的分辨率為 65,536 (216)。LPC2148 具有 10 位分辨率 ADC。
這樣,如果實際輸入電壓為 0V,那么 MCU 的 ADC 會將其讀取為 0,如果為 3.3V,則 MCU 將讀取 1024,如果介于 1.65v 之間,則 MCU 將讀取 512。我們可以使用下面的根據(jù) ADC 的分辨率和工作電壓計算 MCU 將讀取的數(shù)字值的公式。
(ADC 分辨率 / 工作電壓) = (ADC 數(shù)字值 / 實際電壓值)
例如,如果參考電壓為 3v:
我們在上一篇文章中詳細(xì)解釋了 ADC。
ARM7-LPC2148 中的 ADC
LPC2148 包含兩個模數(shù)轉(zhuǎn)換器。
這些轉(zhuǎn)換器是單個 10 位逐次逼近模數(shù)轉(zhuǎn)換器。
ADC0 有六個通道,ADC1 有八個通道。
因此, LPC2148 的可用 ADC 輸入總數(shù)為 14 。
它僅轉(zhuǎn)換(0 至 3.3V)范圍內(nèi)的輸入電壓。它不能超過 3.3V 的參考電壓。因為它會損壞 IC 并提供不確定的值。
LPC2148中ADC的一些重要特性
每個轉(zhuǎn)換器每秒能夠執(zhí)行超過 400000 個 10 位樣本。
每個模擬輸入都有一個專用的結(jié)果寄存器來減少中斷開銷。
單個或多個輸入的突發(fā)轉(zhuǎn)換模式。
輸入引腳或定時器匹配信號轉(zhuǎn)換時的可選轉(zhuǎn)換。
兩個轉(zhuǎn)換器的全局啟動命令。
ARM7-LPC2148 中的 ADC 引腳
如前所述,在 ARM7-LPC2148 中有兩個通道 ADC0 帶有 6 個模擬輸入引腳和 ADC1 帶有 8 個模擬輸入引腳。所以總共有14個模擬輸入引腳。下圖顯示了可用于模擬輸入的引腳。
由于 ADC 輸入引腳與其他 GPIO 引腳復(fù)用。我們需要通過配置PINSEL 寄存器來啟用它們以選擇 ADC 功能。
下表顯示了 LPC2148 中 ADC 的引腳和相應(yīng)的 ADC 通道號。AD0 為通道 0,AD1 為通道 1
ARM7-LPC2148 中的 ADC 寄存器
寄存器用于編程以使用 LPC2148 中的 A/D 轉(zhuǎn)換功能。
以下是 LPC2148 中用于 A/D 轉(zhuǎn)換的寄存器列表
1. ADCR:模數(shù)控制寄存器
用途:該寄存器用于配置LPC2148中的A/D轉(zhuǎn)換器
2.ADGDR:模數(shù)全局?jǐn)?shù)據(jù)寄存器
用途:該寄存器有 A/D 轉(zhuǎn)換器的 DONE 位,轉(zhuǎn)換的結(jié)果存儲在這里。
用途:這是一個中斷允許寄存器。
4. ADDR0 – ADDR7:模數(shù)通道數(shù)據(jù)寄存器
用途:該寄存器包含各個通道的 A/D 值。
5. ADSTAT:模數(shù)狀態(tài)寄存器。
用途:該寄存器包含各個 ADC 通道的 DONE 標(biāo)志以及各個 ADC 通道的 OVERRUN 標(biāo)志。
在本教程中,我們將僅使用 ADCR 和 ADGDR 寄存器。讓我們詳細(xì)了解它們
LPC2148 中的 ADxCR 寄存器
AD0CR & AD1CR 分別用于通道 0 和通道 1。它是一個 32 位寄存器。下表顯示了 ADCR 寄存器的位域。
讓我們看看如何配置單個寄存器
1. SEL:(0 到 7)位用于選擇 ADC 轉(zhuǎn)換的通道。為每個通道分配一位。例如,設(shè)置 Bit-0 將使 ADC 對 AD0.1 進行采樣以進行轉(zhuǎn)換。設(shè)置位-1將使AD0.1;同樣設(shè)置第 7 位將為 AD0.7 進行轉(zhuǎn)換。重要的一步是我們根據(jù)我們使用的端口有 PINSEL,例如 PLC2148 中 PORT0 的 PINSEL0。
2. CLCKDIV:(8 到 15)位用于時鐘除數(shù)。這里將 APB 時鐘(ARM 外設(shè)總線時鐘)除以該值加 1 以產(chǎn)生 A/D 轉(zhuǎn)換器所需的時鐘,由于我們在 LPC2148 中使用逐次逼近法,該時鐘應(yīng)小于或等于 4.5 MHz。
3. BURST:第 16 位用于 BURST 轉(zhuǎn)換模式。
設(shè)置 1:ADC 將對在 SEL 位中選擇的所有通道進行轉(zhuǎn)換。
設(shè)置 0:將禁用 BURST 轉(zhuǎn)換模式。
4. CLCKS:(17 到 19)三個位用于選擇突發(fā)模式下 A/D 轉(zhuǎn)換的分辨率和時鐘數(shù),因為它是連續(xù) A/D 轉(zhuǎn)換模式。
5. PDN:第 21 位用于選擇LPC2148 中 ADC 的掉電模式。
A/D 處于 PDN 模式。
A/D 處于操作模式
6. START:(24 到 26)位用于 START。當(dāng) BURST 轉(zhuǎn)換模式通過設(shè)置 0 關(guān)閉時,這些 START 位對于何時開始 A/D 轉(zhuǎn)換很有用。START 也用于邊沿控制轉(zhuǎn)換。即當(dāng) LPC2148 的 CAP 或 MAT 引腳有輸入時,A/D 開始轉(zhuǎn)換。讓我們檢查下表
7. EDGE:第 27位用于 EDGE,僅當(dāng) START 位包含 010-111 時使用。它在有 CAP 或 MAT 輸入時開始轉(zhuǎn)換,您可以在上表中看到。
設(shè)置:0 -在下降沿
1 - 在上升沿
ADxGDR:ADC 全局?jǐn)?shù)據(jù)寄存器
AD0GDR 和 AD1GDR 分別用于 ADC 通道 0 和 ADC 通道 1。
它是一個 32 位的寄存器,包含 A/D 轉(zhuǎn)換的 RESULT 以及指示 A/D 轉(zhuǎn)換完成的 DONE 位。下表顯示了 ADGDR 寄存器的位域。
1. RESULT:這些位(6 到 15)包含 ADCR SEL 寄存器中所選通道的 A/D 轉(zhuǎn)換結(jié)果。該值僅在 A/D 轉(zhuǎn)換完成后才被讀取,這由DONE位指示。
示例:對于 10 位 ADC 結(jié)果,存儲的值從(0 到 1023)變化。
2. CHANNEL:這些位 24 到 26 包含完成 A/D 轉(zhuǎn)換的通道號。轉(zhuǎn)換后的數(shù)字值出現(xiàn)在 RESULT 位中。
示例:000 用于 ADC 通道 0,001 用于 ADC 通道 1,依此類推
3. OVERRUN:OVERRUN的第 30位用于 BURST 模式。當(dāng)設(shè)置為 1 時,先前轉(zhuǎn)換的 ADC 值被新轉(zhuǎn)換的 ADC 值覆蓋。當(dāng)寄存器被讀取時,它會清除 OVERRUN 位。
4. DONE:第 31 位為 DONE 位。
設(shè)置 1:當(dāng) A/D 轉(zhuǎn)換完成時。
設(shè)置 0:讀取寄存器并寫入 ADCR 時。
我們已經(jīng)了解了 LPC2148 中 ADC 中使用的重要寄存器。現(xiàn)在讓我們開始在 ARM7 中使用 ADC。
所需組件
硬件
ARM7-LPC2148 微控制器
3.3V穩(wěn)壓IC
5V穩(wěn)壓IC
10K 電位器 – 2 個
LED(任何顏色)
液晶顯示(16X2)
9V電池
面包板
連接電線
軟件
凱爾uVision5
魔法閃光工具
電路原理圖
下表顯示了LCD 和 ARM7-LPC2148 之間的電路連接。
ARM7-LPC2148液晶顯示器 (16x2)
P0.4RS(寄存器選擇)
P0.6E(啟用)
P0.12D4(數(shù)據(jù)引腳 4)
P0.13D5(數(shù)據(jù)引腳 5)
P0.14D6(數(shù)據(jù)引腳 6)
P0.15D7(數(shù)據(jù)引腳 7)
重要提示:這里我們使用了兩個穩(wěn)壓器 IC,一個用于 5V LCD 顯示屏,另一個用于模擬輸入,可以通過電位器改變 3.3V。
5V 穩(wěn)壓器與 LCD 和 ARM7 Stick之間的連接
5V穩(wěn)壓IC引腳功能LCD & ARM-7 LPC2148
1.左銷+ Ve 來自電池 9V 輸入數(shù)控
2.中心銷- 來自電池的 VeLCD的VSS,R/W,K
ARM7的GND
3.右銷穩(wěn)壓 +5V 輸出LCD的VDD,A
+5V ARM7
帶液晶顯示器的電位器
電位器用于改變 LCD 顯示屏的對比度。一個電位器有三個引腳,左引腳 (1) 連接到 +5V,中間引腳 (2) 連接到 LCD 模塊的 VEE 或 V0,右引腳 (3) 連接到 GND。我們可以通過轉(zhuǎn)動旋鈕來調(diào)整對比度。
LPC2148 & 電位器與 3.3V 穩(wěn)壓器之間的連接
3.3V穩(wěn)壓IC引腳功能 ARM-7 LPC2148
1.左銷- 來自電池的 Ve接地腳
2.中心銷穩(wěn)壓 +3.3V 輸出至電位器輸入,電位器輸出至P0.28
3.右銷+ Ve 來自電池 9V 輸入數(shù)控
為 ADC 編程 ARM7-LPC2148
要對 ARM7-LPC2148 進行編程,我們需要 keil uVision 和 Flash Magic 工具。我們正在使用 USB 電纜通過微型 USB 端口對 ARM7 Stick 進行編程。我們使用 Keil 編寫代碼并創(chuàng)建一個 hex 文件,然后使用 Flash Magic 將 HEX 文件閃存到 ARM7 棒。要了解有關(guān)安裝 keil uVision 和 Flash Magic 以及如何使用它們的更多信息,請點擊鏈接 Getting Started With ARM7 LPC2148 Microcontroller and Program it using Keil uVision。
在本教程中,我們使用 LPC2148 中的 ADC 將模擬輸入電壓(0 至 3.3V)轉(zhuǎn)換為數(shù)字值,并在LCD 顯示器(16x2)上顯示模擬電壓。電位器將用于改變輸入模擬電壓。
在本教程的末尾給出了在ARM 7 中使用 ADC的完整代碼,這里我們將解釋它的幾個部分。
LPC2148-ADC編程涉及的步驟
1. PINSEL 寄存器用于選擇 LPC2148 的端口引腳和 ADC 功能作為模擬輸入。
PINSEL1 = 0x01000000;// 選擇 P0.28 為 AD0.1
2.通過將值寫入 ADxCR(ADC 控制寄存器)來選擇轉(zhuǎn)換的時鐘和位精度。
AD0CR = 0x00200402; //將 ADC 操作設(shè)置為 10 位/11 CLK 用于轉(zhuǎn)換 (000)
3.通過將值寫入 ADxCR 中的 START 位開始轉(zhuǎn)換。
在這里,我已寫入 AD0CR 寄存器的第 24位。
AD0CR = AD0CR | (1<<24);
4.現(xiàn)在我們要檢查相應(yīng)的 ADxDRy(ADC 數(shù)據(jù)寄存器)的 DONE 位(第 31 位),因為它從 0 變?yōu)?1。所以我們使用while循環(huán)不斷檢查數(shù)據(jù)寄存器的第 31 位是否完成轉(zhuǎn)換。
而(!(AD0DR1&0x80000000));
5.完成位設(shè)置為 1 后,轉(zhuǎn)換成功,接下來我們從同一個 ADC 數(shù)據(jù)寄存器 AD0DR1 中讀取結(jié)果并將值存儲在一個變量中。
adc 值 = AD0DR1;
接下來我們使用一個公式將數(shù)字值轉(zhuǎn)換為電壓并存儲在一個名為電壓的變量中。
電壓 = ( (adcvalue/1023.0) * 3.3 );
5.以下行用于顯示模數(shù)轉(zhuǎn)換后的數(shù)字值(0 到 1023)。
adc = adc 值;
sprintf(displayadc, "adcvalue=%f", adc);
LCD_DISPLAY(displayadc); //顯示ADC值(0到1023)
6.以下行用于顯示模數(shù)轉(zhuǎn)換后和第 5 步后的輸入模擬電壓(0 至 3.3V)。
LCD_SEND(0xC0);
sprintf(伏特值,“電壓=%.2f V”,電壓);
LCD_DISPLAY(伏特值);//顯示(輸入模擬電壓)
7.現(xiàn)在我們要在 LCD 顯示屏上顯示輸入電壓和數(shù)字值。在此之前,我們必須初始化 LCD 顯示屏并使用適當(dāng)?shù)拿顚⑾l(fā)送到顯示屏。
下面的代碼用于初始化 LCD
void LCD_INITILIZE(void) //準(zhǔn)備 LCD 的函數(shù)
{
IO0DIR = 0x0000FFF0; //設(shè)置引腳P0.12,P0.13,P0.14,P0.15,P0.4,P0.6為OUTPUT
delay_ms(20);
LCD_SEND(0x02); // 以 4 位操作模式初始化 lcd
LCD_SEND(0x28); // 2 行 (16X2)
LCD_SEND(0x0C); // 光標(biāo)關(guān)閉時顯示
LCD_SEND(0x06); // 自動遞增光標(biāo)
LCD_SEND(0x01); // 顯示清除
LCD_SEND(0x80); // 第一行第一個位置
}
下面的代碼用于在 LCD 上顯示值
void LCD_DISPLAY (char* msg) //函數(shù)將發(fā)送的字符一一打印
???
{
uint8_t i=0;
while(msg[i]!=0)
{
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((msg[i] & 0xF0)<<8) ); //發(fā)送高半字節(jié)
IO0SET = 0x00000050; //RS HIGH & ENABLE HIGH 打印數(shù)據(jù)
IO0CLR = 0x00000020; //RW LOW 寫模式
delay_ms(2);
IO0CLR = 0x00000040;// EN = 0,RS 和 RW 不變(即 RS = 1,RW = 0)
delay_ms(5);
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((msg[i] & 0x0F)<<12) ); //發(fā)送低半字節(jié)
IO0SET = 0x00000050; //RS & EN HIGH
IO0CLR = 0x00000020;
延遲毫秒(2);
IO0CLR = 0x00000040;
延遲毫秒(5);
我++;
}
}
以下函數(shù)用于創(chuàng)建延遲
void delay_ms(uint16_t j) // 以毫秒為單位的延遲函數(shù)
{
uint16_t x,i;
for(i=0;i
for(x=0; x<6000; x++); // Forloop 在 Cclk = 60MHz 時產(chǎn)生 1 毫秒的延遲
}
}
-
adc
+關(guān)注
關(guān)注
98文章
6524瀏覽量
545197 -
ARM7
+關(guān)注
關(guān)注
3文章
207瀏覽量
50382 -
LPC2148
+關(guān)注
關(guān)注
0文章
25瀏覽量
14940
發(fā)布評論請先 登錄
相關(guān)推薦
評論