طراحی مدار

استفاده صحیح از مقاومت تقسیم ولتاژ

مقاومت تقسیم ولتاژ یکی از ساده ترین و پرکاربردترین مدارها در پروژه های الکترونیکی است. در این مستند با نحوه عملکرد تقسیم ولتاژ، محاسبه مقدار مقاومت ها و استفاده صحیح از آن برای اتصال منابع ولتاژ بالاتر به ورودی ADC میکروکنترلر آشنا می شویم. برای یک مثال عملی، اندازه گیری ولتاژ و تخمین میزان شارژ باقی مانده یک باتری را بررسی می کنیم.

سطح مقدماتی

مقاومت تقسیم ولتاژ چیست؟

تقسیم ولتاژ مداری ساده است که از دو مقاومت متصل به صورت سری تشکیل می شود. ولتاژ ورودی به دو مقاومت اعمال می شود و از نقطه اتصال بین دو مقاومت، ولتاژی کمتر از ولتاژ ورودی دریافت می شود.

ساختار ساده مدار به صورت زیر است:

Vin
 │
[R1]
 │
 ├──── Vout
 │
[R2]
 │
 GND

در این مدار، ولتاژ خروجی از رابطه زیر به دست می آید:

Vout = Vin × R2 / (R1 + R2)

بنابراین با انتخاب صحیح R1 و R2 می توان یک ولتاژ بالاتر را به سطحی مناسب برای ورودی ADC یک میکروکنترلر کاهش داد.

چرا از تقسیم ولتاژ استفاده می کنیم؟

یکی از کاربردهای مهم تقسیم ولتاژ در پروژه های Arduino و ESP32، اندازه گیری ولتاژ منابعی است که ولتاژ آنها از محدوده قابل اندازه گیری ورودی آنالوگ بیشتر است.

برای مثال، اگر بخواهیم ولتاژ یک باتری لیتیومی را با یک ورودی ADC با محدوده 0 تا 3.3 ولت اندازه گیری کنیم، نباید باتری را مستقیما به پایه ADC متصل کنیم.

ابتدا باید ولتاژ باتری توسط تقسیم مقاومتی کاهش پیدا کند و سپس ولتاژ کاهش یافته به ADC داده شود.

Battery +
    │
   R1
    │
    ├──────── ADC
    │
   R2
    │
Battery -
    │
   GND

در این حالت ADC فقط ولتاژ نقطه اتصال R1 و R2 را می بیند و میکروکنترلر می تواند با استفاده از نسبت مقاومت ها، ولتاژ واقعی باتری را محاسبه کند.

محاسبه مقدار مقاومت ها

فرض کنیم یک باتری لیتیومی تک سلولی داریم که حداکثر ولتاژ آن هنگام شارژ کامل حدود 4.2 ولت است و می خواهیم آن را با ADC یک میکروکنترلر 3.3 ولتی اندازه گیری کنیم.

یکی از انتخاب های ساده می تواند استفاده از دو مقاومت 100 کیلو اهم باشد:

R1 = 100kΩ
R2 = 100kΩ

در این حالت:

Vout = Vin × 100 / (100 + 100)

بنابراین:

Vout = Vin × 0.5

در نتیجه وقتی باتری 4.2 ولت باشد:

Vout = 4.2 × 0.5
Vout = 2.1V

ولتاژ 2.1 ولت در محدوده مناسب یک ADC با ورودی 3.3 ولت قرار می گیرد.

این فقط یک نمونه است و هنگام طراحی واقعی باید حداکثر ولتاژ ممکن باتری، محدوده ADC، تلرانس مقاومت ها و مشخصات دقیق میکروکنترلر در نظر گرفته شود.

انتخاب صحیح نسبت مقاومت ها

نکته مهم این است که هدف تقسیم ولتاژ، رساندن ولتاژ ورودی به یک مقدار امن برای ADC است، نه اینکه صرفا دو مقاومت با مقادیر دلخواه انتخاب کنیم.

اگر مقاومت ها بیش از حد کوچک باشند، جریان دائمی بیشتری از باتری عبور می کند و انرژی بیشتری تلف می شود.

اگر مقاومت ها بیش از حد بزرگ باشند، امپدانس خروجی تقسیم ولتاژ افزایش پیدا می کند و ممکن است در بعضی ADCها باعث کاهش دقت یا ناپایداری اندازه گیری شود.

بنابراین باید بین مصرف جریان، امپدانس مدار و نیاز ADC تعادل برقرار شود.

برای پروژه های باتری محور، استفاده از مقاومت های با مقدار نسبتا بالا می تواند مصرف جریان تقسیم ولتاژ را کاهش دهد، اما بهتر است مشخصات ADC و روش نمونه برداری میکروکنترلر نیز بررسی شود.

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

فرض کنیم از یک باتری 3.7 ولتی لیتیومی استفاده می کنیم و می خواهیم ولتاژ آن را توسط ADC یک ESP32 اندازه گیری کنیم.

مدار می تواند به شکل زیر باشد:

Battery +
    │
   R1 = 100kΩ
    │
    ├──────── GPIO ADC
    │
   R2 = 100kΩ
    │
Battery -
    │
   GND

در این مدار ولتاژ ADC نصف ولتاژ باتری خواهد بود.

برای مثال:

ولتاژ باتریولتاژ ADC
4.20V2.10V
4.00V2.00V
3.80V1.90V
3.70V1.85V
3.50V1.75V
3.30V1.65V

میکروکنترلر ابتدا ولتاژ ADC را اندازه گیری می کند و سپس با استفاده از ضریب تقسیم، ولتاژ واقعی باتری را محاسبه می کند.

محاسبه ولتاژ واقعی باتری

فرمول تقسیم ولتاژ را می توان برای محاسبه Vin نیز بازنویسی کرد:

Vin = Vout × (R1 + R2) / R2

در مثال ما:

R1 = 100kΩ
R2 = 100kΩ

بنابراین:

Vin = Vout × 2

اگر ADC مقدار 1.85 ولت را اندازه گیری کند:

Battery Voltage = 1.85 × 2
                = 3.70V

به این ترتیب می توان ولتاژ واقعی باتری را از مقدار خوانده شده توسط ADC محاسبه کرد.

نمونه کد Arduino

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

const int batteryPin = 34;

const float R1 = 100000.0;
const float R2 = 100000.0;

const float ADC_VREF = 3.3;
const int ADC_MAX = 4095;

void setup() {
  Serial.begin(115200);
}

void loop() {
  int adcValue = analogRead(batteryPin);

  float adcVoltage = (adcValue * ADC_VREF) / ADC_MAX;

  float batteryVoltage =
      adcVoltage * (R1 + R2) / R2;

  Serial.print("ADC Voltage: ");
  Serial.print(adcVoltage, 3);
  Serial.print(" V | Battery Voltage: ");
  Serial.print(batteryVoltage, 3);
  Serial.println(" V");

  delay(1000);
}

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

تبدیل ولتاژ باتری به درصد شارژ

بعد از اندازه گیری ولتاژ باتری، می توان برای نمایش یک مقدار تقریبی از میزان شارژ باقی مانده استفاده کرد.

برای یک نمونه ساده می توان محدوده زیر را در نظر گرفت:

4.20V → 100%
3.70V → حدود 50%
3.30V → نزدیک به خالی

اما نباید تصور کرد که درصد شارژ باتری همیشه رابطه خطی با ولتاژ دارد.

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

Arduino نیز در نمونه مستند اندازه گیری باتری، ابتدا ولتاژ باتری را از طریق تقسیم ولتاژ به ADC می رساند و سپس بر اساس محدوده ولتاژ تعریف شده برای باتری، سطح شارژ را تخمین می زند.

یک روش ساده برای محاسبه درصد

برای یک باتری لیتیومی تک سلولی می توان در یک پروژه ساده از یک نگاشت تقریبی استفاده کرد:

float batteryPercent = (batteryVoltage - 3.3) * 100.0 / (4.2 - 3.3);

batteryPercent = constrain(batteryPercent, 0.0, 100.0);

در این روش:

3.3V → 0%
4.2V → 100%

این روش برای نمایش یک شاخص ساده روی نمایشگر مناسب است، اما برای تخمین دقیق وضعیت شارژ باتری کافی نیست.

یک نکته مهم: تقسیم ولتاژ منبع تغذیه نیست

یکی از اشتباهات رایج این است که تصور کنیم تقسیم ولتاژ می تواند برای تامین برق یک مدار استفاده شود.

تقسیم ولتاژ برای اندازه گیری، نمونه برداری و ایجاد یک ولتاژ مرجع یا بایاس مناسب است، اما اگر بار به خروجی تقسیم ولتاژ متصل شود، جریان عبوری از مقاومت ها و مقاومت ورودی بار روی ولتاژ خروجی تاثیر می گذارد.

برای تامین توان یک مدار، باید از روش مناسب مانند رگولاتور، مبدل Buck یا Boost و سایر مدارهای تغذیه استفاده کرد.

چرا مقدار واقعی مقاومت ها مهم است؟

فرمول تقسیم ولتاژ بر اساس مقدار مقاومت های R1 و R2 است. اگر مقدار واقعی مقاومت ها با مقدار اسمی آنها تفاوت داشته باشد، ولتاژ خروجی نیز کمی تغییر خواهد کرد.

برای مثال، مقاومت 100 کیلو اهم با تلرانس 5 درصد می تواند مقداری بین حدود 95 تا 105 کیلو اهم داشته باشد.

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

نکات مهم در طراحی

  • قبل از اتصال تقسیم ولتاژ، حداکثر ولتاژ منبع را مشخص کنید.
  • ولتاژ ورودی ADC نباید از محدوده مجاز آن بیشتر شود.
  • نسبت R1 و R2 را بر اساس حداکثر ولتاژ واقعی منبع انتخاب کنید، نه فقط ولتاژ نامی آن.
  • برای پروژه های باتری محور، جریان دائمی عبوری از تقسیم ولتاژ را در نظر بگیرید.
  • برای اندازه گیری دقیق، از مقاومت های با تلرانس مناسب استفاده کنید.
  • در صورت نیاز به دقت بیشتر، ولتاژ واقعی نقطه ADC را با مولتی متر اندازه گیری و ضریب تقسیم را کالیبره کنید.
  • زمین باتری، تقسیم ولتاژ و میکروکنترلر باید در مدارهای معمول اندازه گیری دارای مرجع مشترک باشند.
  • تقسیم ولتاژ را به عنوان مدار اندازه گیری در نظر بگیرید، نه مدار تامین توان.

جمع بندی

مقاومت تقسیم ولتاژ یکی از ساده ترین مدارهایی است که در پروژه های Arduino، ESP32 و سایر میکروکنترلرها کاربرد زیادی دارد.

با استفاده صحیح از دو مقاومت می توان ولتاژ یک باتری یا منبع تغذیه را به محدوده قابل اندازه گیری ADC منتقل کرد و سپس با استفاده از نسبت مقاومت ها، مقدار اصلی ولتاژ را محاسبه کرد.

یکی از کاربردهای مهم این روش، نمایش وضعیت تقریبی باتری در پروژه های قابل حمل است. در چنین پروژه ای ابتدا ولتاژ باتری اندازه گیری می شود و سپس می توان بر اساس محدوده ولتاژ تعریف شده برای باتری، یک تخمین از سطح شارژ نمایش داد.

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

const int batteryPin = 34;

const float R1 = 100000.0;
const float R2 = 100000.0;

const float ADC_VREF = 3.3;
const int ADC_MAX = 4095;

void setup() {
  Serial.begin(115200);
}

void loop() {
  int adcValue = analogRead(batteryPin);

  float adcVoltage = (adcValue * ADC_VREF) / ADC_MAX;

  float batteryVoltage =
      adcVoltage * (R1 + R2) / R2;

  Serial.print("Battery Voltage: ");
  Serial.print(batteryVoltage, 3);
  Serial.println(" V");

  delay(1000);
}

منبع و فایل های پروژه ↗