如何使用 INA226 直流電流感測器與 Arduino 配合使用
步驟與項目
使用 INA226 直流電流感測器與 Arduino 搭配的完整教學
在這篇教學中,我們將學習如何將 INA226 直流電流感測模組與 Arduino 進行介接。INA226 和它的前身 INA219 一樣,是一款可以測量電流、電壓和功率的設備。然而,它具有更擴展的量測範圍,能夠測量高達 36V 的電壓和最大 20A 的電流。因此,您可以利用這款感測器製作直流能量計專案、12V 電池監控系統專案,或是太陽能板監控系統專案。
INA226 是由德州儀器 (Texas Instruments) 推出的分流和總線電壓監控器。它提供了集成的零漂移雙向介面,能夠監測分流電壓、總線電壓、電流和功率。INA226 透過 I2C 介面與微控制器進行通訊,使數據傳輸和解釋變得更加簡單。
INA226 的一個獨特功能是它可以配置的平均與轉換時間,適用於分流電壓和總線電壓的測量。這為各種應用和系統需求提供了優化設備的方式。此外,它還包含可編程的閾值和警報功能,這可以用來進行系統級的優化,例如節能和事件驅動的中斷編程。
INA226 直流電流感測模組具有多樣性,廣泛應用於伺服器電源管理、電信、電源設備和電池管理系統等領域。本質上,任何需要高精度、具成本效益的功率和電流監測的系統,都可以從這款模組中獲益。
材料清單
要將 INA226 直流電流感測模組與 Arduino 進行介接,我們需要以下元件。您可以從提供的連結購買這些元件:
INA226 是一款由德州儀器 (Texas Instruments) 開發的先進高端電流分流與功率監控 IC。它透過 I2C 或 SMBus 相容的介面運作,能與微控制器進行直接的數位通訊。相較於 INA219,INA226 提供了更高的準確性、更廣的電壓與電流範圍,以及內建數學運算功能,可直接以瓦特 (W) 為單位報告功率。
下載 INA226 資料表:INA226 資料表
INA226 板路圖與電路圖
INA226 模組由 INA226 晶片、一些電阻以及一顆電容組成,電容的作用是減少雜訊或不必要的電信號。
INA226 的功能與規格
- 工作電壓(2.7 – 5.5V): INA226 的工作電壓範圍為 2.7 至 5.5 伏特,讓其能與不同電壓等級的系統相容,適用於多樣化的電路設計需求。
- 總線電壓範圍(0 – 36V): INA226 可監測高達 36 伏特的電源供應,拓展其在各種電源管理應用中的適用性。
- 電流感測範圍(±500mA 至 ±50A): 根據分流電阻的數值,INA226 可監測廣泛的電流範圍,適用於電源管理、電池充電器和直流馬達控制等應用。
- 功耗:
- 連續模式: 0.35 mA
- 低功耗模式: 2.3 µA
- 測量模式: 支援連續測量模式或隨需觸發的測量模式(“觸發模式”)。
- 平均功能: 可選擇對 1、4、64、128、256、512 或 1024 筆測量數據進行平均。
- A/D 轉換時間: 可調整為 8 級,範圍從 0.14 ms 至 8.2 ms。
- 高精度: INA226 透過內建的 16 位元 ADC 提供更高的測量精度,確保數據更加準確。
- 可程式化警報: 配備可程式化的警報腳位,用於檢測閾值違反或數據可用的情況。
INA226 的腳位說明
INA226 感測模組通常具有 8 個腳位,詳細功能如下:
- VCC: 接受 2.7V 至 5.5V 的輸入電壓,用於為模組供電。
- GND: 接地腳,需與電源的地相連接。
- SDA: I²C 介面的序列數據線,用於雙向數據傳輸。
- SCL: I²C 介面的序列時鐘線,用於數據傳輸過程中的同步。
- ALE(Alert): 警報腳,為開漏輸出,需外接拉高電阻。此腳位可用於觸發各種警報或作為轉換完成信號。
- VBUS: 用於測量電源電壓的腳位,可測量高達 36V 的電壓。
- IN-: 與負載相連的腳位,用於放置分流電阻以進行電流感測。
- IN+: 與電源正極相連的腳位。
這些腳位的功能使得 INA226 感測模組在電壓與電流監測中具備靈活性,適合多種應用場景。
INA226 的最大可測電流並非由晶片本身直接決定,而是取決於所使用的分流電阻值。
INA226 透過測量分流電阻上的電壓降,並利用歐姆定律(I=V/RI = V/R)計算出電流。由於 INA226 的最大分流電壓為 81.92mV(解析度為 2.5µV),因此最大電流取決於分流電阻的阻值。
以下是一個建議分流電阻與對應最大電流的表格:
分流電阻(Rshunt) | 最大電流(Imax) |
---|---|
1 mΩ | 81.92 A |
5 mΩ | 16.384 A |
10 mΩ | 8.192 A |
50 mΩ | 1.638 A |
100 mΩ | 0.819 A |
選擇建議:
- 大電流應用: 使用低阻值(如 1mΩ 或 5mΩ)的分流電阻,可減少功率損耗,但需注意測量精度可能會受到影響。
- 小電流應用: 使用較高阻值(如 50mΩ 或 100mΩ)的分流電阻,可提高測量精度,但功率損耗會增加。
透過選擇適當的分流電阻,您可以根據應用需求靈活調整 INA226 的測量範圍與精度。
ADC 解析度
INA226 的總線電壓暫存器為 16 位元有號數,具備每位元 1.25mV 的最小有效位元(LSB)或解析度,支持 ±40.96V 的全量程電壓測量範圍。
INA226 為分流電阻設計的類比輸入,可接受最高 81.92mV 的全量程電壓。當搭配 4mΩ 的分流電阻時,能夠測量高達 ±20.48A 的電流,並且解析度高達 625µA。
- 總線電壓解析度: 1.25mV
- 總線電壓範圍: ±40.96V
- 分流電壓範圍: 最大 81.92mV
- 電流範圍(搭配 4mΩ 分流電阻): ±20.48A
- 電流解析度: 625µA
透過高解析度的 ADC,INA226 能夠提供精確的電壓和電流測量,適用於高精度電源監控與電流管理應用。
I2C 位址
與 INA219 相似,INA226 使用 I2C 通訊協定與微控制器進行通訊。INA226 的預設 I2C 位址為 0x40。此位址可被修改,以便在同一 I2C 匯流排上使用多個 INA226 感測器。
INA226 支援最多 16 種不同的 I2C 位址,範圍從 0x40 到 0x4F。您可以透過修改 A0 和 A1 腳位的連接方式來更改 I2C 位址。
暫存器位址與數值計算
INA226 內部有多個暫存器,這些暫存器可透過 I2C 介面訪問。以下是一些主要的暫存器:
配置暫存器(地址 = 00h):
與 INA219 類似,此暫存器用於控制 INA226 的各種功能設定。
分流電壓暫存器(地址 = 01h):
此暫存器保存分流電壓的原始測量值。
分流電壓(V)=分流電壓暫存器值×2.5 μV\text{分流電壓(V)} = \text{分流電壓暫存器值} \times 2.5 \, \mu V
總線電壓暫存器(地址 = 02h):
此暫存器保存總線電壓的原始測量值。
總線電壓(V)=總線電壓暫存器值×1.25 mV\text{總線電壓(V)} = \text{總線電壓暫存器值} \times 1.25 \, mV
功率暫存器(地址 = 03h):
此暫存器保存計算出的功率值。
功率(W)=功率暫存器值×Power_LSB\text{功率(W)} = \text{功率暫存器值} \times \text{Power\_LSB}
電流暫存器(地址 = 04h):
此暫存器保存計算出的電流值。
電流(A)=電流暫存器值×Current_LSB\text{電流(A)} = \text{電流暫存器值} \times \text{Current\_LSB}
校準暫存器(地址 = 05h):
此暫存器用於設定電流和功率計算的校準值。
如何將 INA226 直流電流感測器與 Arduino 搭配使用
現在讓我們來實現 INA226 直流電流感測模組與 Arduino 的介接。硬體連接非常簡單。
以下是一個簡單的連接圖,展示如何將 INA226 電流感測器與 Arduino 進行介接,並同時連接外部負載與電源:
將 INA226 的 VCC、GND、SCL 和 SDA 腳位分別連接到 Arduino 的 5V、GND、A5 和 A4 腳位。
將 Vin+ 腳位連接到電源,Vin- 腳位連接到負載,如上圖所示。
INA226 感測器還有一個 VBus 腳位,用於測量電源電壓。將 VBus 腳位連接到 Vin- 腳位。
在測試中,我使用 3.7V 和 9V 電池作為電源,並使用直流馬達作為負載。
Vin+ 腳位最多可接受 36V 的輸入電壓。
該裝置的輸入腳位額定電壓為 36V(絕對最大值為 40V),因此請勿供應超過 36V 的電壓。
如果需要測量更高的電流,您可能需要將模組上的分流電阻進行除焊,並替換為上述建議的電阻值。
INA226 Arduino 程式庫
市面上有多種 INA226 的程式庫可供使用。我測試了大部分的程式庫,發現由 Wollewald 提供的程式庫最為準確。
您可以從 GitHub INA226 函式庫 下載該程式庫,或者直接透過 Arduino IDE 的 程式庫管理員 安裝。總共有七個範例程式可用來展示該程式庫的功能。我使用了其中的 連續模式範例。許多功能在所有範例中都有使用,因此只需要解釋一次即可。
原始程式碼/程式
將以下程式碼複製並貼到 Arduino IDE 的編輯器視窗中。在上傳程式碼之前,您可能需要進行一些修改。
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
#include <Wire.h> // 引入 Wire 庫,用於 I2C 通訊 #include <INA226_WE.h> // 引入 INA226_WE 庫,用於操作 INA226 感測器 #define I2C_ADDRESS 0x40 // 定義 INA226 的 I2C 位址 INA226_WE ina226 = INA226_WE(I2C_ADDRESS); // 建立 INA226 物件,設定 I2C 位址 void setup() { Serial.begin(9600); // 設定序列通訊速率為 9600 while (!Serial); // 等待序列端口啟動(適用於某些板子如 Arduino Leonardo 或 MKR WiFi 1010) Wire.begin(); // 初始化 I2C 通訊 ina226.init(); // 初始化 INA226 感測器 /* 設定分流電壓與總線電壓的測量平均值 模式 * * 平均測量次數 AVERAGE_1 1(預設值) AVERAGE_4 4 AVERAGE_16 16 AVERAGE_64 64 AVERAGE_128 128 AVERAGE_256 256 AVERAGE_512 512 AVERAGE_1024 1024 */ //ina226.setAverage(AVERAGE_16); // 選擇模式並取消註解以更改預設值 /* 設定轉換時間(單位:微秒) 每組分流電壓與總線電壓的測量時間為: 平均測量次數 x 轉換時間 x 2 模式 * * 轉換時間 CONV_TIME_140 140 µs CONV_TIME_204 204 µs CONV_TIME_332 332 µs CONV_TIME_588 588 µs CONV_TIME_1100 1.1 ms(預設值) CONV_TIME_2116 2.116 ms CONV_TIME_4156 4.156 ms CONV_TIME_8244 8.244 ms */ //ina226.setConversionTime(CONV_TIME_1100); // 選擇轉換時間並取消註解以更改預設值 /* 設定測量模式 POWER_DOWN - 停用 INA226 TRIGGERED - 按需求觸發測量 CONTINUOUS - 連續測量(預設值) */ //ina226.setMeasureMode(CONTINUOUS); // 選擇模式並取消註解以更改預設值 /* 設定分流電阻與電流範圍 若電阻為 5.0 mOhm,電流範圍可達 10.0 A 預設為 100 mOhm,可達約 1.3 A */ ina226.setResistorRange(0.1, 1.3); // 設定分流電阻為 0.1 歐姆,電流範圍最高 1.3A /* 如果 INA226 提供的電流值與校準設備的測量值有固定比例的差異, 可以定義修正係數。 修正係數 = 校準設備提供的電流 / INA226 提供的電流 */ ina226.setCorrectionFactor(0.93); // 設定修正係數為 0.93 Serial.println("INA226 電流感測器範例 - 連續測量模式"); ina226.waitUntilConversionCompleted(); // 等待首次轉換完成,若註解此行,首次數據可能為零 } void loop() { float shuntVoltage_mV = 0.0; // 分流電壓(單位:毫伏) float loadVoltage_V = 0.0; // 負載電壓(單位:伏特) float busVoltage_V = 0.0; // 總線電壓(單位:伏特) float current_mA = 0.0; // 電流(單位:毫安培) float power_mW = 0.0; // 功率(單位:毫瓦) ina226.readAndClearFlags(); // 讀取並清除標誌位 shuntVoltage_mV = ina226.getShuntVoltage_mV(); // 獲取分流電壓 busVoltage_V = ina226.getBusVoltage_V(); // 獲取總線電壓 current_mA = ina226.getCurrent_mA(); // 獲取電流 power_mW = ina226.getBusPower(); // 獲取功率 loadVoltage_V = busVoltage_V + (shuntVoltage_mV / 1000); // 計算負載電壓 Serial.print("分流電壓 [mV]: "); Serial.println(shuntVoltage_mV); Serial.print("總線電壓 [V]: "); Serial.println(busVoltage_V); Serial.print("負載電壓 [V]: "); Serial.println(loadVoltage_V); Serial.print("電流 [mA]: "); Serial.println(current_mA); Serial.print("總線功率 [mW]: "); Serial.println(power_mW); if (!ina226.overflow) { Serial.println("數值正常 - 無溢出"); } else { Serial.println("溢出!請選擇更高的電流範圍"); } Serial.println(); delay(3000); // 每 3 秒更新一次 } |
程式修改與設置
從此程式碼中,您需要進行一些修改以準確獲得結果。
1 |
ina226.setResistorRange(0.1, 1.3); |
這一行設定電阻和電流範圍。如果電阻為 5.0 mΩ,電流範圍可達 10A。預設為 100 mΩ,約為 1.3A。
1 |
ina226.setCorrectionFactor(0.93); |
如果 INA226 提供的電流值與校準設備測得的值存在固定的差異,您可以定義一個校正係數。
校正係數 = 從校準設備測得的電流值 / INA226 提供的電流值
您可以將萬用電表串聯連接到 Vin-,測量電流並與序列監視器中的值進行比對。
-
設定分流器和母線電壓轉換的測量次數
使用setAverage()
設置:- 可以平均的測量次數為:1、4、16、64、128、256、512 或 1024 次。
-
設定分流器和母線電壓的 A/D 轉換時間
使用setConvTime()
設置:- 有 8 個級別可調,範圍從 140 µs 到 8.244 ms。
- 注意:獲取一組分流器和母線電壓數據的時間為轉換時間的 兩倍。
-
設定測量模式
使用setMeasureMode()
設置:- CONTINUOUS:持續測量模式。
- TRIGGERED:按需測量模式(在下一個範例中解釋)。
- POWER_DOWN:關閉 INA226,但建議使用更方便的
powerDown()
函數(在後面解釋)。
-
僅測量分流器或母線電壓
INA226 實際上支持僅測量分流器或母線電壓,但在此庫中未實現。使用該庫時,測量結果僅以成對的形式提供。 -
設定電流範圍
使用setCurrentRange()
設置:- 最大電流可設置為 400 mA 或 800 mA。
- 電流範圍越小,電流和功率的分辨率越高。
這些功能設置能幫助優化 INA226 的性能並滿足不同應用場景的需求。
測試結果
當您將程式碼上傳到 Arduino 開發板後,即可開始測試設置。
首先,將 3.7V 鋰離子電池 連接到 Vin+ 腳位,並將 直流馬達 連接到 Vin- 腳位。直流馬達將開始旋轉。
現在打開序列監視器,您將看到來自 3.7V 電源 的以下結果。
移除 3.7V 電池,然後連接 9V 電池。
當相同電路使用 9V 直流電源 測試時,會得到以下結果。
總結來說,INA226 直流電流感測模組 是一款高度多功能且性能卓越的裝置,非常適合需要精確監測功率、電流和電壓的多種應用。相較於前代產品 INA219,其具備更廣的範圍,可測量高達 36V 的電壓 和 20A 的電流。
將 INA226 電流感測模組與 Arduino 結合,讓我們能夠以簡單直觀的方式利用其先進功能,成為追求高精度且具成本效益監測解決方案的不可或缺工具。因此,透過掌握 INA226 與 Arduino 的介面,我們可以大幅提升在電子系統中監控與管理電力的能力。
發佈留言
很抱歉,必須登入網站才能發佈留言。