如果您是像我這樣的制造商并在網(wǎng)上尋找一些有趣的項(xiàng)目,那么毫歐表是您可以制作的一件簡(jiǎn)單而有用的東西。該電路的基本原理是基于恒流源,我們?cè)谥暗囊黄恼轮幸呀?jīng)介紹過。毫歐表是一種設(shè)備,可用于確定小電阻的值、PCB 走線的電阻,如果您了解專有技術(shù),則可以使用它來找出 PCB 中的短路。
互聯(lián)網(wǎng)上有很多毫歐表和低電阻表電路,但今天我們將使用 Arduino 和流行的 LM317 線性穩(wěn)壓器 IC 制作一個(gè)非常簡(jiǎn)單的低電阻表,它不僅可靠而且提供了一個(gè)準(zhǔn)確的測(cè)量。W 還將在 OLED 顯示屏上顯示信息,最后,我們將對(duì)我們的電路進(jìn)行性能測(cè)試。在我們的測(cè)試中,該電路不僅準(zhǔn)確,而且范圍也不錯(cuò)。我們能夠非常準(zhǔn)確地測(cè)量 0.05R 到 22R。所以事不宜遲,讓我們開始吧。
什么是毫歐表,它是如何工作的?
正如我們之前所討論的,毫歐表是一種用于測(cè)量低電阻的設(shè)備,如果您問為什么測(cè)量低電阻很重要,讓我告訴您它可以用于許多不同類型的應(yīng)用,而不是測(cè)量反抗。一個(gè)例子可能是;假設(shè)您的電路板顯示電源部分短路,大多數(shù)情況下,問題可能是電容器損壞。如果您可以使用低電阻表,您可以檢查電路板的不同部分,以查明電阻最低的特定區(qū)域,然后您可以從那里開始調(diào)試。這是一個(gè)簡(jiǎn)單的例子,如果你想你可以做的不僅僅是這個(gè)。
電阻可以定義為阻礙電子流動(dòng)的成分;電阻的單位是歐姆。毫歐表是一種非常簡(jiǎn)單的儀器,用于測(cè)量未知/低值電阻。市場(chǎng)上有許多歐姆表,它們可以測(cè)量各種電阻,但這些儀表有一個(gè)共同點(diǎn),一開始它們非常昂貴。
我們的毫歐表根據(jù)歐姆定律工作。工作原理和電路很簡(jiǎn)單,從標(biāo)題就知道了,我們要用一個(gè)Arduino來處理電流信息,但是Arduino不知道如何測(cè)量電流,它只知道如何測(cè)量電壓,要將電流值轉(zhuǎn)換為電壓值,我們將結(jié)合歐姆定律使用恒流源,并且我們將使用流行的LM317 穩(wěn)壓器作為恒流源。
構(gòu)建基于 Arduino 的低電阻表所需的組件
您需要一些組件來構(gòu)建這個(gè)項(xiàng)目,因?yàn)樗鼈兎浅Mㄓ茫梢栽诋?dāng)?shù)氐膼酆蒙痰曛姓业剿羞@些組件。下面給出了具有值的組件列表。
Arduino 納米 - 1
LM317T - 1
128 X 64 OLED - 1
10 R 電阻 - 1
測(cè)試電阻器
基于 Arduino 的低電阻表示意圖
基于 Arduino 的低電阻表的完整電路圖如下所示。
該電路的連接圖和工作原理非常簡(jiǎn)單,如上圖所示,我們有一個(gè)Arduino Nano負(fù)責(zé)數(shù)據(jù)采集、計(jì)算和處理。我們有一個(gè) OLED 顯示屏,可以顯示計(jì)算出的電阻值。最后,我們使用的是恒流源 LM317T。通過恒流源和一點(diǎn)歐姆定律,我們可以很容易地計(jì)算出電阻值。
在原理圖中,您可以看到用于計(jì)算 LM317 穩(wěn)壓器 IC 的電流限制的公式。您還可以在原理圖中看到,我們?cè)陔娐分惺褂昧艘粋€(gè) 10R 電阻器來計(jì)算 0.125A 或 125mA 的恒定電流。現(xiàn)在,由于我們有電流值,我們只需將其除以電壓即可得到電阻 V=IR,因此 R =V/I,我們將得到電阻。
代碼:基于 Arduino 的低電阻表
此項(xiàng)目中使用的完整代碼可在此頁面底部找到。添加所需的頭文件和源文件后,應(yīng)該可以直接編譯Arduino代碼了。您可以從下面給出的鏈接下載庫(kù),或者您可以使用板管理器方法安裝庫(kù)。
下載 Adafruit 的 SSD1306 OLED 庫(kù)
代碼非常簡(jiǎn)單,如下所示。我們首先包含所有必需的庫(kù)。由于我們使用的是 OLED 顯示器,所以我們必須包含 SSD1306 庫(kù)和 Wire 庫(kù),SSD1306 庫(kù)使用 Wire 庫(kù)。
?
#include#include // OLED 線庫(kù)
?
接下來,我們將定義顯示器的屏幕寬度和屏幕高度。此外,我們將定義 LM317 穩(wěn)壓器 IC 的電阻值和參考值。這是必需的,因?yàn)槲覀儗⑹褂眠@些值計(jì)算恒定電流。一旦我們這樣做,我們將定義平均 ADC 值所需的所有必要變量。此外,我們將聲明引腳號(hào)和其他變量。
?
常量 int numReadings = 50; // 用于平均/我們將取 50 個(gè)樣本并平均得到 ADC 值 整數(shù)讀數(shù)[numReadings];// 存儲(chǔ)來自模擬輸入的讀數(shù) int readIndex = 0; // 當(dāng)前讀數(shù)的索引 整數(shù) = 0; // 運(yùn)行總和 int ADC平均值 = 0; // 平均值 浮動(dòng)R;// 存儲(chǔ)電阻值 整數(shù)輸入引腳 = A0;// A0 被選為輸入
?
接下來,我們?yōu)?SSD1306 顯示器創(chuàng)建一個(gè)實(shí)例并傳入線對(duì)象。
?
Adafruit_SSD1306 顯示(SCREEN_WIDATA_PINH,SCREEN_HEIGHT,&Wire,-1);
?
接下來,在 setup() 部分,我們將初始化顯示并檢查顯示是否可用。我們?cè)?if 語句的幫助下做到這一點(diǎn)。如果顯示可用,我們繼續(xù)執(zhí)行我們的代碼,否則我們打印一個(gè)錯(cuò)誤語句。
?
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 地址 0x3D 為 128x64 Serial.println(F("SSD1306 分配失敗")); 為了 (;;); }
?
接下來,我們?cè)O(shè)置 OLED 顯示屏的文本顏色,如果不設(shè)置,則顯示屏可能會(huì)顯示黑色段。然后我們?cè)赿isplay.setRotation(2)方法的幫助下旋轉(zhuǎn)顯示,因?yàn)檫@是這個(gè)項(xiàng)目的要求。?完成后,我們定義 for 循環(huán)。在 for 循環(huán)中,我們將數(shù)組的所有元素初始化為零。這很重要,因?yàn)閿?shù)組中可能存在垃圾值,這可能會(huì)在我們的計(jì)算中引入錯(cuò)誤。
?
display.setTextColor(白色);//設(shè)置液晶顏色 display.setRotation(2); // 它有模式 1,2,3,4 // for (int thisReading = 0; thisReading < numReadings; thisReading++) { 讀數(shù)[thisReading] = 0; } 延遲(500); }
?
接下來,我們有我們的循環(huán)()部分。在本節(jié)中,我們將進(jìn)行平均 ADC 值所需的所有必要計(jì)算,以平滑輸出 ADC 讀數(shù)。您在下面看到的代碼用于平均 ADC 值。
?
總計(jì) = 總計(jì) - 讀數(shù) [readIndex];//減去最后一個(gè)讀數(shù): 讀數(shù)[readIndex] = 模擬讀數(shù)(輸入引腳);// 從傳感器讀?。? 總計(jì) = 總計(jì) + 讀數(shù)[readIndex];// 將讀數(shù)加到總數(shù)中: 讀取索引 = 讀取索引 + 1;// 前進(jìn)到數(shù)組中的下一個(gè)位置: if (readIndex >= numReadings) { // 如果我們?cè)跀?shù)組的末尾... // ...繞到開頭: 讀取索引 = 0; }
?
一旦 ADC 值被平均,我們打印平均值僅用于調(diào)試。接下來,我們將 ADC 值轉(zhuǎn)換為電壓值,因?yàn)檫@是計(jì)算所需的。此后,我們打印電壓值進(jìn)行調(diào)試。一旦我們有了電壓,我們就知道我們的電流值是固定的。現(xiàn)在,在歐姆定律的幫助下,我們計(jì)算電阻值并將其打印在串行監(jiān)視器窗口中。此外,我們?cè)?OLED 顯示屏上打印這些值。
?
ADCaverage = 總數(shù) / numReadings;// 計(jì)算平均值: Serial.print("AVG:"); Serial.print(ADCaverage); 浮動(dòng)電壓 = ADCaverage * (5.0 / 1024.0);// 將 ADCaverage 轉(zhuǎn)換為電壓 序列號(hào).print("\t\t"); // 給我一點(diǎn)TAb好嗎 Serial.print(電壓,3);// 將電壓打印到串行監(jiān)視器 Serial.print(" \t \t");// 再給我一個(gè)小TAb好嗎 R = 電壓 / (LM317_REF / LM317_Resistance); Serial.print("阻力:"); 序列號(hào).println(R); display.clearDisplay(); display.setTextSize(2); display.setCursor(10, 10); 顯示.打?。≧,3); display.print("R"); 顯示.顯示(); 延遲(50);
?
這標(biāo)志著我們編碼過程的結(jié)束,現(xiàn)在我們可以開始測(cè)試我們的儀表了。
基于 Arduino 的低電阻表的測(cè)試
為了測(cè)試該電路,使用了以下設(shè)置。該設(shè)置是在面包板上進(jìn)行的,僅用于測(cè)試目的,強(qiáng)烈建議將此電路制作在合適的 PCB 板上。
正如您在圖片中看到的那樣,我們?cè)诿姘迳现谱髁穗娐?,因?yàn)樗且粋€(gè)測(cè)試電路,結(jié)果證明這是一個(gè)壞主意,因?yàn)榻佑|電阻和阻抗對(duì)電路造成了很大的影響。這就是為什么在最后一刻,我們決定直接在電路板上焊接一些電線,我們還將10R電阻和鱷魚夾的電線直接焊接到LM317 IC本身上。
完成后,我們用這個(gè)儀表測(cè)量了一些電阻并觀察了結(jié)果,結(jié)果非常好。正如您在上圖中所看到的,該值非常準(zhǔn)確。
為了驗(yàn)證結(jié)果,我們決定在 MECHO 450B+ 萬用表的幫助下再次測(cè)試電路,結(jié)果非常糟糕。萬用表給了我們非常奇怪的值,可能是一個(gè)錯(cuò)誤。為了驗(yàn)證,我們?cè)俅螠y(cè)試了不同的電阻值,結(jié)果幾乎相同。在這一點(diǎn)上,我們確信 Meco 萬用表無法測(cè)量如此低的電阻值。您可以查看描述中的視頻以獲取更多詳細(xì)信息。
進(jìn)一步增強(qiáng)
這個(gè)電路并不完美,還有很大的改進(jìn)空間。首先,電路需要在穿孔板或一塊PCB板上,否則我們會(huì)遇到各種各樣的問題。我們使用 LM317 IC 制作了恒流源,可以升級(jí)為專門為此目的設(shè)計(jì)的特定恒流源。我們使用公差為 5% 的電阻,但使用公差為 1% 或更低的電阻會(huì)大大改善結(jié)果。
#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 個(gè)樣本并平均得到 ADC 值
整數(shù)讀數(shù)[numReadings];//來自模擬輸入的讀數(shù)
int readIndex = 0; // 當(dāng)前讀數(shù)的索引
整數(shù) = 0; // 運(yùn)行總和
int ADC平均值 = 0; // 平均值
浮動(dòng)R;
整數(shù)輸入引腳 = A0;
Adafruit_SSD1306 顯示(SCREEN_WIDATA_PINH,SCREEN_HEIGHT,&Wire,-1);
無效設(shè)置(){
// 把你的設(shè)置代碼放在這里,運(yùn)行一次:
序列號(hào).開始(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 地址 0x3D 為 128x64
Serial.println(F("SSD1306 分配失敗"));
為了 (;;);
}
display.setTextColor(白色);//設(shè)置液晶顏色
display.setRotation(2); // 它有模式 1,2,3,4
//
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
讀數(shù)[thisReading] = 0;
}
延遲(500);
}
無效循環(huán)(){
總計(jì) = 總計(jì) - 讀數(shù) [readIndex];//減去最后一個(gè)讀數(shù):
讀數(shù)[readIndex] = 模擬讀數(shù)(輸入引腳);// 從傳感器讀取:
總計(jì) = 總計(jì) + 讀數(shù)[readIndex];// 將讀數(shù)加到總數(shù)中:
讀取索引 = 讀取索引 + 1;// 前進(jìn)到數(shù)組中的下一個(gè)位置:
if (readIndex >= numReadings) {
// 如果我們?cè)跀?shù)組的末尾...
// ...繞到開頭:
讀取索引 = 0;
}
ADCaverage = 總數(shù) / numReadings;// 計(jì)算平均值:
Serial.print("AVG:");
Serial.print(ADCaverage);
浮動(dòng)電壓 = ADCaverage * (5.0 / 1024.0);// 轉(zhuǎn)換 ADCaverage t0 電壓
序列號(hào).print("\t\t"); // 給我一點(diǎn)TAb好嗎
Serial.print(電壓,3);// 將電壓打印到串行監(jiān)視器
Serial.print(" \t \t");// 再給我一個(gè)小TAb好嗎
R = 電壓 / (LM317_REF / LM317_Resistance);
Serial.print("阻力:");
序列號(hào).println(R);
display.clearDisplay();
display.setTextSize(2);
display.setCursor(10, 10);
顯示.打?。≧,3);
display.print("R");
顯示.顯示();
延遲(50);
}
評(píng)論