如果您是像我这样的制造商并在网上寻找一些有趣的项目,那么毫欧表是您可以制作的一件简单而有用的东西。该电路的基本原理是基于恒流源,我们在之前的一篇文章中已经介绍过。毫欧表是一种设备,可用于确定小电阻的值、PCB 走线的电阻,如果您了解专有技术,则可以使用它来找出 PCB 中的短路。
互联网上有很多毫欧表和低电阻表电路,但今天我们将使用 Arduino 和流行的 LM317 线性稳压器 IC 制作一个非常简单的低电阻表,它不仅可靠而且提供了一个准确的测量。W 还将在 OLED 显示屏上显示信息,最后,我们将对我们的电路进行性能测试。在我们的测试中,该电路不仅准确,而且范围也不错。我们能够非常准确地测量 0.05R 到 22R。所以事不宜迟,让我们开始吧。
什么是毫欧表,它是如何工作的?
正如我们之前所讨论的,毫欧表是一种用于测量低电阻的设备,如果您问为什么测量低电阻很重要,让我告诉您它可以用于许多不同类型的应用,而不是测量反抗。一个例子可能是;假设您的电路板显示电源部分短路,大多数情况下,问题可能是电容器损坏。如果您可以使用低电阻表,您可以检查电路板的不同部分,以查明电阻最低的特定区域,然后您可以从那里开始调试。这是一个简单的例子,如果你想你可以做的不仅仅是这个。
电阻可以定义为阻碍电子流动的成分;电阻的单位是欧姆。毫欧表是一种非常简单的仪器,用于测量未知/低值电阻。市场上有许多欧姆表,它们可以测量各种电阻,但这些仪表有一个共同点,一开始它们非常昂贵。
我们的毫欧表根据欧姆定律工作。工作原理和电路很简单,从标题就知道了,我们要用一个Arduino来处理电流信息,但是Arduino不知道如何测量电流,它只知道如何测量电压,要将电流值转换为电压值,我们将结合欧姆定律使用恒流源,并且我们将使用流行的LM317 稳压器作为恒流源。
构建基于 Arduino 的低电阻表所需的组件
您需要一些组件来构建这个项目,因为它们非常通用,您可以在当地的爱好商店中找到所有这些组件。下面给出了具有值的组件列表。
Arduino 纳米 - 1
LM317T - 1
128 X 64 OLED - 1
10 R 电阻 - 1
测试电阻器
基于 Arduino 的低电阻表示意图
基于 Arduino 的低电阻表的完整电路图如下所示。
该电路的连接图和工作原理非常简单,如上图所示,我们有一个Arduino Nano负责数据采集、计算和处理。我们有一个 OLED 显示屏,可以显示计算出的电阻值。最后,我们使用的是恒流源 LM317T。通过恒流源和一点欧姆定律,我们可以很容易地计算出电阻值。
在原理图中,您可以看到用于计算 LM317 稳压器 IC 的电流限制的公式。您还可以在原理图中看到,我们在电路中使用了一个 10R 电阻器来计算 0.125A 或 125mA 的恒定电流。现在,由于我们有电流值,我们只需将其除以电压即可得到电阻 V=IR,因此 R =V/I,我们将得到电阻。
代码:基于 Arduino 的低电阻表
此项目中使用的完整代码可在此页面底部找到。添加所需的头文件和源文件后,应该可以直接编译Arduino代码了。您可以从下面给出的链接下载库,或者您可以使用板管理器方法安装库。
代码非常简单,如下所示。我们首先包含所有必需的库。由于我们使用的是 OLED 显示器,所以我们必须包含 SSD1306 库和 Wire 库,SSD1306 库使用 Wire 库。
#include#include // OLED 线库
接下来,我们将定义显示器的屏幕宽度和屏幕高度。此外,我们将定义 LM317 稳压器 IC 的电阻值和参考值。这是必需的,因为我们将使用这些值计算恒定电流。一旦我们这样做,我们将定义平均 ADC 值所需的所有必要变量。此外,我们将声明引脚号和其他变量。
常量 int numReadings = 50; // 用于平均/我们将取 50 个样本并平均得到 ADC 值 整数读数[numReadings];// 存储来自模拟输入的读数 int readIndex = 0; // 当前读数的索引 整数 = 0; // 运行总和 int ADC平均值 = 0; // 平均值 浮动R;// 存储电阻值 整数输入引脚 = A0;// A0 被选为输入
接下来,我们为 SSD1306 显示器创建一个实例并传入线对象。
Adafruit_SSD1306 显示(SCREEN_WIDATA_PINH,SCREEN_HEIGHT,&Wire,-1);
接下来,在 setup() 部分,我们将初始化显示并检查显示是否可用。我们在 if 语句的帮助下做到这一点。如果显示可用,我们继续执行我们的代码,否则我们打印一个错误语句。
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 地址 0x3D 为 128x64 Serial.println(F("SSD1306 分配失败")); 为了 (;;); }
接下来,我们设置 OLED 显示屏的文本颜色,如果不设置,则显示屏可能会显示黑色段。然后我们在display.setRotation(2)方法的帮助下旋转显示,因为这是这个项目的要求。 完成后,我们定义 for 循环。在 for 循环中,我们将数组的所有元素初始化为零。这很重要,因为数组中可能存在垃圾值,这可能会在我们的计算中引入错误。
display.setTextColor(白色);//设置液晶颜色 display.setRotation(2); // 它有模式 1,2,3,4 // for (int thisReading = 0; thisReading < numReadings; thisReading++) { 读数[thisReading] = 0; } 延迟(500); }
接下来,我们有我们的循环()部分。在本节中,我们将进行平均 ADC 值所需的所有必要计算,以平滑输出 ADC 读数。您在下面看到的代码用于平均 ADC 值。
总计 = 总计 - 读数 [readIndex];//减去最后一个读数: 读数[readIndex] = 模拟读数(输入引脚);// 从传感器读取: 总计 = 总计 + 读数[readIndex];// 将读数加到总数中: 读取索引 = 读取索引 + 1;// 前进到数组中的下一个位置: if (readIndex >= numReadings) { // 如果我们在数组的末尾... // ...绕到开头: 读取索引 = 0; }
一旦 ADC 值被平均,我们打印平均值仅用于调试。接下来,我们将 ADC 值转换为电压值,因为这是计算所需的。此后,我们打印电压值进行调试。一旦我们有了电压,我们就知道我们的电流值是固定的。现在,在欧姆定律的帮助下,我们计算电阻值并将其打印在串行监视器窗口中。此外,我们在 OLED 显示屏上打印这些值。
ADCaverage = 总数 / numReadings;// 计算平均值: Serial.print("AVG:"); Serial.print(ADCaverage); 浮动电压 = ADCaverage * (5.0 / 1024.0);// 将 ADCaverage 转换为电压 序列号.print("\t\t"); // 给我一点TAb好吗 Serial.print(电压,3);// 将电压打印到串行监视器 Serial.print(" \t \t");// 再给我一个小TAb好吗 R = 电压 / (LM317_REF / LM317_Resistance); Serial.print("阻力:"); 序列号.println(R); display.clearDisplay(); display.setTextSize(2); display.setCursor(10, 10); 显示.打印(R,3); display.print("R"); 显示.显示(); 延迟(50);
这标志着我们编码过程的结束,现在我们可以开始测试我们的仪表了。
基于 Arduino 的低电阻表的测试
为了测试该电路,使用了以下设置。该设置是在面包板上进行的,仅用于测试目的,强烈建议将此电路制作在合适的 PCB 板上。
正如您在图片中看到的那样,我们在面包板上制作了电路,因为它是一个测试电路,结果证明这是一个坏主意,因为接触电阻和阻抗对电路造成了很大的影响。这就是为什么在最后一刻,我们决定直接在电路板上焊接一些电线,我们还将10R电阻和鳄鱼夹的电线直接焊接到LM317 IC本身上。
完成后,我们用这个仪表测量了一些电阻并观察了结果,结果非常好。正如您在上图中所看到的,该值非常准确。
为了验证结果,我们决定在 MECHO 450B+ 万用表的帮助下再次测试电路,结果非常糟糕。万用表给了我们非常奇怪的值,可能是一个错误。为了验证,我们再次测试了不同的电阻值,结果几乎相同。在这一点上,我们确信 Meco 万用表无法测量如此低的电阻值。您可以查看描述中的视频以获取更多详细信息。
进一步增强
这个电路并不完美,还有很大的改进空间。首先,电路需要在穿孔板或一块PCB板上,否则我们会遇到各种各样的问题。我们使用 LM317 IC 制作了恒流源,可以升级为专门为此目的设计的特定恒流源。我们使用公差为 5% 的电阻,但使用公差为 1% 或更低的电阻会大大改善结果。
#include
#include
#define SCREEN_WIDATA_PINH 128 // OLED 显示宽度,以像素为单位
#define SCREEN_HEIGHT 64 // OLED 显示高度,以像素为单位
#define LM317_REF 1.25
#define LM317_Resistance 10.1
常量 int numReadings = 50; // 用于平均/我们将取 50 个样本并平均得到 ADC 值
整数读数[numReadings];//来自模拟输入的读数
int readIndex = 0; // 当前读数的索引
整数 = 0; // 运行总和
int ADC平均值 = 0; // 平均值
浮动R;
整数输入引脚 = A0;
Adafruit_SSD1306 显示(SCREEN_WIDATA_PINH,SCREEN_HEIGHT,&Wire,-1);
无效设置(){
// 把你的设置代码放在这里,运行一次:
序列号.开始(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 地址 0x3D 为 128x64
Serial.println(F("SSD1306 分配失败"));
为了 (;;);
}
display.setTextColor(白色);//设置液晶颜色
display.setRotation(2); // 它有模式 1,2,3,4
//
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
读数[thisReading] = 0;
}
延迟(500);
}
无效循环(){
总计 = 总计 - 读数 [readIndex];//减去最后一个读数:
读数[readIndex] = 模拟读数(输入引脚);// 从传感器读取:
总计 = 总计 + 读数[readIndex];// 将读数加到总数中:
读取索引 = 读取索引 + 1;// 前进到数组中的下一个位置:
if (readIndex >= numReadings) {
// 如果我们在数组的末尾...
// ...绕到开头:
读取索引 = 0;
}
ADCaverage = 总数 / numReadings;// 计算平均值:
Serial.print("AVG:");
Serial.print(ADCaverage);
浮动电压 = ADCaverage * (5.0 / 1024.0);// 转换 ADCaverage t0 电压
序列号.print("\t\t"); // 给我一点TAb好吗
Serial.print(电压,3);// 将电压打印到串行监视器
Serial.print(" \t \t");// 再给我一个小TAb好吗
R = 电压 / (LM317_REF / LM317_Resistance);
Serial.print("阻力:");
序列号.println(R);
display.clearDisplay();
display.setTextSize(2);
display.setCursor(10, 10);
显示.打印(R,3);
display.print("R");
显示.显示();
延迟(50);
}
评论
查看更多