آموزش آردوینوپروژه های آردوینو

تست ظرفیت و دشارژ باتری لیتیوم یونی با آردوینو

باتری‌های لیتیومی متعددی در بازار موجود است که ظرفیت بیشتری دارند. با این حال، همانطور که همه ما می دانیم باتری های لیتیومی باید به روشی خاص شارژ، دشارژ یا حتی نگهداری شوند تا عمر آنها افزایش یابد. در این پروژه مداری را بررسی می کنیم که باتری را به طور کامل تخلیه می کند و نتیجه اینکه باتری چقدر ظرفیت دارد را ارائه می دهد. همچنین، این یک راه عالی برای شناسایی باتری‌های معیوب یا حتی باتری‌هایی است که ادعای ظرفیت بالاتری دارند. این پروژه دارای گزینه ها و ویژگی های زیر خواهد بود که برای آزمایش باتری مفید خواهد بود:

  • دو دکمه برای تنظیم جریان
  • یک صفحه نمایش OLED
  • یک ترمیستور برای سنجش دمای باتری

مدار تستر ظرفیت باتری لیتیومی با آردوینو

شماتیک کامل مدار برای ساخت تستر ظرفیت باتری لیتیومی 18650 در زیر آورده شده است.

مدار تستر ظرفیت باتری لیتیومی با آردوینو

این مدار تستر ظرفیت از 4 قسمت تشکیل شده است:

  • مدار بار جریان ثابت
  • بخش اندازه گیری باتری
  • بخش دمای باتری
  • بخش رابط کاربری

تمام این بخش ها در زیر توضیح داده شده است.

مدار بار جریان ثابت

جزء اصلی این پروژه تقویت کننده دوگانه LM358 است. LM358 یک آمپلی فایر دارای دو آپ امپ است. البته در این پروژه فقط یک آپ امپ مورد نیاز است. خروجی PWM از پین 3 آردوینو به پایه غیر معکوس تقویت کننده عملیاتی متصل می شود. PWM از طریق یک فیلتر پایین گذر فیلتر می شود تا یک ولتاژ آنالوگ معادل دریافت کند. ورودی معکوس به عنوان بازخورد برای تقویت کننده عملیاتی عمل می کند که بین پین منبع ماسفت IRFZ44N و مقاومت شنت 0.5R متصل است.

مدار بار جریان ثابت

این آپ امپ، R4 و ماسفت یک مدار بار جریان ثابت می سازند. وقتی ولتاژ را روی پایه ورودی غیر معکوس تنظیم می کنیم، op-amp ماسفت را روشن می کند و سعی می کند ولتاژ یکسانی را در R4 دریافت کند. ولتاژ به دلیل قانون اهم ظاهر می شود، زیرا جریان از طریق مقاومت عبور می کند و باید افت ولتاژ ظاهر شود. بنابراین اکنون می توانیم جریان عبوری از مقاومت بار (0.5R) را با تغییر عرض پالس سیگنال PWM کنترل کنیم.

بخش اندازه گیری ولتاژ باتری

ولتاژ باتری توسط پین ورودی آنالوگ آردوینو A0 اندازه گیری می شود. دو خازن C1 و C2 برای فیلتر کردن نویزهای ناشی از مدار بار جریان ثابت استفاده می شود که می تواند عملکرد تبدیل ADC را کاهش دهد.

مدار اندازه گیری ولتاژ باتری

بخش دمای باتری

دمای باتری با استفاده از ترمیستور 10K NTC اندازه گیری میشود. مقاومت ترمیستور با دما تغییر می کند. از آنجایی که این یک ترمیستور NTC است، هنگامی که دما افزایش می یابد، مقاومت کاهش می یابد.

مدار دمای باتری

افزودن مقاومت به صورت سری و ایجاد یک تقسیم کننده ولتاژ می تواند به طور موثر تفاوت دما را از نظر تغییرات ولتاژ خروجی این تقسیم کننده تبدیل کند. ولتاژ خروجی تقسیم کننده توسط پین ورودی آنالوگ آردوینو A1 خوانده می شود و ما می توانیم دمای واقعی باتری را محاسبه کنیم.

بخش رابط کاربری

مدار رابط کاربر از دو دکمه فشاری و یک صفحه نمایش 0.96 اینچی I2C OLED تشکیل شده است. دکمه فشاری بالا و پایین برای افزایش یا کاهش عرض پالس PWM است. R5 و R6 مقاومت‌ پول آپ برای دکمه‌های فشاری بالا و پایین هستند. سومین دکمه فشاری (RST) برای ریستارت برد آردوینو استفاده می شود.

مدار رابط کاربری

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

قطعات مورد نیاز تستر ظرفیت باتری

اجزای زیر برای ساخت این تستر ظرفیت باتری مورد نیاز است:

  • آردوینو نانو
  • صفحه نمایش OLED مدل 0.96 اینچی SSD1306
  • LM358 Op-Amp
  • ماسفت IRLZ44N
  • مقاومت 0.5R 5Watt (برای بار)
  • باتری لیتیوم یون 18650 – برای آزمایش
  • ترمیستور 10K NTC – برای دریافت دمای باتری
  • مقاومت 1M
  • مقاومت 10K
  • x2 مقاومت 4.7K
  • x2 خازن 100nF
  • خازن 220uF
  • سوئیچ های لمسی – 2 عدد
  • کانکتور DC
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

تستر ظرفیت باتری چگونه کار می کند؟

این تئوری مبتنی بر مقایسه ولتاژ ورودی معکوس (پایه-2) و غیر معکوس (پایه-3) Op-Amp است که به عنوان تقویت کننده پیکربندی شده است. هنگامی که ولتاژ اعمال شده به ورودی غیر معکوس را با تنظیم سیگنال PWM تنظیم می کنید، خروجی Op-Amp در حقیقت Gate ماسفت را باز می کند. هنگامی که ماسفت روشن می شود، جریان از طریق R1 می گذرد که افت ولتاژ ایجاد می کند و بازخورد منفی را به Op-Amp می دهد. ماسفت را طوری کنترل می کند که ولتاژ ورودی های معکوس و غیر معکوس آن برابر باشد. بنابراین، جریان عبوری از مقاومت بار متناسب با ولتاژ ورودی غیر معکوس Op-Amp است. سیگنال PWM از آردوینو با استفاده از مدار فیلتر پایین گذر (R3 و C3) فیلتر می شود.

Battery Capacity (mAh) = Current (I ) in mA x Time ( T ) in Hours

برای محاسبه ظرفیت باتری (mAh) با استفاده از معادله بالا، باید جریان را بر حسب میلی آمپر و زمان را بر حسب ساعت بدانیم. مدار طراحی شده یک مدار بار جریان ثابت است، بنابراین جریان تخلیه منفی باقی می ماند در طول دوره آزمایش. جریان تخلیه را می توان با فشار دادن دکمه بالا و پایین تنظیم کرد. مدت زمان با استفاده از یک تایمر در کد آردوینو اندازه گیری می شود.

از آنجایی که این مدار از یک باتری تشکیل شده است، ما تصمیم گرفتیم تمام اجزا را مطابق مدار روی برد سوراخ دار لحیم کنیم.

برد تست ظرفیت باتری لیتیوم یون آردوینو

برنامه نویسی آردوینو برای تستر باتری لیتیومی

پس از لحیم کردن قطعات روی برد سوراخدار، بیایید آردوینو نانو را برنامه ریزی کنیم تا ظرفیت باتری را آزمایش کند. کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است. در اینجا ما خط به خط کد کامل را توضیح می دهیم.

طبق معمول کد را با فراخوانی تمام فایل کتابخانه های مورد نیاز شروع کنید. در اینجا از کتابخانه JC_Button.h برای خواندن حالات دکمه ها و کتابخانه Adafruit_SSD1306.h برای چاپ موارد خوانده شده روی صفحه نمایش OLED استفاده می شود. هر دو کتابخانه را می توان از Library Manager Arduino IDE نصب کرد.

#include<JC_Button.h>
#include <Adafruit_SSD1306.h>

سپس در خطوط بعدی تمامی متغیرهای استفاده شده در این کد را تعریف کنید

int ThermistorPin = A1;
int Vo;
float R1 = 10000;
float logR2, R2, T;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;

خط بعدی کد برای تنظیم ولتاژ مرجع استفاده می شود. Vcc مهمترین متغیر در این پروژه برای تشخیص ولتاژ باتری است. برای تنظیم Vcc ابتدا آردوینو را fi منبع تغذیه خارجی 7-12 ولت وصل کنید. سپس ولتاژ پین ۵ ولت آردوینو را با استفاده از مولتی متر اندازه گیری کنید. سپس مقدار Vcc را در این کد قرار دهید.

float Vcc = 5.04 ; // محاسبه با مولتی متر
const int Current [] = {0,70,100,190,350,400,500,620,700,830,910,1000};
const int PWM_RES [] = {0, 1, 2, 4, 8, 9, 12, 15, 17, 20, 22, 24};

با اندازه گیری اختلاف ولتاژ بین R4، جریان را با استفاده از فرمول ارزیابی کنید:

V = I X R
==> I = V/R
==> I = 100mA/0.1A , R4 = 0.5R
==> 0.1 x 0.5 = 0.05V

بنابراین یک مقدار PWM را در پایه 3 تنظیم میکنیم تا ولتاژ ورودی را برای دستیابی به ولتاژ در R4 بدست آوریم.

int ThermistorPin = A1;
int Vo;
float R1 = 10000;
float logR2, R2, T;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;

برای محاسبه دما می توانیم از معادله ای استفاده کنیم که دمای منحنی پاسخ ترمیستور را تخمین میزند. به عنوان مثال، معادله پرکاربرد استاینهارت در زیر نشان داده شده است

1/T=A+B*ln(R)+C*(ln(R))^3

می توان آن را با استفاده از داده های اندازه گیری مقاومت در برابر دما بدست آورد. ما از معادله پارامتر بتا (یا B) ساده تر که در زیر نشان داده شده است استفاده خواهیم کرد. اگرچه به اندازه معادله استاینهارت-هارت دقیق نیست، اما هنوز نتایج خوبی را در محدوده دمایی ما ارائه می‌دهد.

1/T=1/T0+1/B*ln(R/R0)

متغیر T دمای محیط بر حسب کلوین است، T0 معمولاً دمای اتاق است، همچنین در کلوین (25 درجه سانتی گراد = 298.15K)، B ثابت بتا، R مقاومت ترمیستور در دمای محیط است (همانند Rt بالا) و R0 مقاومت ترمیستور در دمای T0 است. مقادیر T0، B و R0 را می توان در دیتاشیت سازنده پیدا کرد. می توانید مقدار R را همانطور که قبلا برای Rt توضیح داده شد محاسبه کنید.

اگر ولتاژ منبع تقسیم ولتاژ و Vref یکسان هستند، برای محاسبه دما نیازی به دانستن R0 یا پیدا کردن R ندارید. به یاد داشته باشید که می توانید معادله مقاومت ترمیستور را بر حسب نسبت مقادیر ADC بنویسید.

R=R0*((adcMax/adcVal)-1)

سپس

1/T=1/T0+1/B*ln(R0*((adcMax/adcVal)-1)/R0)
==> 1/T=1/T0+1/B*ln((adcMax/adcVal)–1)

به عنوان مثال، فرض کنید یک مدار تقسیم کننده ولتاژ ترمیستور به یک مبدل آنالوگ به دیجیتال 10 بیتی متصل است. ثابت بتا برای ترمیستور 3380 است، مقاومت ترمیستور (R0) در 25 درجه سانتیگراد 10K اهم است و ADC مقدار 366 را برمی گرداند.

1/T=1/298.15+1/3380*ln((1023/366)-1)
1/T=0.003527
T = 283.52K – 273.15K = 10.37°C

همین فرمول را در تابع temp() قرار میدهیم:

void temp() {

       Vo = analogRead(ThermistorPin);
       R2 = R1 * (1023.0 / (float)Vo - 1.0);
       logR2 = log(R2);
       T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
       T = T - 273.15;
}

در تابع loo[، ابتدا حالت های دکمه به درستی خوانده می شود. هر زمان که دکمه فشار داده شود جریان افزایش یا کاهش می یابد. اگر دکمه را 1000 میلی ثانیه فشار دهید، شمارش معکوس زمان شروع می شود.

void loop() {
  UP_Button.read();
  Down_Button.read();
  if (UP_Button.wasReleased() && l < 11 && calc == false) {
      l=l+1;
  }
  if (Down_Button.wasReleased() && l > 0 && calc == false) {
      l=l-1;
  }
  if (UP_Button.pressedFor (1000) && calc == false) {
      analogWrite(PWM_Pin,PWM_RES[l]);
      digitalWrite(Buzzer, HIGH);
      delay(1500);
      digitalWrite(Buzzer, LOW);
      timerInterrupt();
  }
}

بعد از آپلود کد و اجرای پروژه، تمام مقدار های خوانده شده مانند جریان تخلیه، ظرفیت باتری و … روی صفحه نمایش OLED نمایش داده می شوند.

موارد موجود در فایل : سورس

3.7 (4 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *