模數(shù)轉換器 (ADC) 是微控制器上最常用的硬件功能。它接收模擬電壓并將其轉換為數(shù)字值。由于微控制器是數(shù)字設備并且使用二進制數(shù)字 1 和 0,它不能直接處理模擬數(shù)據(jù)。因此,ADC 用于接收模擬電壓并將其轉換為微控制器可以理解的等效數(shù)字值。
在本教程中,我們將使用N76E003 微控制器單元的內(nèi)置 ADC 外設,因此讓我們評估此應用需要什么樣的硬件設置。
所需組件和硬件設置
要在 N76E003 上使用 ADC,我們將使用使用電位計的分壓器并讀取 0V-5.0V 范圍內(nèi)的電壓。電壓將顯示在 16x2 字符 LCD 中,如果您是 LCD 和 N76E003 的新手,您可以查看如何將 LCD 與 Nuvoton N76E003 連接。因此,該項目所需的主要組件是 16x2 字符 LCD。對于這個項目,我們將使用以下組件 -
字符 LCD 16x2
1k電阻
50k 電位器或微調(diào)電位器
幾根伯格電線
幾根連接線
面包板
更不用說,除了上述組件,我們還需要基于N76E003 微控制器的開發(fā)板以及Nu-Link 編程器。還需要一個額外的 5V 電源單元,因為 LCD 會消耗編程器無法提供的足夠電流。
Nuvoton N76E003 讀取模擬電壓的電路圖
正如我們在示意圖中看到的,端口 P0 用于與 LCD 相關的連接。在最左側,顯示了編程接口連接。電位器用作分壓器,由模擬輸入 0 (AN0) 檢測。
N76E003 中有關 GPIO 和模擬引腳的信息
下圖說明了 N76E003AT20 微控制器單元上可用的 GPIO 引腳。但是,在 20 個引腳中,對于 LCD 相關連接,使用端口 P0(P0.0、P0.1、P0.2、P0.4、P0.5、P0.6 和 P0.7)。模擬引腳以紅色突出顯示。
正如我們所看到的,端口 P0 具有最大的模擬引腳,但這些引腳用于 LCD 相關的通信。因此,P3.0 和 P1.7 可用作模擬輸入引腳 AIN1 和 AIN0。由于這個項目只需要一個模擬引腳,P1.7 是模擬輸入通道 0,用于這個項目。
N76E003 中有關 ADC 外設的信息
N76E003 提供12 位 SAR ADC。N76E003的一個非常好的特點是它具有非常好的ADC分辨率。ADC在單端模式下具有8 通道輸入。連接 ADC 非常簡單明了。
第一步是選擇ADC通道輸入。N76E003 微控制器提供 8 通道輸入。選擇 ADC 輸入或 I/O 引腳后,需要將所有引腳設置為代碼中的方向。用于模擬輸入的所有引腳都是微控制器的輸入引腳,因此所有引腳都需要設置為僅輸入(高阻抗)模式。這些可以使用PxM1 和 PxM2 寄存器進行設置。這兩個寄存器設置 I/O 模式,其中 x 代表端口號(例如,端口 P1.0 寄存器將是 P1M1 和 P1M2,對于 P3.0 它將是 P3M1 和 P3M2 等)配置可以如下圖所示 -
ADC 的配置由兩個寄存器ADCCON0和ADCCON1完成。ADCCON0 寄存器描述如下所示。
寄存器的前 4 位從位 0 到位 3 用于設置 ADC 通道選擇。由于我們使用的是通道 AIN0,因此這四個位的選擇將為 0000。
第 6 位和第 7 位是重要的位。ADCS需要設置為 1 以啟動 ADC 轉換,ADCF將提供有關 ADC 轉換成功的信息。它需要由固件設置為 0 以啟動 ADC 轉換。下一個寄存器是 ADCCON1-
ADCCON1 寄存器主要用于外部觸發(fā)的 ADC 轉換。但是,對于正常的輪詢相關操作,需要將第一位ADCEN設置為 1 以打開 ADC 電路。
接下來,需要在AINDIDS寄存器中控制 ADC 通道的輸入,在該寄存器中可以斷開數(shù)字輸入。
n 代表通道位(例如,AIN0 通道需要使用AINDIDS寄存器的第一位P17DIDS進行控制)。數(shù)字輸入需要使能,否則讀為0。這些都是ADC的基本設置。現(xiàn)在,清除 ADCF 并設置 ADCS,即可開始 ADC 轉換。轉換后的值將在以下寄存器中可用 -
和
兩個寄存器都是 8 位的。由于 ADC 提供 12 位數(shù)據(jù),所以 ADCRH 用作全量(8 位)而 ADCRL 用作半量(4 位)。
為 ADC 編程 N76E003
每次為特定模塊編碼是一項繁重的工作,因此提供了一個簡單但功能強大的 LCD 庫,對于與 N76E003 連接的 16x2 字符 LCD 接口非常有用。
請擁有該庫(通過克隆或下載)并在您的Keil N76E003 項目中包含lcd.c和LCD.h文件,以便將 16x2 LCD 輕松集成到所需的應用程序或項目中。該庫將提供以下有用的顯示相關功能-
初始化液晶顯示器。
向 LCD 發(fā)送命令。
寫入液晶顯示器。
在 LCD 中輸入一個字符串(16 個字符)。
通過發(fā)送十六進制值打印字符。
滾動超過 16 個字符的長消息。
將整數(shù)直接打印到 LCD 中。
ADC 的編碼很簡單。在設置函數(shù)Enable_ADC_AIN0中;用于將ADC設置為AIN0輸入。這是在文件中定義的。
#define Enable_ADC_AIN0 ADCCON0&=0xF0;P17_Input_Mode;AINDIDS=0x00;AINDIDS|=SET_BIT0;ADCCON1|=SET_BIT0 //P17
因此,上述行將引腳設置為輸入并配置ADCCON0、ADCCON1寄存器以及AINDIDS寄存器。以下函數(shù)將從ADCRH和ADCRL寄存器讀取 ADC,但分辨率為 12 位。
unsigned int ADC_read(void){
register unsigned int adc_value = 0x0000;
clr_ADCF;
設置_ADCS;
而(ADCF == 0);
adc_value = ADCRH;
adc_value 《《= 4;
adc_value |= ADCRL;
返回 adc_value;
}
該位左移 4 次,然后添加到數(shù)據(jù)變量中。在主要功能中,ADC 正在讀取數(shù)據(jù)并直接打印在顯示器上。然而,電壓也使用比率或電壓除以位值之間的關系進行轉換。
一個 12 位 ADC 將在 5.0V 輸入上提供 4095 位。因此除以 5.0V/4095 = 0.0012210012210012V
因此,1 位的位變化將等于 0.001V 的變化(大約)。這是在下面顯示的主函數(shù)中完成的。
void main(void){
int adc_data;
設置();
lcd_com (0x01);
while(1){
lcd_com (0x01);
lcd_com (0x80);
lcd_puts(“ADC數(shù)據(jù):”);
adc_data = ADC_read();
lcd_print_number(adc_data);
電壓 = adc_data * bit_to_voltage_ratio;
sprintf(str_voltage,“電壓:%0.2fV”,電壓);
lcd_com(0xC0);
lcd_puts(str_voltage);
Timer0_Delay1ms(500);
}
}
數(shù)據(jù)從位值轉換為電壓,并使用sprintf函數(shù)將輸出轉換為字符串并發(fā)送到 LCD。
閃爍代碼和輸出
代碼返回 0 warning 和 0 Errors 并且被 Keil 使用默認的刷機方式刷機,你可以看到下面的刷機信息。如果您是 Keil 或 Nuvoton 的新手,請查看Nuvoton 微控制器入門以了解基礎知識以及如何上傳代碼。
重建開始:項目:計時器
重建目標‘目標1’
組裝STARTUP.A51.。.
編譯main.c.。.
編譯lcd.c.。.
編譯Delay.c.。.
鏈接。..
程序大?。簲?shù)據(jù)= 101.3 xdata=0 代碼=4162
從“。\Objects\timer”。..“。\Objects\timer”創(chuàng)建十六進制文件
- 0 個錯誤,0 個警告。
構建時間已用:00:00:02
加載“G:\\n76E003\\Display\\Objects\\timer”
Flash 擦除完成。
Flash 寫入完成:已編程 4162 字節(jié)。
Flash 驗證完成:已驗證 4162 字節(jié)。
閃存加載于 11:56:04 完成
下圖顯示了使用直流適配器連接到電源中的硬件,顯示屏顯示右側電位器設置的電壓輸出。
如果我們轉動電位器,給 ADC 引腳的電壓也會發(fā)生變化,我們可以注意到 LCD 上顯示的 ADC 值和模擬電壓。
#include "N76E003.h"
#include "SFR_Macro.h"
#include "函數(shù)定義.h"
#include "Common.h"
#include "延遲.h"
#包括“l(fā)cd.h”
#define bit_to_voltage_ratio 0.001220703125 // 5.0V 除以 4096 對于 12 位 ADC
無效設置(無效);
無符號整數(shù) ADC_read(void);
浮動電壓;
字符str_電壓[20];
無效的主要(無效){
int adc_data;
設置();
lcd_com (0x01);
而(1){
lcd_com (0x01);
lcd_com (0x80);
lcd_puts("ADC數(shù)據(jù):");
adc_data = ADC_read();
lcd_print_number(adc_data);
電壓 = adc_data * bit_to_voltage_ratio;
sprintf(str_voltage,“電壓:%0.2fV”,電壓);
lcd_com(0xC0);
lcd_puts(str_voltage);
Timer0_Delay1ms(500);
}
}
無效設置(無效){
Set_All_GPIO_Quasi_Mode;
液晶初始化();
啟用_ADC_AIN0;
lcd_com (0x80);
LCD_ScrollMessage("歡迎來到 CircuitDigest.com");
lcd_com (0x80);
lcd_puts("ADC 接口");
lcd_com (0xC0);
lcd_puts("使用 N76E003 單片機");
Timer3_Delay100ms(5);
}
無符號整數(shù) ADC_read(void){
注冊無符號整數(shù) adc_value = 0x0000;
clr_ADCF;
設置_ADCS;
而(ADCF == 0);
adc_value = ADCRH;
adc_value <<= 4;
adc_value |= ADCRL;
返回 adc_value;
}
-
微控制器
+關注
關注
48文章
7454瀏覽量
150854 -
模數(shù)轉換器
+關注
關注
26文章
3099瀏覽量
126699 -
模擬電壓
+關注
關注
6文章
64瀏覽量
18278 -
N76E003
+關注
關注
0文章
27瀏覽量
5500
發(fā)布評論請先 登錄
相關推薦
評論