اندازه گیری مقاومت داخلی باتری ISR با آردوینو و ATtiny85
محتویات
در حالتت ایده آل، یک باتری باید مقاومت داخلی صفر داشته باشد. اما باتری ها کامل ایده آل ساخته نشده اند و الکترودها 100% رسانا نیستند. بنابراین این مسئله مقاومت کمی در باتری ایجاد می کند که مقاومت داخلی باتری یا همان ISR نامیده می شود. عملا باتری ها همیشه مقداری مقاومت داخلی دارند. روی کاغذ، مقدار مقاومت برای یک باتری آلکالاین AA حدود 0.1Ω، برای یک باتری آلکالاین 9 ولتی حدود 1Ω و برای باتری لیتیوم پلیمری 20 تا 30 میلی اهم در نظر گرفته میشود. مقاومت داخلی به بار متصل به باتری ارتباط زیادی دارد.
در این مقاله، ما تصمیم گرفتیم که یک پروژه ISR سنج ساده مبتنی بر Attiny85 بسازیم که مقاومت داخلی هر باتری لیتیومی را به دقت اندازه گیری می کند و نتیجه را روی یک صفحه نمایش OLED نمایش می دهد.
چطور مقاومت داخلی باتری ISR را اندازه گیری کنیم؟
اکنون این سوال باقی می ماند که چگونه مقاومتی را که در داخل سلول باتری قرار دارد اندازه گیری می کنیم؟ پاسخ به این سوال ساده است، ما این کار را با کمک یک تقسیم کننده پتانسیل یا تقسیم کننده ولتاژ انجام می دهیم! بله، چیزی که شنیدید درست است. ما از یک تقسیم کننده ولتاژ و فرمول قانون اهم برای اندازه گیری مقاومت داخلی باتری استفاده خواهیم کرد. اما برای آن، ما به یک مقاومت با مقدار شناخته شده (ما از یک مقاومت 2 اهم استفاده می کنیم) و یک مولتی متر نیاز داریم. در بخش زیر به شما نشان داده ایم که چگونه می توانید این کار را انجام دهید.
مقاومت هایی که در بازار پیدا می کنید دقیق نیستند و دارای تلرانس هستند، به همین دلیل است که مقدار مقاومت بسته به دما می تواند تغییر کند. اکنون مقاومتی که ما استفاده می کنیم 5 درصد تلرانس دارد.
اکنون همانطور که می بینید مقاومت نشان داده شده در بالا 1.7 اهم است اما باید تلرانس مولتی متر و تلرانس مقاومت را نیز در نظر بگیریم. پس از در نظر گرفتن این موضوع متوجه شدیم که مقاومت تئوری 2 اهم ما دارای مقدار مقاومت 1.2 اهم است، بنابراین از مقدار 1.2 اهم در محاسبات استفاده خواهیم کرد.
نکته: مولتی متر ها معمولاً در اندازه گیری مقاومت خوب نیستند اما در اندازه گیری ولتاژ خوب هستند. بنابراین کاری که می توانید انجام دهید این است که از یک منبع جریان ثابت برای عبور 500 میلی آمپر یا 1 آمپر از مقاومت ها و اندازه گیری افت ولتاژ در مقاومت استفاده کنید. به این ترتیب می توانید اندازه گیری بسیار مناسبی از مقاومت بدست آورید.
حال باید ولتاژ بی باری باتری را همانطور که در تصویر زیر مشاهده می کنید اندازه گیری کنیم.
ولتاژ باتری 3.85 ولت است. اکنون باید جریان تئوری را محاسبه کنیم که اگر مقاومت را به باتری وصل کنیم، از طریق آن عبور می کند، برای این کار از قانون اهم استفاده می کنیم.
فرمول جریان از طریق مقاومت I = V/R
I = 3.85/1.2 =3.236 آمپر
اگر مقاومت را به باتری وصل کنیم، 3.22 آمپر توسط مقاومت 1.2 اهم کشیده می شود. سپس هنگامی که بار وصل می شود، باید ولتاژ را اندازه گیری کنیم.
در تصویر بالا مشاهده می کنید که ولتاژ بار Vload = 3.72 است. باید این دو مقدار ولتاژ یعنی ولتاژ مدار باز و ولتاژ بار را کم کنیم. اگر این کار را انجام دهیم، افت ولتاژ در مقاومت داخلی را دریافت خواهیم کرد.
Vinternal = 3.85-3.72 = 0.13V
اکنون افت ولتاژ مقاومت داخلی را داریم، می توانیم آن را بر جریان محاسبه شده تقسیم کنیم و مقاومت داخلی را بدست آوریم.
ISR = (Vdrop-internal / Current) = 0.13/3.236 = 0.04017 اهم
مقاومت داخلی محاسبه شده باتری 0.04017 میلی اهم است. بیایید ولتاژ محاسبه شده خود را با دستگاه مشابه خریداری شده از بازار تست کنیم.
همانطور که در تصویر مشاهده میکنید، مقداری که بدست آوردیم به مقداری که دستگاه حرفه ای بدست آورده است بسیار نزدیک است.
توجه: هنگامی که از این روش برای اندازه گیری مقاومت داخلی باتری با آردوینو استفاده می کنید، باید مقاومت داخلی ماسفت و مقاومت مسیر های مسی PCB را در نظر بگیرید. برخی از ماسفت ها به طور کامل در ولتاژ 5 ولت روشن نیستند، بنابراین باید همه موارد موجود در کد خود را در نظر بگیرید و کد را بر اساس آن مقدار کالیبره کنید.
قطعات مورد نیاز
اجزای مورد نیاز برای ساختن ابزار اندازه گیری ISR مبتنی بر ATtiny85 در زیر لیست شده است. ما این مدار را با اجزای بسیار عمومی طراحی کردیم که فرآیند ساخت را بسیار آسان می کند.
- میکروکنترلر Attiny85
- LM358 Op-amp
- 2* مقاومت 1R
- ماسفت Low VGS
- دکمه
- نمایشگر OELD SSD1306 128X64
- نگهدارنده باتری
- خازن 0.1uF
- مقاومت 1K
مدار اندازه گیری مقاومت داخلی باتری
شماتیک کامل مدار اندازه گیری مقاومت داخلی باتری ISR مبتنی بر میکروکنترلر Attiny85 در زیر نمایش داده شده است.
شماتیک مدار ISR متر بسیار ساده است. ما نمودار شماتیک را به بخش هایی تقسیم کرده ایم تا بتوانید قسمت های مختلف شماتیک را به راحتی درک کنید.
ابتدا اجازه دهید در مورد بخش کنترل جریان باتری صحبت کنیم. هدف اصلی مدار محافظت از ماسفت در برابر جریان های پیک بالا است. همانطور که در ترمینال غیر معکوس (pin3) op amp مشاهده می کنید، یک سیگنال PWM ورودی از میکروکنترلر داریم. سیگنال توسط یک خازن 100nF و یک مقاومت 100K فیلتر می شود و سیگنال DC فیلتر شده به پین 3 OP-amp می رود. حالا که ولتاژ ترمینال غیر معکوس از ترمینال معکوس بیشتر است، خروجی آپ امپ HIGH میشود. خروجی op-amp وضعیت ماسفت را روشن می کند و جریان از طریق آن و مقاومت (R1) شروع به عبور می کند. اکنون هنگامی که جریان شروع به حرکت می کند، افت ولتاژ در مقاومت R1 رخ می دهد. اگر مقدار آن ولتاژ بیشتر از مقدار در ترمینال غیر معکوس باشد، خروجی op-amp برابر LOW می شود و جریان متوقف می شود. این روند تا زمانی که خروجی PWM به صفر برسد ادامه خواهد داشت.
مغز این پروژه میکروکنترلر ATtiny85 است که سیگنال PWM را برای راه اندازی op-amp فراهم می کند و همچنین ولتاژ باتری را برای محاسبه IR باتری اندازه گیری می کند. به غیر از آن، ما یک کانکتور USB داریم. کانکتور USB برای برنامه ریزی برد و تامین برق میکروکنترلر وجود دارد. ما یک ماژول OLED برای نمایش مقدار ISR و ولتاژ باتری داریم. همچنین یک کانکتور باتری و یک سوئیچ داریم. کانکتور باتری قرار است باتری را تحت آزمایش قرار دهد و سوئیچ برای تنظیم مجدد میکروکنترلر است.
طراحی PCB برای ISR متر
فایل های گربر مربوط به طراحی برد PCB در فایل دانلودی انتهای صفحه قرار داده شده است. در تصویر زیر برد را مشاهده میکنید. بعد از ساخت PCB باید قطعات را روی آن لحیم کنید. دقت کنید که مسیر های مسی برد بر محاسبات ما تاثیر میگذارند.
همانطور که در تصویر مشاهده می کنید، تمام قطعات به درستی لحیم شده اند. همانطور که قبلا ذکر شد، تمام اجزای این پروژه به راحتی در دسترس هستند، بنابراین ساخت این پروژه بسیار آسان است.
کد آردوینو ISR متر برای Attiny85
مقاله برنامه نویسی ATtiny85 با آردوینو پیش نیاز این مطلب میباشد. کد این پروژه بسیار ساده و قابل درک است. کد کامل و فایل های مورد نیاز در فایل دانلودی انتهای صفحه قرار داده شده اند. در اینجا قسمت های مهم کد را بررسی میکنیم.
ما کد خود را با فراخوانی تمام کتابخانه های مورد نیاز شروع می کنیم. فقط دو کتابخانه وجود دارد که باید آنها را در نظر بگیریم و آنها عبارتند از:
#include "SSD1306_minimal.h" #include <avr/pgmspace.h>
در مرحله بعد، یک نمونه برای SSD1306_minimal ایجاد می کنیم که از طریق آن می توانیم به تمام توابع به طور همزمان دسترسی داشته باشیم.
SSD1306_Mini oled
در مرحله بعد، تمام پین ها و متغیرهای پروژه را تعریف کرده ایم.
//#define OLED_RESET 4 // پین تنظیم مجدد #define vIn A2 // ولتاژ خام باتری #define gate 1 // پایه گیت float v1 = 0.000; // ولتاژ باتری در حالت بدون بار float v2 = 0.000; // ولتاژ باتری با بار float i = 0.000; // جریان بدون بار // جریان بابار float intRes = 0.000; // مقاومت داخلی باتری بر حسب اهم float vCal = 4.97; // ولتاژ مرجع float load_resistance = 2; //مقاومت بار بر حسب اهم
در مرحله بعد، ما تابع Setup خود را داریم، در تابع setup، پایه آنالوگ را به عنوان ورودی و پایه PWM را به عنوان خروجی تنظیم کرده ایم و همچنین برای جلوگیری از تحریک اشتباه، آن را روی low قرار داده ایم. بعد، OLED را با آدرس I2C نمایشگر مقداردهی اولیه می کنیم و موارد موجود در صفحه نمایش را پاک می کنیم. سپس متغیر ()meter_value را فراخوانی کرده و تابع setup() را پایان می دهیم.
void setup() { // Serial.begin( 9600 ); pinMode(vIn, INPUT); // ورودی pinMode(gate, OUTPUT); // خروجی digitalWrite(gate, LOW); delay(100); oled.init(0x3C); // پیکربندی آدرس صفحه نمایش oled.clear(); // پاک کردن صفحه نمایش delay(1000); // تاخیر 1 ثانیه ای measure_value(); //print_to_screen(); }
در نهایت، تابع ()meme_value را داریم که در آن متد startscreen() را برای پاک کردن نمایشگر فراخوانی می کنیم.
oled.startScreen(); oled.clear();
در مرحله بعد، ولتاژ بدون بار را اندازه گیری می کنیم و جریان تئوری مقاومت را محاسبه می کنیم و روی نمایشگر چاپ می کنیم.
char buff[10]; v1 = (analogRead(vIn) * vCal) / 1023; delay(5); dtostrf(v1, 4, 3, buff); oled.cursorTo(0, 0); // x:0, y:0 oled.printString(" Voltage1:"); oled.printString(buff); i = (v1 / load_resistance); dtostrf(i, 4, 3, buff); oled.cursorTo(0, 10); // x:0, y:0 oled.printString(" Current:"); oled.printString(buff);
سپس، پایه PWM میکروکنترلر را HIGH میکنیم و ولتاژ بار مقاومت را محاسبه میکنیم.
digitalWrite(gate, HIGH); delay(5); v2 = (analogRead(vIn) * vCal) / 1023; delay(1); dtostrf(v2, 4, 3, buff); oled.cursorTo(0, 20); // x:0, y:23 oled.printString(" Voltage2:"); oled.printString(buff); delay(3); digitalWrite(gate, LOW);
اکنون تمام مقادیر لازم را داریم و می توانیم مقاومت داخلی باتری را محاسبه کنیم.
intRes = (((v1 - v2) / i) + 0.017); dtostrf(intRes, 4, 3, buff); oled.cursorTo(0, 30); // x:0, y:23 oled.printString(" IntRes:"); oled.printString(buff);
تست ISR متر مبتنی بر میکروکنترلر AVR ATtiny85
وقتی مونتاژ PCB انجام شد و کد آپلود شد، شروع به تست PCB کردیم. ابتدا PCB را روشن کردیم و بررسی کردیم که آیا پایه op-amp و پایه میکروکنترلر 5 ولت می شوند و همچنین مطمئن شدیم که هیچ اتصال کوتاهی روی برد وجود ندارد.
هنگامی که کد آپلود شد، می بینید که مقدار مقاومت را بر حسب میلی اهم به ما می دهد و برای تست دقت آن را با یک ISR متر حرفه ای مقایسه کرده ایم و نتیجه آن در زیر نشان داده شده است.
همانطور که ملاحظه میکنید، ISR متر ما دقت مناسبی دارد.
با توجه به فایل های گربر و برد باید برخی ویرایش ها را در آن اعمال کنیم.
- اولین مشکلی که پیدا کردیم مشکل در ماسفت بود. هنگام قرار دادن ماسفت، اتصال آینه ای شد، بنابراین ما باید ماسفت را در جهت مخالف وصل کنیم.
- مشکل بعدی نیز در مورد ماسفت بود. برای اینکه ماسفت روشن شود به ماسفت هایی مانند IRLZ44N، IRF540 نیاز داریم اما در لحظه ساخت پروژه، آن مقادیر را نداریم، بنابراین مجبور شدیم یک ماسفت SMD را به جای TO-220 قرار دهیم.
- مشکل اصلی بعدی مربوط به بخش برق برد است. می بینید که برق اصلی برد از کابل USB می آید و بسته به طول کابل، مقدار ولتاژ متفاوت است. اکنون از آنجایی که دقت ADC به ولتاژ ورودی بستگی دارد، میزان خطا بسیار بالا می رود.
- بعد، ما مشکل برنامه نویسی داریم، یعنی شما باید خودتان از زیف سوکت استفاده کنید یا در ابتدا سیم به پایه های میکروکنترلر متصل کنید تا بتوانید تست را انجام دهید.
موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود