如果您曾经使用过电池,SMPS电路或其他电源电路,那么经常会发生这种情况,您必须通过加载电源来测试电源,以检查其在不同负载条件下的性能。通常用于执行此类测试的设备称为“恒定电流直流负载”,它使我们能够调整电源的输出电流,然后保持恒定,直到再次调整为止。在本教程中,我们将学习如何使用Arduino构建我们自己的可调电子负载,该负载可以接受24V的最大输入电压和高达5A的漏极电流。对于该项目,我们使用了由AllPCB制造的PCB板,AllPCB是一家位于中国的专业PCB制造和组装服务提供商。
在我们之前的压控电流源教程中,我们已经解释了如何将运算放大器与MOSFET一起使用以及如何使用压控电流源电路。但是在本教程中,我们将应用该电路并制作一个数控电流源。显然,一个数字控制的电流源需要一个数字电路,并且为此目的,使用了Arduino NANO。 Arduino NANO将提供直流负载所需的控件。
该电路包括三个部分。第一部分是Arduino Nano部分,第二部分是数模转换器,第三部分是纯模拟电路,在单个封装中使用双运算放大器来控制负载部分。该项目的灵感来自Arduino上的一则文章,但是,电路的变化使其复杂性降低了,每个人都可以构建它的基本功能。
我们的电子负载设计为具有以下输入和输出部分。
- 两个输入开关,用于增加和减少负载。
- LCD将显示设置的负载,实际负载和负载电压。
- 最大负载电流限制为5A。
- 负载的最大输入电压为24V。
所需材料
下面列出了构建直流电子负载所需的组件。
- Arduino纳米
- 16x2字符LCD
- 两桶插座
- Mosfet irf540n
- Mcp4921
- 358号
- 5瓦并联电阻.1欧姆
- 1k
- 10k-6个
- 散热器
- .1uF 50伏
- 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电流流经电阻时,根据欧姆定律,.1欧姆分流电阻两端的电压降将为0.5V(V = I x R)。同相放大器会将其放大到x6,因此放大器第二部分的输出将为3V。该输出将由Arduino nano模拟输入引脚感测,并且将计算电流。
放大器的第一部分配置为电压跟随器电路,该电压跟随器电路将根据输入电压控制MOSFET,并由于流经分流电阻器的负载电流而获得所需的反馈电压。
MCP4921是数模转换器。 DAC使用SPI通信协议从任何微控制器单元获取数字数据,并根据其提供模拟电压输出。该电压是运算放大器的输入。先前我们还学习了如何在PIC中使用该MCP4921 DAC。
另一方面,还有一个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(接地平面中的随机过孔),用于在上下两层中正确地接地。
您也可以从下面的链接下载此PCB的Gerber文件,并将其用于制造。
- 下载可调电子直流负载Gerber文件
从AllPCB订购PCB
准备好Gerber文件后,就可以使用它来制造PCB了。说到这,便引起了ALLPCB的赞助者,ALLPCB以其高质量的PCB和超快速的运输而闻名。除PCB制造外,AllPCB还提供PCB组装和元件采购。
要从他们那里获取您的PCB订单,请访问 allpcb.com和注册。然后在主页上输入PCB的尺寸和所需的数量,如下所示。然后单击立即报价。
现在,您可以更改PCB的其他参数,例如层数,掩模颜色,厚度等。在右侧,您可以选择您所在的国家/地区和首选的运输选项。这将显示提前期和要支付的总金额。我选择了DHL,总金额为$ 26,但如果您是第一次购物,则价格会在结帐时下降。然后单击添加到购物车,然后单击立即结帐。
现在,您可以单击“上传Gerber”,然后单击“购买”,以上传Gerber文件。
在下一页上,您可以输入您的收货地址并检查您必须为PCB支付的最终价格。然后,您可以查看您的订单,然后单击“提交”以付款。
一旦确认您的订单,您就可以坐下来为PCB进行接力到达您家门口。几天后我收到了订单,然后包装很整齐,如下所示。
如您在下面的图片中所见,PCB的质量一如既往地好。电路板的顶部和底部如下所示。
拿到板子后,就可以组装所有组件了。我完成的电路板如下图所示。
接下来,您可以上传代码并打开模块电源,以检查其工作方式。该项目的完整代码在本页底部。代码说明如下。
可调直流负载的Arduino代码
代码很简单。首先,我们包含了SPI和LCD标头文件,并设置了最大逻辑电压,芯片选择引脚等。
#包括
本节包含与程序流有关的整数和变量声明。此外,我们使用Arduino Nano设置了相关的外设引脚。
const int slaveSelectPin = 10; //片选引脚 int number = 0; 整数增加= A2; //增加pin int减少= A3; //减小引脚 int current_sense = A0; //电流检测引脚 int voltage_sense = A1; //电压检测引脚 int state1 = 0; int state2 = 0; 整数设置= 0; 浮动电压= 0; float load_current = 0.0; 浮动负载电压= 0.0; 浮置电流= 0.0; 浮动电压= 0.0; 液晶液晶(7,6,5,4,4,3,2); // LCD引脚
这用于LCD和SPI的设置。同样,在此设置了引脚方向。
void setup(){ pinMode(slaveSelectPin,OUTPUT); pinMode(increase,INPUT); pinMode(减少,输入); pinMode(current_sense,INPUT); pinMode(电压感应,输入); //初始化SPI: SPI.begin(); //设置LCD的列数和行数: lcd.begin(16,2); //在LCD上显示一条消息。 lcd.print(“数字负载”); lcd.setCursor(0,1); lcd.print(“ Circuit Digest”); 延误(2000); }
它用于转换DAC值。
void convert_DAC(unsigned int value) { / *步长= 2 ^ n,因此12bit 2 ^ 12 = 4096 对于5V参考,步长将为5/4095 = 0.0012210012210012V或1mV(大约)* / unsigned int容器; 未签名的int MSB; 未签名的int LSB; / *步骤:1,将12位数据存储到容器中 假设数据为4095,以二进制1111 1111 1111 * / container = value; / *步骤:2创建8位虚拟对象。因此,通过除以256,可在LSB中捕获高4位 LSB = 0000 1111 * / LSB = container / 256; / *步骤:3通过打孔4位数据发送配置。 LSB = 0011 0000或00001111。结果为0011 1111 * / LSB =(0x30)-LSB; / *步骤:4容器仍具有21位值。提取低8位。 1111 1111和1111 11111111。结果是1111 1111,即MSB * / MSB = 0xFF&容器; / *步骤:4通过划分为两个字节来发送16位数据。* / digitalWrite(slaveSelectPin,LOW); 延迟(100); SPI.transfer(LSB); SPI.transfer(MSB); 延迟(100); //将SS引脚拉高以取消选择芯片: digitalWrite(slaveSelectPin,HIGH); }
本部分用于电流检测相关的操作。
float read_current(void){ load_current = 0; for(int a = 0; a <average; a ++){ load_current = load_current + AnalogRead(current_sense); } load_current =负载电流/平均; load_current =(load_current * MAX_VOLT)/ 1024; load_current =(load_current / opamp_gain)/ load_resistor; 返回load_current; }
这用于读取负载电压。
浮动读取电压(无效){ 负载电压= 0; for(int a = 0; a <average; a ++){ load_voltage = load_voltage + AnalogRead(voltage_sense); } load_voltage =负载电压/平均值; load_voltage =((load_voltage * MAX_VOLT)/1024.0)* 6; 返回负载电压 }
这是实际的循环。此处,测量开关步骤,并将数据发送到DAC。传输数据后,将测量实际电流和负载电压。这两个值最终也都打印在液晶显示屏上。
无效循环(){ state1 = AnalogRead(increase); 如果(state1> 500){ delay(50); state1 = AnalogRead(增加); 如果(state1> 500){ 伏特=伏特+0.02; } } STATE2 = analogRead(减少); 如果(state2> 500){ delay(50); state2 = AnalogRead(减少); 如果(状态2> 500){ 如果(伏特== 0){ 伏特= 0; } else { 伏特=伏特0.02; } } } 数=伏特/ 0.0012210012210012; convert_DAC(数字); 电压= read_voltage(); 当前= read_current(); lcd.setCursor(0,0); lcd.print(“设置值”); lcd.print(“ =”); 设定=(伏特/ 2)* 10000; lcd.print(Set); lcd.print(“ mA”); lcd.setCursor(0,1); lcd.print(“ I”); lcd.print(“ =”); lcd.print(当前); lcd.print(“ A”); lcd.print(“ V”); lcd.print(“ =”); lcd.print(电压); lcd.print(“ V”); // lcd.print(load_voltage); //lcd.print("mA“); // delay(1000); //lcd.clear(); }
测试我们的可调直流负载
数字负载电路通过12V电源焊接并上电。我在电源侧使用了7.4V锂电池,并连接了钳型表以检查其工作方式。如您所见,当设定电流为300mA时,电路将从电池中汲取300mA电流,该电流也由钳形表测量为310mA。
可以在下面的视频中找到电路的完整工作。希望您理解该项目并喜欢构建有用的东西。如果您有任何疑问,请将其留在评论部分或使用论坛。