幾乎所有嵌入式應用中使用的一個共同特性是ADC模塊(模數轉換器)。這些模數轉換器可以從溫度傳感器、傾斜傳感器、電流傳感器、柔性傳感器等模擬傳感器讀取電壓。因此,在本教程中,我們將學習如何在MSP430G2中使用ADC使用Energia IDE讀取模擬電壓。我們將一個小電位計連接到MSP板,并向模擬引腳提供變化的電壓,讀取電壓并將其顯示在串行監視器上。
了解 ADC 模塊:
相信我,連接和編程 MSP430G2 以讀取模擬電壓幾乎不需要 10 分鐘。但是,讓我們花一些時間來了解MSP板中的ADC模塊,以便我們能夠在所有即將推出的項目中有效地使用它。
微控制器是一種數字設備,這意味著它只能理解1和0。但在現實世界中,幾乎所有東西,如溫度、濕度、風速等,本質上都是模擬的。為了與這些模擬變化進行交互,微控制器使用稱為ADC的模塊。有許多不同類型的ADC模塊可用,我們的MSP中使用的模塊是SAR 8通道10位ADC。
逐次逼近 (SAR) ADC:SAR ADC在比較器和一些邏輯對話的幫助下工作。這種類型的ADC使用基準電壓(可變的),并使用比較器將輸入電壓與基準電壓進行比較,并從最高有效位(MSB)中保存差值(數字輸出)。比較的速度取決于MSP運行的時鐘頻率(Fosc)。
10 位分辨率:該ADC是一款8通道10位ADC。這里術語 8 通道意味著有 8 個 ADC 引腳,我們可以使用這些引腳測量模擬電壓。術語10位意味著ADC的分辨率。10 位表示 2 的 10 次方 (210) 即 1024。這是我們的ADC的樣本步進數,因此我們的ADC值范圍將從0到1023。該值將根據每步電壓值從 0 增加到 1023,可以使用以下公式計算
注意:默認情況下,在Energia中,參考電壓將設置為Vcc(~3v),您可以使用analogReference()選項改變參考電壓。
電路圖:
在之前的教程中,我們已經學習了如何將LCD與MSP430G2接口,現在我們只需向MSP430添加一個電位計,為其提供可變電壓并在LCD上顯示電壓值。如果您不知道LCD的接口,請回退到上面的鏈接并通讀它,因為我將跳過信息以避免悔改。該項目的完整電路圖如下。
如您所見,這里使用了兩個電位計,一個用于設置LCD的對比度,另一個用于為電路板提供可變電壓。在該電位器中,電位計的一端連接到Vcc,另一端連接到接地。中心引腳(藍線)連接到引腳P1.7。該引腳P1.7將提供0V (地)至3.5V (Vcc)的可變電壓。因此,我們必須對引腳P1.7進行編程以讀取此可變電壓并將其顯示在LCD上。
在 Energia 中,我們需要知道引腳 P1.7 屬于哪個模擬通道?這可以通過參考下圖找到
您可以在右側看到P1.7引腳,該引腳屬于A7(通道7)。同樣,我們也可以找到其他引腳的相應通道號。您可以使用從 A0 到 A7 的任何引腳來讀取模擬電壓,我選擇了 A7。
針對 ADC 對 MSP430 進行編程:
對MSP430 進行編程以讀取模擬電壓非常簡單。在此程序中,將讀取值的模擬值并使用該值計算電壓,然后在LCD屏幕上顯示兩者。完整的程序可以在此頁面的底部找到,下面我將以片段形式解釋該程序,以幫助您更好地理解。
我們首先定義LCD引腳。這些定義了 LCD 引腳連接到 MSP430 的哪個引腳。您可以參考您的連接以確保引腳分別連接
#define RS 2 #define EN 3 #define D4 4 #define D5 5 #define D6 6 #define D7 7
接下來,我們包括LCD顯示器的頭文件。這將調用包含有關 MSP 應如何與 LCD 通信的代碼的庫。默認情況下,此庫將安裝在Energia IDE中,因此您無需費心添加它。還要確保使用我們上面剛剛定義的引腳名稱調用函數液晶。
#include //This librarey is insatlled by default along with IDE LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); //Let the librarey know how we have connected the LCD
在我們的 setup() 函數中,我們只會給出一條介紹消息以顯示在 LCD 屏幕上。我沒有深入,因為我們已經學會了如何將LCD與MSP430G2一起使用。
lcd.begin(16, 2); //We are using a 16*2 LCD display
lcd.setCursor (0,0); //Place the cursor at 1st row 1st column
lcd.print("MSP430G2553"); //Display a intro message
lcd.setCursor(0, 1); // set the cursor to 1st column 2nd row
lcd.print("-CircuitDigest"); //Display a intro message
最后,在我們的無限循環()函數中,我們開始讀取提供給A7引腳的電壓。正如我們已經討論過的,微控制器是一個數字設備,它不能直接讀取電壓電平。使用SAR技術,電壓電平從0映射到1024。這些值稱為 ADC 值,要獲取此 ADC 值,只需使用以下行
int val = analogRead(A7); // read the ADC value from pin A7
這里函數analogRead()用于讀取引腳的模擬值,我們在它里面指定了 A7,因為我們已將可變電壓連接到引腳 P1.7。最后,我們將此值保存在名為“val”的變量中。此變量的類型是整數,因為我們只會獲取要存儲在此變量中的 0 到 1024 之間的值。
下一步是根據ADC值計算電壓值。為此,我們有以下公式
Voltage = (ADC Value / ADC Resolution) * Reference Voltage
在我們的例子中,我們已經知道微控制器的ADC分辨率是1024。ADC 值也在上一行中找到,并存儲了名為 val 的變量。基準電壓等于微控制器的工作電壓。當 MSP430 板通過 USB 電纜供電時,工作電壓為3.6V。您還可以使用Vcc上的萬用表和電路板上的接地引腳來測量工作電壓。所以上面的公式適合我們的情況,如下所示
float voltage = (float(val)/1024) * 3.6; //formulae to convert the ADC value to voltage
您可能會對線浮點數 (val) 感到困惑。這用于將變量 “val” 從 int 數據類型轉換為 “float” 數據類型。這種轉換是必需的,因為只有當我們在浮點數中得到 val/1024 的結果時,我們才能將其乘以 3.6。如果以整數形式接收值,則始終為 0,結果也將為零。一旦我們計算了ADC值和電壓,剩下的就是在LCD屏幕上顯示結果,這可以使用以下行來完成
lcd.setCursor(0, 0); // set the cursor to column 0, line 0
lcd.print("ADC Val:");
lcd.print(val); //Display ADC value
lcd.setCursor(0, 1); // set the cursor to column 0, line 1
lcd.print("Voltage:");
lcd.print(voltage); //Display voltage
在這里,我們在第一行顯示了ADC的值,在第二行顯示了電壓的值。最后,我們延遲 100 磨秒并清除 LCD 屏幕。這是每 100 密耳將更新的值。
測試您的結果!
最后,我們歸結為有趣的部分,即測試我們的程序并使用它。只需按照電路圖所示進行連接即可。我使用小型面包板進行連接,并使用跳線將面包板連接到 MSP430。連接完成后,我的如下所示。
然后通過 Energia IDE 將下面給出的程序上傳到 MSP430 板。您應該能夠在LCD上看到介紹文字,如果不使用電位計調整LCD的對比度,直到看到清晰的文字。另外,請嘗試按下重置按鈕。如果一切按預期工作,那么您應該能夠看到以下屏幕。
現在改變電位計,您還應該看到LCD中顯示的電壓發生變化。讓我們驗證一下是否正確測量了電壓 為此,請使用萬用表測量 POT 中心和地面上的電壓。萬用表上顯示的電壓應接近LCD上顯示的值,如下圖所示。
就是這樣,我們已經學會了如何使用MSP430板的ADC測量模擬電壓。現在,我們可以將許多模擬傳感器與我們的電路板連接,以讀取實時參數。
/*
* Reading Analog Voltage with MSP430 using Energia
*/
#define RS 2
#define EN 3
#define D4 4
#define D5 5
#define D6 6
#define D7 7
#include //This librarey is insatlled by default along with IDE
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); //Let the librarey know how we have connected the LCD
void setup() {
lcd.begin(16, 2); //We are using a 16*2 LCD display
lcd.setCursor (0,0); //Place the cursor at 1st row 1st column
lcd.print("MSP430G2553"); //Display a intro message
lcd.setCursor(0, 1); // set the cursor to 1st column 2nd row
lcd.print("-CircuitDigest"); //Display a intro message
delay(2000); //Wait for display to show info
lcd.clear(); //Then clean it
}
void loop() {
int val = analogRead(A7); // read the ADC value from pin A7
Voltage = (ADC Value / ADC Resolution) * Reference Voltage
float voltage = (float(val)/1024) * 3.6; //formulae to convert the ADC value to voltage
lcd.setCursor(0, 0); // set the cursor to column 0, line 0
lcd.print("ADC Val:");
lcd.print(val); //Display ADC value
lcd.setCursor(0, 1); // set the cursor to column 0, line 1
lcd.print("Voltage:");
lcd.print(voltage); //Display voltage
}
-
adc
+關注
關注
98文章
6438瀏覽量
544098 -
IDE
+關注
關注
0文章
335瀏覽量
46678 -
模擬電壓
+關注
關注
6文章
64瀏覽量
18286 -
MSP430G2
+關注
關注
1文章
18瀏覽量
12880
發布評論請先 登錄
相關推薦
評論