如果您曾經使用過電池、SMPS 電路或其他電源電路,那么通常會發生您必須通過加載來測試您的電源,以檢查它在不同負載條件下的性能。通常用于執行此類測試的設備稱為恒流直流負載,它允許我們調整電源的輸出電流,然后使其保持恒定,直到再次調整為止。在本教程中,我們將學習如何使用 Arduino 構建我們自己的可調電子負載,最大輸入電壓為 24V,漏極電流高達 5A。
該電路由三部分組成。第一部分是Arduino Nano部分,第二部分是數模轉換器,第三部分是純模擬電路,其中使用單個封裝的雙運算放大器來控制負載部分。這個項目的靈感來自于Arduino上的一篇文章,然而,為了降低復雜性,電路進行了更改,每個人都可以構建它的基本功能。
我們的電子負載設計有以下輸入和輸出部分。
兩個輸入開關,用于增加和減少負載。
顯示設定負載、實際負載和負載電壓的 LCD。
最大負載電流限制為 5A。
負載的最大輸入電壓為 24V。
所需材料
下面列出了構建直流電子負載所需的組件。
Arduino納米
16x2 字符 LCD
兩桶插座
麥克普4921
LM358
5 瓦分流電阻 0.1 歐姆
1k
10k - 6 個
散熱器
.1uF 50v
2k - 2 個
Arduino直流電子負載電路圖
在下面的示意圖中,運算放大器有兩個部分。一種是控制 MOSFET,另一種是放大感應電流。您還可以查看本頁底部的視頻,該視頻解釋了電路的完整工作。第一部分具有 R12、R13 和 MOSFET。R12 用于降低反饋部分的負載效應,R13 用作 Mosfet 柵極電阻。
額外的兩個電阻器 R8 和 R9 用于檢測將由該虛擬負載施加壓力的電源的電源電壓。根據分壓器規則,這兩個電阻最大支持 24V。超過 24V 會產生不適合 Arduino 引腳的電壓。所以請注意不要連接輸出電壓超過 24V 的電源。
電阻 R7 是這里的實際負載電阻。它是一個 5 瓦、0.1 歐姆的電阻器。根據冪律,它將支持最大 7A (P = I 2 R),但為了安全起見,將最大負載電流限制為 5A 更為明智。因此,目前最大24V、5A的負載可以通過這個假負載來設置。
另一部分放大器被配置為增益放大器。它將提供 6 倍的增益。在電流流動期間,會出現電壓降。例如,當 5A 電流流過電阻器時,根據歐姆定律,0.1 歐姆分流電阻器 (V = I x R) 兩端的電壓降將為 0.5V 。同相放大器會將其放大到 x6,因此 3V 將是放大器第二部分的輸出。該輸出將由 Arduino nano 模擬輸入引腳感應,并計算電流。
放大器的第一部分配置為電壓跟隨器電路,它將根據輸入電壓控制 MOSFET,并由于流過分流電阻的負載電流而獲得所需的反饋電壓。
MCP4921是數模轉換器。DAC 使用 SPI 通信協議從任何微控制器單元獲取數字數據,并根據它提供模擬電壓輸出。該電壓是運算放大器的輸入。我們之前還學習了如何將這個MCP4921 DAC 與 PIC一起使用。
另一方面,有一個 Arduino Nano,它將通過SPI 協議將數字數據提供給 DAC并控制負載,同時以 16x2 字符顯示屏顯示數據。使用了兩個額外的東西,即減少和增加按鈕。它不是連接到數字引腳,而是連接到模擬引腳。因此,可以將其更改為另一種類型的開關,例如滑塊或模擬編碼器。此外,通過修改代碼,可以提供原始模擬數據來控制負載。這也避免了開關抖動問題。
最后,通過增加負載,Arduino nano會將負載數據以數字格式提供給DAC,DAC將模擬數據提供給運放,運放根據運放的輸入電壓控制MOSFET 。 最后,根據流過分流電阻的負載電流,會出現一個電壓降,該電壓降將被 LM358 的第二通道進一步放大,并由 Arduino nano 得到。這將顯示在字符顯示屏上。當用戶按下減少按鈕時,也會發生同樣的事情。
PCB 設計和 Gerber 文件
由于該電路具有高電流路徑,因此使用適當的 PCB 設計策略來消除不需要的故障情況是一個更明智的選擇。因此,為這種直流負載設計了 PCB。我使用 Eagle PCB 設計軟件來設計我的 PCB。您可以選擇任何 PCB Cad 軟件。CAD軟件中最終設計的PCB如下圖所示,
在設計此 PCB 時需要注意的一個重要因素是使用厚電源層以使電流在整個電路中流動。還有接地縫合VIAS(接地平面中的隨機過孔),用于在到頂部和底部的兩層中實現適當的接地流。
拿到電路板后,您可以繼續組裝所有組件。我完成的電路板如下所示。
接下來,您可以上傳代碼并啟動模塊以檢查它是如何工作的。該項目的完整代碼在本頁底部給出。代碼解釋如下。
可調直流負載的 Arduino 代碼
代碼非常簡單。首先,我們包含了 SPI 和 LCD 頭文件以及設置最大邏輯電壓、片選引腳等。
?
#include#include #define SS_PIN 10 #define MAX_VOLT 5.0 // 最大邏輯電壓 #define load_resistor 0.1 // 以歐姆為單位的分流電阻值 #define opamp_gain 6 // 運算放大器的增益 #define average 10 // 平均時間
?
本節包含所需的與程序流相關的整數和變量聲明。此外,我們使用 Arduino Nano 設置關聯的外圍設備引腳。
?
常量 int slaveSelectPin = 10; // 片選引腳 int number = 0; int 增加 = A2; // 增加 pin int 減少 = A3; //減少引腳 int current_sense = A0; //電流檢測引腳 int voltage_sense = A1; // 電壓檢測引腳 int state1 = 0; int state2 = 0; 詮釋集= 0; 浮動電壓 = 0; 浮動負載電流 = 0.0; 浮動負載電壓= 0.0; 浮動電流 = 0.0; 浮動電壓 = 0.0; 液晶液晶(7、6、5、4、3、2);// LCD 引腳
?
這用于 LCD 和 SPI 的設置。此外,引腳方向設置在這里。
?
void setup() { pinMode(slaveSelectPin, OUTPUT); pinMode(增加,輸入); pinMode(減少,輸入); pinMode(current_sense,輸入); pinMode(電壓感應,輸入); // 初始化 SPI: SPI.begin(); //設置LCD的列數和行數: lcd.begin(16, 2); // 向 LCD 打印一條消息。 lcd.print("數字負載"); lcd.setCursor(0, 1); lcd.print("電路文摘"); 延遲(2000 年); }
?
它用于轉換 DAC 值。
?
void convert_DAC(unsigned int value) { /*步長 = 2^n, 因此 12bit 2^12 = 4096 對于 5V 參考,步長將是 5/4095 = 0.0012210012210012V 或 1mV(大約)*/ unsigned int container ; 無符號整數 MSB; 無符號整數 LSB; /*步驟:1、將12位數據存入容器 假設數據為4095,二進制1111 1111 1111*/ container = value; /*步驟:2 創建虛擬 8 位。因此,通過除以 256,在 LSB 中捕獲高 4 位 LSB = 0000 1111*/ LSB = container/256; /*Step: 3 發送配置打孔4位數據。 LSB = 0011 0000 或 0000 1111。結果為 0011 1111 */ LSB = (0x30) | 低位; /*Step:4 容器仍然有 21bit 的值。提取低 8 位。 1111 1111 和 1111 1111 1111。結果是 1111 1111,即 MSB*/ MSB = 0xFF & 容器; /*Step:4 將16bits的數據分成兩個字節發送。*/ digitalWrite(slaveSelectPin, LOW); 延遲(100); SPI.傳輸(LSB); SPI.傳輸(MSB); 延遲(100); // 將 SS 引腳拉高以取消選擇芯片: digitalWrite(slaveSelectPin, HIGH); }
?
本部分用于電流檢測相關操作。
?
浮動 read_current (void){ load_current = 0; for (int a = 0; a <平均值; a++){ load_current = load_current + analogRead(current_sense); } 負載電流 = 負載電流 / 平均值; load_current = (load_current* MAX_VOLT) / 1024; load_current = (load_current / opamp_gain) / load_resistor; 返回負載電流; }
?
這用于讀取負載電壓。
?
浮動讀取電壓(無效){ load_voltage = 0; for (int a = 0; a <平均值; a++){ load_voltage = load_voltage + analogRead(voltage_sense); } 負載電壓 = 負載電壓 / 平均值; load_voltage = ((load_voltage * MAX_VOLT)/1024.0)*6; 返回負載電壓; }
?
這是實際的循環。在這里,測量開關步驟并將數據發送到 DAC。傳輸數據后,正在測量實際電流和負載電壓。這兩個值也最終打印在 LCD 上。
?
無效循環(){ 狀態1 =模擬讀取(增加); if (state1 > 500){ 延遲(50); state1 = 模擬讀取(增加); 如果 (state1 > 500){ 伏特 = 伏特+0.02; } } state2 = 模擬讀取(減少); if (state2 > 500){ 延遲(50); state2 = 模擬讀取(減少); if (state2 > 500){ if (volt == 0){ volt = 0; } 其他{ 伏 = 伏-0.02; } } } 數字 = 伏特 / 0.0012210012210012; convert_DAC(數字); 電壓 = 讀取電壓(); 當前 = 讀取電流(); lcd.setCursor(0, 0); lcd.print("設置值"); lcd.print("="); 設置=(伏特/2)*10000; lcd.print(設置); lcd.print("毫安"); lcd.setCursor(0, 1); lcd.print("我"); lcd.print("="); lcd.print(當前); lcd.print("一個"); lcd.print("V"); lcd.print("="); lcd.print(電壓); // lcd.print(load_voltage); //lcd.print("mA"); // 延遲(1000); //lcd.clear(); }
?
測試我們的可調直流負載
數字負載電路采用 12V 電源焊接并通電。我在電源側使用了我的 7.4V 鋰電池,并連接了一個鉗形表來檢查它是如何工作的。正如您所看到的,當設定電流為 300mA 時,電路從電池中汲取 300mA 電流,該電流也由鉗形表測量為 310mA。
#include
#include
#define SS_PIN 10
#define MAX_VOLT 5.0
#define load_resistor 0.1
#define opamp_gain 6
#define average 10
const int slaveSelectPin = 10;
整數 = 0;
int 增加 = A2;
int減少= A3;
詮釋 current_sense = A0;
詮釋電壓感應= A1;
詮釋狀態1 = 0;
int state2 = 0;
詮釋集= 0;
浮動電壓 = 0;
浮動負載電流 = 0.0;
浮動負載電壓= 0.0;
浮動電流 = 0.0;
浮動電壓 = 0.0;
液晶液晶(7、6、5、4、3、2);
void setup() {
// 將 slaveSelectPin 設置為輸出:
pinMode(slaveSelectPin,輸出);
pinMode(增加,輸入);// 聲明 LED 為輸出
pinMode(decrease, INPUT); // 將按鈕聲明為輸入
pinMode(current_sense, INPUT); //
pinMode(voltage_sense, INPUT); //
// 初始化 SPI:
SPI.begin();
//設置LCD的列數和行數:
lcd.begin(16, 2);
// 向 LCD 打印一條消息。
lcd.print("數字負載");
lcd.setCursor(0, 1);
lcd.print("電路文摘");
延遲(2000 年);
}
void convert_DAC(unsigned int value)
{
/*步長 = 2^n, 因此 12bit 2^12 = 4096
對于 5V 參考,步長為 5/4095 = 0.0012210012210012V 或 1mV(大約)*/
unsigned int container ;
無符號整數 MSB;
無符號整數 LSB;
/*步驟:1、將12位數據存入容器
假設數據為4095,二進制1111 1111 1111*/
container = value;
/*步驟:2 創建虛擬 8 位。因此,通過除以 256,在 LSB 中捕獲高 4 位
LSB = 0000 1111*/
LSB = container/256;
/*Step: 3 發送配置打孔4位數據。
LSB = 0011 0000 或 0000 1111。結果為 0011 1111 */
LSB = (0x30) | 低位;
/*Step:4 容器仍然有 21bit 的值。提取低 8 位。
1111 1111 和 1111 1111 1111。結果是 1111 1111,即 MSB*/
MSB = 0xFF & 容器;
/*Step:4 將16bits的數據分成兩個字節發送。*/
digitalWrite(slaveSelectPin, LOW);
延遲(100);
SPI.傳輸(LSB);
SPI.傳輸(MSB);
延遲(100);
// 將 SS 引腳拉高以取消選擇芯片:
digitalWrite(slaveSelectPin, HIGH);
}
浮動 read_current (void){
load_current = 0;
for (int a = 0; a <平均值; a++){
load_current = load_current + analogRead(current_sense);
}
負載電流 = 負載電流 / 平均值;
load_current = (load_current* MAX_VOLT) / 1024;
load_current = (load_current / opamp_gain) / load_resistor;
返回負載電流;
}
浮動讀取電壓(無效){
load_voltage = 0;
for (int a = 0; a <平均值; a++){
load_voltage = load_voltage + analogRead(voltage_sense);
}
負載電壓 = 負載電壓 / 平均值;
load_voltage = ((load_voltage * MAX_VOLT)/1024.0)*6;
返回負載電壓;
}
無效循環() {
state1 = 模擬讀取(增加);
如果(狀態 1 > 500){
延遲(50);
state1 = 模擬讀取(增加);
如果 (state1 > 500){
伏特 = 伏特+0.02;
}
}
state2 = 模擬讀取(減少);
if (state2 > 500){
延遲(50);
state2 = 模擬讀取(減少);
if (state2 > 500){
if (volt == 0){
volt = 0;
}
其他{
伏 = 伏-0.02;
}
}
}
數 = 伏特 / 0.0012210012210012;
convert_DAC(數字);
電壓 = 讀取電壓();
當前 = 讀取電流();
lcd.setCursor(0, 0);
lcd.print("設置值");
lcd.print("=");
設置=(伏特/2)*10000;
lcd.print(設置);
lcd.print("毫安");
lcd.setCursor(0, 1);
lcd.print("我");
lcd.print("=");
lcd.print(當前);
lcd.print("一個");
lcd.print("V");
lcd.print("=");
lcd.print(電壓);
lcd.print("V");
// 液晶顯示器。打印(負載電壓);
//lcd.print("mA");
// 延遲(1000);
//lcd.clear();
}
評論
查看更多