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