如果您是像我這樣的制造商并在網上尋找一些有趣的項目,那么毫歐表是您可以制作的一件簡單而有用的東西。該電路的基本原理是基于恒流源,我們在之前的一篇文章中已經介紹過。毫歐表是一種設備,可用于確定小電阻的值、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);
}
評論
查看更多