পাওয়ার বাজেটিং ও ব্যাটারি লাইফ এস্টিমেশন
এই পাঠে যা শিখবেন
- পাওয়ার বাজেট বলতে কী বোঝায় এবং কেন এটি একটি ব্যাটারি-চালিত ডিভাইসের ডিজাইনের প্রথম দিকের সিদ্ধান্ত
- ব্যাটারি লাইফ এস্টিমেশনের পূর্ণ সূত্র ও একটি বাস্তবসম্মত মাল্টি-মোড ডিউটি সাইকেল
- একটি সত্যিকারের গণনা — একই ডিউটি সাইকেলে বিভিন্ন ব্যাটারি ক্যাপাসিটির প্রভাব
- একটি সত্যিকারের গণনা — ডিউটি সাইকেলের ফ্রিকোয়েন্সি বদলালে ব্যাটারি লাইফের উপর প্রভাব
১ · পাওয়ার বাজেট কী, এবং কেন এটি ডিজাইনের শুরুতেই দরকার
পাওয়ার বাজেটPower Budgetএকটি ডিভাইসের সব উপাদান কতটুকু কারেন্ট/এনার্জি খরচ করবে তার একটি পরিকল্পিত হিসাব, ব্যাটারি লাইফের লক্ষ্যমাত্রা পূরণের জন্য। হলো একটি ব্যাটারি-চালিত ডিভাইসের প্রতিটি উপাদান (MCU, সেন্সর, রেডিও, ডিসপ্লে) কতটুকু কারেন্ট খরচ করবে তার একটি পূর্বপরিকল্পিত হিসাব — ঠিক যেমন একটি আর্থিক বাজেটে প্রতিটি খাতে কত টাকা বরাদ্দ থাকবে তা আগে থেকে ঠিক করা হয়। এই হিসাবটি ডিজাইনের একদম শুরুতেই করতে হয়, কারণ এটিই ঠিক করে দেয় ব্যাটারি কত বড় হতে হবে, কত ঘন ঘন রেডিও ট্রান্সমিট করা যাবে, এবং কোন কোন সময় L32-এর কোন স্লিপ মোডে থাকতে হবে।
L32-এ আমরা দেখেছি একটি সরল দুই/তিন-মোডের ডিউটি সাইকেল থেকে ওয়েটেড-এভারেজ কারেন্ট কীভাবে গণনা করতে হয়। এই পাঠে সেই একই সূত্রকে আরও বাস্তবসম্মত একটি দৃশ্যে প্রয়োগ করা হবে — একটি IoT সেন্সর নোড যা প্রতিটি সাইকেলে সক্রিয়ভাবে সেন্সর পড়ে, তারপর রেডিওতে ডেটা ট্রান্সমিট করে, তারপর বাকি সময় ডিপ স্লিপে কাটায় — এবং সেই গড় কারেন্ট থেকে সরাসরি ব্যাটারি লাইফে পৌঁছানো হবে।
২ · ব্যাটারি লাইফের পূর্ণ সূত্র
একবার ডিউটি সাইকেলের ওয়েটেড-এভারেজ কারেন্ট ($I_{avg}$, L32-এর সূত্র অনুযায়ী) জানা থাকলে, ব্যাটারি লাইফ গণনা করা সরল ভাগ:
$$ \text{battery\_life}_{hours} = \frac{\text{capacity}_{mAh}}{I_{avg,\,mA}} $$
অর্থাৎ ব্যাটারির ধারণক্ষমতা (মিলিঅ্যাম্পিয়ার-আওয়ার, mAh) কে গড় কারেন্ট (mA) দিয়ে ভাগ করলে ব্যাটারি কত ঘণ্টা চলবে তার একটি হিসাব পাওয়া যায় (এটি একটি সরলীকৃত মডেল — বাস্তবে ব্যাটারির নিজস্ব ডিসচার্জ বৈশিষ্ট্য, তাপমাত্রা, ও এজিং-এর কারণে প্রকৃত সংখ্যা কিছুটা কমতে পারে, তবে প্রাথমিক ডিজাইন-পর্যায়ের এস্টিমেশনের জন্য এই সূত্রই ব্যবহৃত হয়)। নিচের কোড সেলে এই পুরো হিসাবটি — ডিউটি সাইকেল থেকে গড় কারেন্ট, তারপর গড় কারেন্ট থেকে ব্যাটারি লাইফ — একটি সত্যিকারের, চলমান গণনা হিসেবে দেখানো হয়েছে।
# ইলাস্ট্রেটিভ কারেন্ট ড্র (mA) -- বিভিন্ন মোডে, সাধারণভাবে উদ্ধৃত উদাহরণ মান
CURRENT_ACTIVE_MA = 8.0 # সেন্সর পড়া + প্রসেসিং
CURRENT_TRANSMIT_MA = 80.0 # রেডিও চালু, ডেটা পাঠানো
CURRENT_SLEEP_MA = 0.005 # ডিপ স্লিপ (L32 দ্রষ্টব্য)
# ইলাস্ট্রেটিভ ব্যাটারি ক্যাপাসিটি (mAh) -- সাধারণভাবে উদ্ধৃত উদাহরণ মান, নির্দিষ্ট প্রোডাক্টের স্পেক নয়
BATTERIES_MAH = {
"CR2032 কয়েন সেল": 225,
"২xAA অ্যালকালাইন": 2000,
"18650 Li-ion": 3000,
}
def average_current_ma(segments):
"""segments: [(mode_name, current_mA, duration_ms), ...] -- একটি সম্পূর্ণ সাইকেল
L32-এর ওয়েটেড-এভারেজ সূত্র প্রয়োগ করে: I_avg = sum(I_i * t_i) / sum(t_i)"""
cycle_ms = sum(duration for _, _, duration in segments)
weighted_sum = sum(current * duration for _, current, duration in segments)
return weighted_sum / cycle_ms, cycle_ms
def battery_life_hours(capacity_mah, avg_current_ma_val):
"""battery_life_hours = capacity_mAh / average_current_mA"""
return capacity_mah / avg_current_ma_val
def describe_cycle(label, segments):
avg_ma, cycle_ms = average_current_ma(segments)
print(f"{label} (সাইকেল দৈর্ঘ্য {cycle_ms} ms):")
for seg_name, current, duration in segments:
pct = 100 * duration / cycle_ms
print(f" {seg_name:10s}: {current:7.3f} mA x {duration:6d} ms ({pct:6.3f}% সময়)")
print(f" -> ওয়েটেড-এভারেজ কারেন্ট: {avg_ma:.6f} mA")
return avg_ma
# === ডিউটি সাইকেল A: প্রতি ৬০ সেকেন্ডে একবার রিডিং নিয়ে ট্রান্সমিট করা ===
cycle_60s = [
("সক্রিয়", CURRENT_ACTIVE_MA, 20),
("ট্রান্সমিট", CURRENT_TRANSMIT_MA, 150),
("স্লিপ", CURRENT_SLEEP_MA, 60_000 - 20 - 150),
]
avg_60s = describe_cycle("ডিউটি সাইকেল A -- প্রতি ৬০ সেকেন্ডে একবার", cycle_60s)
print("\nবিভিন্ন ব্যাটারি ক্যাপাসিটিতে ডিউটি সাইকেল A-এর ব্যাটারি লাইফ:")
for label, capacity in BATTERIES_MAH.items():
hours = battery_life_hours(capacity, avg_60s)
days = hours / 24
years = days / 365
print(f" {label:18s} ({capacity:5d} mAh) -> {hours:9.1f} ঘণ্টা ~= {days:7.1f} দিন (~{years:.2f} বছর)")
# === ডিউটি সাইকেল B: একই active/transmit সময়, কিন্তু প্রতি ১০ সেকেন্ডে একবার (আরও ঘন ঘন) ===
cycle_10s = [
("সক্রিয়", CURRENT_ACTIVE_MA, 20),
("ট্রান্সমিট", CURRENT_TRANSMIT_MA, 150),
("স্লিপ", CURRENT_SLEEP_MA, 10_000 - 20 - 150),
]
print()
avg_10s = describe_cycle("ডিউটি সাইকেল B -- প্রতি ১০ সেকেন্ডে একবার", cycle_10s)
capacity_2aa = BATTERIES_MAH["২xAA অ্যালকালাইন"]
hours_10s = battery_life_hours(capacity_2aa, avg_10s)
print(f"\n ২xAA ({capacity_2aa} mAh) ডিউটি সাইকেল B-তে -> {hours_10s:9.1f} ঘণ্টা ~= {hours_10s/24:7.1f} দিন")
ratio_freq = 60 / 10
ratio_current = avg_10s / avg_60s
print(f"\nসাইকেল B, সাইকেল A-এর চেয়ে {ratio_freq:.0f}x বেশি ঘন ঘন ঘটে, "
f"এবং তার ফলে গড় কারেন্ট {ratio_current:.2f}x বেড়ে যায়।")
ব্যাটারি লাইফ এস্টিমেশন সবসময় দুই ধাপে হয়: প্রথমে ডিউটি সাইকেলের প্রতিটি মোডের কারেন্ট ও সময় থেকে ওয়েটেড-এভারেজ কারেন্ট বের করা (L32), তারপর সেই গড় কারেন্ট দিয়ে ব্যাটারি ক্যাপাসিটি ভাগ করা। ব্যাটারি ক্যাপাসিটি বাড়ানো এবং ডিউটি সাইকেলের ফ্রিকোয়েন্সি কমানো — দুটোই ব্যাটারি লাইফ বাড়ানোর বৈধ উপায়, তবে দুটোরই বাস্তব সীমাবদ্ধতা আছে (ব্যাটারি যত বড়, ডিভাইসও তত বড়/ভারী হয়; রিপোর্টিং যত কম ঘন ঘন, ডেটা তত কম রিয়েল-টাইম)। M35-এ দেখা যাবে ওয়াচডগ (L33) ও রিডানডেন্সির মতো রিলায়েবিলিটি মেকানিজমগুলোও এই পাওয়ার বাজেটের সাথে সামঞ্জস্য রেখেই ডিজাইন করতে হয়।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১
উপরের কোড সেলে CURRENT_TRANSMIT_MA-এর মান CURRENT_ACTIVE_MA-এর চেয়ে
১০ গুণ বেশি — এই একক পার্থক্যই কি ওয়েটেড-এভারেজ কারেন্টে উল্লেখযোগ্য প্রভাব ফেলে, যদিও ট্রান্সমিট
সময়কাল (১৫০ ms) মোট সাইকেলের তুলনায় খুবই ছোট?
হ্যাঁ, কারণ ওয়েটেড সমষ্টিতে প্রতিটি মোডের অবদান হলো কারেন্ট × সময় — তাই একটি অল্প সময়ের কিন্তু অনেক বেশি কারেন্টের মোড, একটি দীর্ঘ সময়ের কিন্তু অতি কম কারেন্টের (স্লিপ) মোডের চেয়ে ওয়েটেড সমষ্টিতে বেশি অবদান রাখতে পারে। উপরের কোড সেলের সংখ্যাগুলো দিয়ে হাতে হিসাব করলেও দেখা যায় — ট্রান্সমিট সেগমেন্ট একাই ওয়েটেড সমষ্টির সবচেয়ে বড় অংশ তৈরি করে, যদিও এটি সময়ের দিক থেকে সবচেয়ে ছোট সেগমেন্ট।
প্র ০২ যদি একটি ডিভাইসের ব্যাটারি লাইফের লক্ষ্যমাত্রা ১ বছর হয়, কিন্তু কোড সেলের গণনা দেখায় ডিউটি সাইকেল A-তে ২xAA দিয়ে তার চেয়ে বেশি সময় চলবে — তাহলে ডিজাইনার কী করতে পারেন?
যেহেতু লক্ষ্যমাত্রার চেয়ে বেশি ব্যাটারি লাইফ পাওয়া যাচ্ছে, ডিজাইনার চাইলে ট্রেড-অফটি উল্টো দিকে ব্যবহার করতে পারেন — যেমন আরও ঘন ঘন রিপোর্ট করা (ডিউটি সাইকেল B-এর মতো, বেশি রিয়েল-টাইম ডেটা), অথবা ছোট, সস্তা, হালকা ব্যাটারি ব্যবহার করা (যেমন 18650-এর বদলে CR2032), অথবা দুটোর একটি মিশ্রণ — যতক্ষণ পুনরায় গণনা করা ব্যাটারি লাইফ এখনও ১ বছরের লক্ষ্যমাত্রার উপরে থাকে।
প্র ০৩ উপরের নোটে বলা হয়েছে এই সূত্র "সরলীকৃত" — বাস্তব ব্যাটারিতে প্রকৃত লাইফ এই গণনার চেয়ে কম হতে পারে কেন?
বাস্তব ব্যাটারির আচরণ কয়েকটি কারণে এই আদর্শ ভাগফল থেকে সরে যায় — যেমন উচ্চ-কারেন্ট বার্স্ট (ট্রান্সমিট মুহূর্তে) ব্যাটারির নিজস্ব অভ্যন্তরীণ রেজিস্ট্যান্সের কারণে ভোল্টেজ সাময়িকভাবে ড্রপ করতে পারে, তাপমাত্রা কমলে usable ক্যাপাসিটি কমে যায়, এবং ব্যাটারি সময়ের সাথে স্বাভাবিকভাবেই সেলফ-ডিসচার্জ হয় (ব্যবহার না হলেও ধীরে ধীরে চার্জ হারায়)। তাই বাস্তব প্রোডাক্ট ডিজাইনে এই সূত্র থেকে পাওয়া সংখ্যাকে একটি আদর্শ upper-bound হিসেবে ধরে, বাস্তবে একটি নিরাপত্তা মার্জিন রাখা হয়।
অনুশীলন
-
চিন্তা করুন: উপরের কোড সেলে
CURRENT_SLEEP_MA-এর মান ০.০০৫ থেকে ০.৫-এ বাড়ালে (অন্য সব অপরিবর্তিত),avg_60sকি বড় পরিমাণে বদলাবে?হ্যাঁ, বড় পরিমাণেই বদলাবে — কারণ স্লিপ সেগমেন্ট সময়ের দিক থেকে সাইকেলের প্রায় পুরোটাই দখল করে (৫৯,৮৩০ ms প্রতি ৬০,০০০ ms-এ), তাই এই মোডের কারেন্ট ১০০ গুণ বাড়ালে ওয়েটেড সমষ্টিতে এর অবদান (০.০০৫×৫৯,৮৩০ = ২৯৯.১৫ থেকে ০.৫×৫৯,৮৩০ = ২৯,৯১৫ হয়ে) বিশাল বেড়ে যাবে, যা সরাসরি
avg_60s-কে অনেক বাড়িয়ে দেবে — এটাই দেখায় কেন ডিপ স্লিপ কারেন্ট যতটা সম্ভব কম রাখা এত গুরুত্বপূর্ণ, যেহেতু এটিই সাইকেলের বেশিরভাগ সময় জুড়ে থাকে। -
পরীক্ষা করুন: উপরের কোড সেলে
BATTERIES_MAHডিকশনারিতে একটি নতুন এন্ট্রি"বড় পাওয়ার ব্যাংক": 10000যোগ করুন — Run চেপে দেখুন এই ক্যাপাসিটির জন্য ডিউটি সাইকেল A-তে গণনা করা ব্যাটারি লাইফ (দিন ও বছরে) কত হয়।যেহেতু
battery_life_hoursসরাসরি capacity-র সমানুপাতিক (একইavg_60sব্যবহার করে), ১০,০০০ mAh ক্যাপাসিটি 18650 (৩,০০০ mAh)-এর তুলনায় প্রায় ৩.৩৩ গুণ বেশি ব্যাটারি লাইফ দেবে — লুপটি স্বয়ংক্রিয়ভাবে নতুন এন্ট্রিটির জন্যও একই সূত্র প্রয়োগ করে সঠিক ঘণ্টা/দিন/বছর প্রিন্ট করবে, কোনো কোড পরিবর্তনের দরকার নেই।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পরবর্তী পাঠ: এমবেডেড সিস্টেম রিলায়েবিলিটি ও ফল্ট টলারেন্স L35 এই পাঠের পাওয়ার বাজেটের পাশাপাশি রিডানডেন্সি, চেকসাম ও ওয়াচডগ দিয়ে সামগ্রিক সিস্টেম রিলায়েবিলিটি নিশ্চিত করা।
- লো-পাওয়ার মোড ও স্লিপ স্টেট L32 এই পাঠে ব্যবহৃত ওয়েটেড-এভারেজ কারেন্ট সূত্রের মূল ভিত্তি।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ মাইক্রোপ্রসেসর আর্কিটেকচার, এমবেডেড C, GPIO, টাইমার/PWM/ADC, সিরিয়াল প্রোটোকল, RTOS, সেন্সর/অ্যাকচুয়েটর, IoT আর্কিটেকচার, ওয়্যারলেস প্রোটোকল, MQTT/CoAP ও IoT সিকিউরিটি।