模數轉換在嵌入式電子產品中是一項非常重要的任務 ,因為大多數傳感器以模擬值的形式提供輸出并將它們饋送到只理解二進制值的微控制器,我們必須將它們轉換為數字值。因此,為了能夠處理模擬數據,微控制器需要 模數轉換器。
在本教程中,我們將檢查 如何將 PCF8591 ADC/DAC 模塊與 Arduino 連接。
所需組件
Arduino UNO
PCF8591 ADC模塊
100K 鍋
跨接電纜
PCF8591 ADC/DAC 模塊
PCF8591 是一個 8 位模數或 8 位數模轉換器 模塊,這意味著每個引腳可以讀取高達 256 的模擬值。它還具有 LDR 和板上提供的熱敏電阻電路。該模塊有四個模擬輸入和一個模擬輸出。它適用于 I 2 C 通信,因此有用于串行時鐘和串行數據地址的 SCL 和 SDA 引腳。它需要 2.5-6V的 電源電壓并且具有低待機電流。我們也可以通過調節模塊上電位器的旋鈕來控制輸入電壓。板上還有三個跳線。J4接選擇 熱敏電阻接入電路,J5接選擇 LDR/光敏電阻接入電路 J6連接選擇可調電壓接入電路。要訪問這些電路,您必須使用這些跳線的地址:J6 為 0x50,J5 為 0x60,J4 為 0x70。板上有兩個 LED D1 和 D2-D1 顯示輸出電壓強度,D2 顯示電源電壓強度。輸出或電源電壓越高,LED D1 或 D2 的強度越高。您還可以使用 VCC 或 AOUT 引腳上的電位器來測試這些 LED。
將 PCF8591 ADC/DAC 模塊與 Arduino 連接
PCF8591 與 Arduino 的接口非常簡單。在這個接口示例中,我們將從任何模擬引腳讀取模擬值,并通過 100K 電位器更改這些值。首先,將 VCC 和 GND 連接到 Arduino 的 5V 和 GND。接下來,將 SDA 和 SCL 連接到 Arduino 的 A4 和 A5。現在,如圖所示,用 AIN0 連接一個 100K 電位器。對于 LCD,數據引腳 (D4-D7) 連接到 Arduino 的數字引腳 D5-D2,RS 和 EN 引腳連接到 Arduino 的 D12 和 D11。LCD的V0接pot和一個100k的pot,用來控制LCD的亮度。
Arduino PCF8591 模數轉換 (ADC)編程
首先,我們需要定義用于 I?2?C 通信和 LCD 顯示的庫。
?
#include#include
?
然后定義一些宏。第一個宏用于定義IC的數據總線地址,第二個宏用于定義模塊的第一個輸入引腳的地址,其中給出了來自pot的輸入。
?
#define PCF8591 (0x90 >> 1) #define AIn0 0x00
?
接下來用 Arduino 定義 LCD 的引腳連接并初始化我們在模擬引腳上獲得的值。
?
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); 整數值 = 0;
?
現在,讓我們來設置功能。在這里,在第一行中,我們已經初始化了 I?2?C 通信。在第二行中,我們已經初始化了我們正在打印模擬值的 LCD 顯示器。在此處了解有關將 16x2 LCD 與 Arduino 連接的更多信息。
?
void setup() { Wire.begin(); lcd.開始(16,2); }
?
在循環功能中,第一行是開始傳輸,即啟動PCF8591。第二行告訴 IC 在第一個模擬輸入引腳上進行模擬測量。第三行結束傳輸,第四行從模擬引腳獲取測量數據。
?
無效循環() { Wire.beginTransmission(PCF8591); Wire.write(AIn0); Wire.endTransmission(); Wire.requestFrom(PCF8591, 1);
?
在下一部分中,將從模擬引腳讀取的值放入之前定義的Value變量中。在接下來的幾行中,將該值打印到 LCD 上。
?
值=Wire.read(); lcd.print("ADC 值="); lcd.print(值); 延遲(500); lcd.clear();}
?
最后上傳Arduino中的代碼并運行它。模擬值將開始顯示在 LCD 顯示屏上。調整鍋的旋鈕,你會看到數值的逐漸變化。
#include
#include
#define PCF8591 (0x90 >> 1)
#define AIN0 0x00
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
整數值 = 0;
void setup()
{
Wire.begin();
lcd.開始(16,2);
}
無效循環()
{
Wire.beginTransmission(PCF8591);
Wire.write(AIN0);
Wire.endTransmission();
Wire.requestFrom(PCF8591, 1);
值 = Wire.read();
lcd.print("ADC 值=");
lcd.print(值);
延遲(500);
lcd.clear();
}
評論
查看更多