如何使用 ADS1115 16位元 ADC 模組與 ESP32 開發版
步驟與項目
如何使用 ADS1115 16位元 ADC 模組與 ESP32 開發版
在本教程中,我們將探討如何將ADS1115 16位元ADC模組與ESP32進行介面連接的過程。ADS1115破解板是一個高解析度的類比數位轉換器(ADC),可與各種微控制器一起使用,包括Arduino、STM32和ESP8266/32。特別是ESP32是一款功能強大的微控制器,具有內建的Wi-Fi和藍牙功能,使其成為物聯網應用的理想選擇。
ESP32具有內建的12位元ADC,提供比Arduino板上的10位元ADC更高的解析度。然而,ADS1115擁有更高的16位元解析度,在電壓測量方面提供卓越的性能。ESP32能測量的最小電壓為3.3V / 4096 = 0.0008V(或0.8mV),而ADS1115可以測量低至5V / 65536 = 0.000076V(76uV)。這使得ADS1115在需要精確電壓測量時成為優秀的選擇。如果您需要更高精確度達到0.3uV,您可以檢查ADS1220 24位元ADC模組。
在本教程的後續部分,我們將提供連接ADS1115到ESP32、配置I2C通信以及使用Arduino IDE讀取和處理類比信號的逐步說明。完成本指南後,您將對如何將ADS1115 16位元ADC模組與ESP32進行介面連接並發揮其潛力有堅實的了解,以應用於您的專案中。
材料清單 要全面了解在ESP32上使用ADS1115 ADC模組時所需的元件,我們需要以下這些元素:
- ESP32 開發板 - 這是用於控制和與ADS1115通信的主要微控制器。
- ADS1115 16位元ADC模組 - 這是高解析度的ADC模組,用於測量類比信號。
- 杜邦線 - 用於連接ESP32和ADS1115的電線。
- 麵包板(可選) - 一個實驗麵包板可用於更方便地連接和測試元件。
這些元件是完成ADS1115 ADC模組與ESP32介面連接的基本需求。根據您的具體專案需求,您可能需要額外的電子元件和感測器。
本實驗所需的料件清單
- ESP32 開發板 一片
- ADS1115 類比數位轉換器模組 一片
- 16x2 I2C LCD 顯示屏 一片
- 10K電位器 兩個
- 麵包板 一個
- 連接線 些許
ESP32 ADC引腳和精確度
ESP32是一款功能強大的微控制器,具有集成的Wi-Fi和藍牙功能。它具有多個類比數位轉換器(ADC)引腳,可以用來測量類比信號並將其轉換為數位值。ESP32具有兩個ADC,分別為ADC1和ADC2,共提供18個可用的ADC通道。
這些ADC通道可以用於測量外部類比電壓,並將其轉換為數位數據。每個ADC通道的精確度為12位元,這意味著它可以將電壓值分為2^12(4096)個不同的數位數據。因此,ESP32的ADC具有12位元的精確度。
以下是ESP32的一些ADC引腳:
- ADC1_CH0 至 ADC1_CH7:共8個ADC通道,可用於ADC1。
- ADC2_CH0 至 ADC2_CH7:共8個ADC通道,可用於ADC2。
- GPIO32(ADC1_CH4)
- GPIO33(ADC1_CH5)
請注意,ADC1通道和ADC2通道有不同的限制和用途,因此在選擇使用哪個通道時需要查閱ESP32的文檔以確保符合您的需求。
總之,ESP32的ADC引腳提供12位元的精確度,可用於測量類比信號,並在許多應用中非常有用,特別是在物聯網(IoT)和傳感器應用中。如果需要更高的精確度,您可以考慮使用外部ADC模組,如ADS1115,它提供16位元的精確度。
-
ADC1具有8個通道,可用的引腳範圍從GPIO32到GPIO39。
-
ADC2具有10個通道,可用的引腳包括GPIO0、GPIO2、GPIO4、GPIO12到GPIO15,以及GPIO25到GPIO27。
精準度
ESP32的ADC具有12位元的解析度,這表示它們可以使用4096個離散級別來表示類比訊號。然而,由於內部噪音和非線性特性,實際解析度通常約為10到11位元,這表示它們可能無法實現完整的12位元精確度。在實際應用中,需要考慮ADC的實際性能以確保精確的類比訊號測量。感謝您提供這一重要的補充資訊。
為了提高ESP32上ADC讀數的準確性,您可以:
- 使用內建的霍爾效應傳感器進行校準。
- 實施過採樣和平均化以減少噪聲。
- 使用外部電壓參考以獲得更好的穩定性。
- 如果需要更高的精確度,考慮使用外部ADC模組,如ADS1115。
請注意,ADC2通道與Wi-Fi功能共享,因此如果使用Wi-Fi,最好使用ADC1通道,以避免潛在的衝突或干擾ADC讀數。
ADS1115晶片
ADS1115是一款精確、低功耗、16位元、支援I2C通信的類比至數位轉換器(ADC)IC。
以下圖片顯示了ADS1115晶片的引腳配置。
ADS1115的引腳配置如下:
- 引腳1(ADDR):選擇晶片的I2C地址。
- 引腳2(Alert/Ready):用作數據就緒和警報信號。
- 引腳3(GND):地端。
- 引腳4、5、6和7:四個(4)個ADC輸入引腳。可以將這些引腳用作四(4)個單端輸入或兩(2)個差動輸入。
- 引腳8(正電源供應):接受2.0 V到5.5 V的正電源供應。
- 引腳9和10(I2C接口端子):分別是I2C介面的SDA和SCL端子。
這些引腳的配置使得您可以輕鬆地控制和連接ADS1115晶片,以進行類比至數位轉換和數據通信。
ADS1115 模組引腳分配
ADS1115 模組共有 10 個腳位。
別針。不。 | 引腳名稱 | 引腳說明 |
1 | VDD 電源電壓 | 電源:2.0V至5.5V |
2 | GND 接地 | 地面 |
3 | SCL | 串行時脈輸入:SDA 上的時脈資料(用於 I2C 通訊) |
4 | SDA | 串列資料:發送和接收資料(用於I2C通訊) |
5 | ADDR 地址 | I2C 位址選擇(從機) |
6 | 警報/準備就緒 | 數位比較器輸出或轉換就緒 |
7 | AIN0 | 差分通道1:單端通道1輸入或負輸入 |
8 | AIN1 | 差分通道1:單端通道2輸入或負輸入 |
9 | AIN2 | 差分通道2:單端通道3輸入或正輸入 |
10 | AIN3 | 差分通道2:單端通道4輸入或負輸入 |
ADS1115 模組與 ESP32 的接口
用於連接 ADS1115 ADC 模組的 ESP32 接線圖非常簡單。
首先將模組的 VDD 和 GND 接腳分別連接到 ESP32 的 3.3V 和 GND 接腳。接下來,將 ADS1115 I2C 接腳(SDA 和 SCL)連接到 ESP32 的 I2C 接腳(SDA=GPIO21 和 SCL=GPIO22)。晶片的 ADDR 接腳應連接到 VDD、SDA 或 SCL,取決於您要使用的位址 0x49、0x4A 或 0x4B。請注意,ADDR 接腳預設由 10K 電阻下拉至地。
如果要使用 ADS1115 模組的 ALERT/READY 接腳,則必須將其連接到 ESP32 數位引腳。該引腳有兩個用途。首先,您可以將其用於中斷驅動的轉換,並用作資料就緒訊號。其次,您可以將其與可程式輸出比較器一起使用來偵測轉換閾值。在這種情況下,它充當警報信號。
ADS1115 有四個 ADC 輸出:A0、A1、A2 和 A3,這意味著您最多可以將四個類比感測器連接到該模組。例如,要測試模組讀數,可以使用電位器,應根據上面提供的電路圖連接電位器。
ADS1115 庫安裝
ADS1115 模組有多個可用的函式庫。在瀏覽庫管理器時,您將從不同的開發人員那裡獲得該庫。
在所有可用的庫中,我們可以嘗試為我們的應用程式使用穩定的庫之一。該庫來自Adafruit。您也可以從以下鏈接下載該庫。
基本原始碼/程式
使用 Adafruit ADS1115 範例資料夾中的基本範例程式碼,我們可以測試感測器的工作情況。
複製以下程式碼並將其上傳到ESP32開發板。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#include <Adafruit_ADS1X15.h> Adafruit_ADS1115 ads; /* Use this for the 16-bit version */ //Adafruit_ADS1015 ads; /* Use this for the 12-bit version */ void setup(void) { Serial.begin(115200); Serial.println("Getting single-ended readings from AIN0..3"); Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)"); // The ADC input range (or gain) can be changed via the following // functions, but be careful never to exceed VDD +0.3V max, or to // exceed the upper and lower limits if you adjust the input range! // Setting these values incorrectly may destroy your ADC! // ADS1015 ADS1115 // ------- ------- // ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default) // ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV //ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV // ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV // ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV // ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV if (!ads.begin()) { Serial.println("Failed to initialize ADS."); while (1); } } void loop(void) { int16_t adc0, adc1, adc2, adc3; float volts0, volts1, volts2, volts3; adc0 = ads.readADC_SingleEnded(0); adc1 = ads.readADC_SingleEnded(1); adc2 = ads.readADC_SingleEnded(2); adc3 = ads.readADC_SingleEnded(3); volts0 = ads.computeVolts(adc0); volts1 = ads.computeVolts(adc1); volts2 = ads.computeVolts(adc2); volts3 = ads.computeVolts(adc3); Serial.println("-----------------------------------------------------------"); Serial.print("AIN0: "); Serial.print(adc0); Serial.print(" "); Serial.print(volts0); Serial.println("V"); Serial.print("AIN1: "); Serial.print(adc1); Serial.print(" "); Serial.print(volts1); Serial.println("V"); Serial.print("AIN2: "); Serial.print(adc2); Serial.print(" "); Serial.print(volts2); Serial.println("V"); Serial.print("AIN3: "); Serial.print(adc3); Serial.print(" "); Serial.print(volts3); Serial.println("V"); } |
上傳程式碼後,開啟串行監視器。序列監視器將顯示所有 4 個輸出 AIN0、AIN1、AIN2、AIN3 的 ADC 值以及輸出電壓。
由於我們只使用了 AIN0 和 AIN1 兩個電位器,因此旋轉電位器時這些值會改變。
測試 ADS1115 模組精度
現在,我們將評估 ADS1115 ADC 模組的精度。為了評估其準確性,我們可以使用 LCD 顯示器來顯示 ADC 值和測量的電壓。隨後,我們可以使用萬用電表測量檢測到的電壓並將其與串行監視器上顯示的電壓進行比較。
ADS1115、ESP32 和 LCD 連接圖
依照電路圖將 LCD 連接到先前的電路。
將 LCD SDA 和 SCL 接腳連接到 ESP32 的 GPIO21 和 GPIO22。使用 ESP32 的 Vin 和 GND 引腳為 LCD 顯示器提供 5V VCC 和 GND 連接。
原始碼/程式
程式碼需要I2C LCD 函式庫進行編譯。然後您可以複製以下程式碼並將其上傳到ESP32開發板。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#include <Adafruit_ADS1X15.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); Adafruit_ADS1115 ads; /* Use this for the 16-bit version */ //Adafruit_ADS1015 ads; /* Use this for the 12-bit version */ void setup(void) { Serial.begin(115200); Serial.println("Getting single-ended readings from AIN0..3"); Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)"); // The ADC input range (or gain) can be changed via the following // functions, but be careful never to exceed VDD +0.3V max, or to // exceed the upper and lower limits if you adjust the input range! // Setting these values incorrectly may destroy your ADC! // ADS1015 ADS1115 // ------- ------- // ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default) // ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV //ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV // ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV // ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV // ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV lcd.init(); lcd.backlight(); if (!ads.begin()) { Serial.println("Failed to initialize ADS."); while (1); } } void loop(void) { int16_t adc0, adc1, adc2, adc3; float volts0, volts1, volts2, volts3; adc0 = ads.readADC_SingleEnded(0); adc1 = ads.readADC_SingleEnded(1); adc2 = ads.readADC_SingleEnded(2); adc3 = ads.readADC_SingleEnded(3); volts0 = ads.computeVolts(adc0); volts1 = ads.computeVolts(adc1); volts2 = ads.computeVolts(adc2); volts3 = ads.computeVolts(adc3); Serial.println("-----------------------------------------------------------"); Serial.print("AIN0: "); Serial.print(adc0); Serial.print(" "); Serial.print(volts0); Serial.println("V"); Serial.print("AIN1: "); Serial.print(adc1); Serial.print(" "); Serial.print(volts1); Serial.println("V"); Serial.print("AIN2: "); Serial.print(adc2); Serial.print(" "); Serial.print(volts2); Serial.println("V"); Serial.print("AIN3: "); Serial.print(adc3); Serial.print(" "); Serial.print(volts3); Serial.println("V"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("ADC0:"); lcd.print(adc0); lcd.print(" "); lcd.print(volts0); lcd.print("V"); lcd.setCursor(0, 1); lcd.print("ADC1:"); lcd.print(adc1); lcd.print(" "); lcd.print(volts1); lcd.print("V"); delay(1000); } |
檢測結果
上傳程式碼後,模組就準備好進行測試。為此需要使用萬用電表。
LCD 將顯示ADC 值和測量電壓。
我們使用兩個電位器來輸入 ADC 電壓並將其顯示在 LCD 顯示器上。萬用電表顯示的測量電壓之一為 3.28V,在 LCD 上顯示為 3.31V。
模組的 ADC 輸出電壓最大為3.3V,最小為 0V。
在測量較低電壓時,LCD 中的電壓為 0.84V,萬用電錶中測得的電壓為 0.827V。
因此我們可以得出結論,ADS1115 16 位元 ADC 模組具有良好的精度,可用於多用途應用。
根據其他測試,該設備的標稱典型精度為 0.01%,但其最大精度為0.15%。此精度包括所有誤差源,例如電壓基準、增益誤差、偏移和雜訊。
發佈留言
很抱歉,必須登入網站才能發佈留言。