লো-পাওয়ার মোড ও স্লিপ স্টেট
এই পাঠে যা শিখবেন
- মাইক্রোকন্ট্রোলারের সক্রিয় থেকে স্ট্যান্ডবাই পর্যন্ত সাধারণ স্লিপ-মোড হায়ারার্কি
- প্রতিটি মোডে কারেন্ট ড্র বনাম ওয়েক-আপ লেটেন্সি বনাম রিটেইনড স্টেটের ট্রেড-অফ
- ডিউটি সাইকেল থেকে ওয়েটেড-এভারেজ কারেন্ট গণনার সূত্র ও একটি সত্যিকারের গণনা
- এই গণনা কীভাবে M34-এর পূর্ণাঙ্গ ব্যাটারি-লাইফ এস্টিমেশনের ভিত্তি তৈরি করে
১ · সক্রিয় থেকে স্ট্যান্ডবাই — স্লিপ-মোড হায়ারার্কি
বেশিরভাগ আধুনিক মাইক্রোকন্ট্রোলার একাধিক পাওয়ার মোড সমর্থন করে, যেগুলো মোটামুটি একটি সাধারণ প্যাটার্ন অনুসরণ করে — যত গভীরে যাওয়া হয়, তত বেশি সার্কিট্রি বন্ধ হয়, কারেন্ট ড্র তত কমে, কিন্তু আবার সক্রিয় হতে (ওয়েক আপ করতে) তত বেশি সময় লাগে। ঠিক কয়টি মোড থাকবে, প্রতিটির নাম কী, এবং কোন মোডে ঠিক কতটুকু পেরিফেরাল/মেমরি সচল থাকে — এসব চিপ-ভেন্ডর অনুযায়ী আলাদা হয়; নিচের চারটি ধাপ একটি সাধারণীকৃত (generic) মডেল, কোনো নির্দিষ্ট চিপের ডেটাশিট নয়।
সংক্ষেপে প্রতিটি ধাপ:
- সক্রিয় (Active) — CPU পূর্ণ ক্লক স্পিডে চলছে, সব পেরিফেরাল সচল। সর্বোচ্চ কারেন্ট ড্র, কিন্তু কোনো লেটেন্সি নেই — তাৎক্ষণিকভাবে যেকোনো কাজ করা যায়।
- আইডল/স্লিপ — CPU কোর ক্লক থেমে যায় (তাই ইনস্ট্রাকশন এক্সিকিউশন বন্ধ), কিন্তু বেশিরভাগ পেরিফেরাল (টাইমার, UART, ইন্টারাপ্ট কন্ট্রোলার) সচল থাকে, তাই যেকোনো ইন্টারাপ্টে দ্রুত জেগে ওঠা যায়।
- ডিপ স্লিপ — মূল ক্লক সোর্স (PLL/হাই-স্পিড অসিলেটর — L07-এ দেখা হয়েছে) বন্ধ হয়ে যায়, অনেক পেরিফেরালও বন্ধ থাকে। কারেন্ট ড্র অনেক কম, কিন্তু জেগে উঠতে (ক্লক স্টেবিলাইজ হতে) কিছুটা সময় লাগে, এবং কিছু রেজিস্টার/RAM কনটেন্ট হারাতেও পারে (চিপ-ভেদে আলাদা)।
- স্ট্যান্ডবাই/হাইবারনেট — প্রায় সবকিছু বন্ধ, শুধু একটি ছোট low-power RTC (Real-Time Clock) এবং ওয়েক-আপ পিন/টাইমার সার্কিট সচল থাকে যা ভবিষ্যতে চিপকে আবার জাগাতে পারে। সর্বনিম্ন কারেন্ট ড্র, কিন্তু জেগে ওঠা প্রায় একটি নতুন রিসেটের (L07) মতোই — বেশিরভাগ স্টেট হারিয়ে যায়।
একটি ব্যাটারি-চালিত সেন্সর নোড ৯৯% সময় কিছুই করে না — শুধু অপেক্ষা করে পরের রিডিং নেওয়ার সময়ের জন্য। যদি এটি পুরো সময় সক্রিয় মোডে থাকত, ব্যাটারি কয়েক ঘণ্টায় শেষ হয়ে যেত। এই হায়ারার্কি থাকার কারণে ফার্মওয়্যার বেশিরভাগ সময় গভীরতম সম্ভব মোডে কাটাতে পারে, আর শুধু দরকারের মুহূর্তে সংক্ষিপ্ত সময়ের জন্য জেগে ওঠে — নিচের সেকশনে এই ধারণাটিই সংখ্যা দিয়ে দেখানো হয়েছে।
২ · গড় কারেন্ট — শুধু "সক্রিয় কারেন্ট" যথেষ্ট নয়
একটি ডিভাইস ধ্রুবকভাবে একটিমাত্র মোডে থাকে না — এটি সময়ের সাথে বিভিন্ন মোডের মধ্যে ঘুরে বেড়ায় (এই প্যাটার্নকে ডিউটি সাইকেলDuty Cycleএকটি পুনরাবৃত্ত সময়কালে ডিভাইস কোন মোডে কতটুকু সময় কাটায় তার প্যাটার্ন। বলা হয়)। বাস্তব ব্যাটারি খরচ নির্ভর করে এই পুরো সাইকেলের সময়-ওজনযুক্ত (weighted) গড় কারেন্টের উপর — শুধু সক্রিয় মোডের কারেন্টের উপর নয়। সূত্রটি হলো:
$$ I_{avg} = \frac{\sum_i I_i \times t_i}{\sum_i t_i} $$
অর্থাৎ প্রতিটি মোডের কারেন্ট ($I_i$) কে সেই মোডে কাটানো সময় ($t_i$) দিয়ে গুণ করে সবগুলো যোগ করা হয়, তারপর মোট সময় দিয়ে ভাগ করা হয় — একটি সাধারণ ওয়েটেড এভারেজ। M34-এ এই একই সূত্রকে ব্যাটারি-ক্যাপাসিটির সাথে মিলিয়ে সম্পূর্ণ ব্যাটারি-লাইফ এস্টিমেশনে নেওয়া হবে।
নিচের কোড সেলে একটি বাস্তবসম্মত উদাহরণ সিমুলেট করা হয়েছে — একটি সেন্সর নোড প্রতি ১০ সেকেন্ডে একবার জেগে উঠে ৫০ মিলিসেকেন্ড সক্রিয় থাকে (রিডিং নেয়), তারপর সংক্ষিপ্ত সময় আইডল মোডে ট্রানজিশন করে, বাকি সময় ডিপ স্লিপে কাটায়। এখানে দেওয়া কারেন্ট মানগুলো সাধারণভাবে উদ্ধৃত ইলাস্ট্রেটিভ মান — কোনো নির্দিষ্ট চিপের ডেটাশিট থেকে নেওয়া সংখ্যা নয়।
# ইলাস্ট্রেটিভ কারেন্ট ড্র (মিলিঅ্যাম্পিয়ার, mA) -- একটি সাধারণ মাইক্রোকন্ট্রোলারের জন্য
# সাধারণভাবে উদ্ধৃত উদাহরণ মান, কোনো নির্দিষ্ট চিপের ডেটাশিট নয়
CURRENT_ACTIVE_MA = 25.0 # সক্রিয়: CPU ফুল স্পিডে, সেন্সর পড়ছে
CURRENT_IDLE_MA = 6.0 # আইডল/স্লিপ: ওয়েক-আপ ট্রানজিশনের সময়টুকু
CURRENT_DEEPSLEEP_MA = 0.005 # ডিপ স্লিপ: প্রায় সব বন্ধ, শুধু RTC/ওয়েক-আপ সার্কিট সচল
def weighted_average_current(segments):
"""segments: [(mode_name, current_mA, duration_ms), ...]
একটি সম্পূর্ণ সাইকেলের সব সেগমেন্টের সময়-ওজনযুক্ত গড় কারেন্ট (mA) হিসাব করে।
রিটার্ন করে (avg_current_mA, cycle_duration_ms)।"""
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
# ডিউটি সাইকেল: প্রতি ১০,০০০ ms (১০ সেকেন্ড) পরপর --
# ৫০ ms সক্রিয় (রিডিং নেওয়া) + ২০ ms আইডল (ওয়েক-আপ ট্রানজিশন) + বাকি সময় ডিপ স্লিপ
CYCLE_MS = 10_000
ACTIVE_MS = 50
IDLE_MS = 20
DEEPSLEEP_MS = CYCLE_MS - ACTIVE_MS - IDLE_MS
duty_cycle = [
("সক্রিয়", CURRENT_ACTIVE_MA, ACTIVE_MS),
("আইডল", CURRENT_IDLE_MA, IDLE_MS),
("ডিপ স্লিপ", CURRENT_DEEPSLEEP_MA, DEEPSLEEP_MS),
]
avg_current_ma, period_ms = weighted_average_current(duty_cycle)
print(f"ডিউটি সাইকেল (প্রতি {period_ms} ms):")
for name, current, duration in duty_cycle:
pct = 100 * duration / period_ms
print(f" {name:10s}: {current:8.3f} mA x {duration:6d} ms ({pct:5.2f}% সময়)")
print(f"\nওয়েটেড-এভারেজ কারেন্ট: {avg_current_ma:.6f} mA")
print(f"সবসময় সক্রিয় থাকলে কারেন্ট: {CURRENT_ACTIVE_MA:.3f} mA")
savings_factor = CURRENT_ACTIVE_MA / avg_current_ma
print(f"পাওয়ার সাশ্রয়ের ফ্যাক্টর: {savings_factor:.1f}x কম গড় কারেন্ট (স্লিপ মোড ব্যবহার করার কারণে)")
লো-পাওয়ার মোড হায়ারার্কি (সক্রিয় → আইডল → ডিপ স্লিপ → স্ট্যান্ডবাই) এম্বেডেড ডিজাইনে কারেন্ট ড্র বনাম ওয়েক-আপ লেটেন্সি বনাম রিটেইনড স্টেটের একটি ট্রেড-অফ দেয়। বাস্তব পাওয়ার খরচ বোঝার জন্য পুরো ডিউটি সাইকেলের ওয়েটেড-এভারেজ কারেন্ট গণনা করতে হয় — এই সূত্র ও পদ্ধতিই M34-এ পূর্ণাঙ্গ ব্যাটারি-লাইফ এস্টিমেশনে ব্যবহৃত হবে, আর M33-এ দেখা যাবে ওয়াচডগ টাইমার কীভাবে এই স্লিপ মোডগুলোর মধ্যেও ফার্মওয়্যারকে নির্ভরযোগ্য রাখে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ একটি ডিভাইস যদি রিডিং নেওয়ার পর ইন্টারনেটে পাঠানোর জন্য রেডিও চালু করতে হয়, তাহলে সেটি কি ডিপ স্লিপ থেকে সরাসরি রেডিও ট্রান্সমিট করতে পারবে, নাকি প্রথমে অন্য কোনো মোডে যেতে হবে?
বাস্তবে রেডিও ট্রান্সমিট করার আগে CPU-কে পূর্ণ সক্রিয় মোডে ফিরতে হয় — কারণ ট্রান্সমিশন লজিক চালানো, ডেটা প্রস্তুত করা, এবং রেডিও পেরিফেরাল নিজেই চালু করা এসবের জন্য পূর্ণ ক্লক স্পিড ও সচল পেরিফেরাল দরকার। তাই সাধারণ প্যাটার্ন হলো ডিপ স্লিপ → (ওয়েক-আপ) → সক্রিয় → রেডিও অন → ট্রান্সমিট → আবার ডিপ স্লিপ। M34-এ ঠিক এই "ট্রান্সমিট" ধাপকেও ডিউটি সাইকেলে আলাদা একটি মোড হিসেবে যোগ করা হবে।
প্র ০২ উপরের কোড সেলে যদি সেন্সর রিডিং প্রতি ১০ সেকেন্ডের বদলে প্রতি ১ সেকেন্ডে একবার নেওয়া হতো, তাহলে ওয়েটেড-এভারেজ কারেন্টের কী হতো বলে আপনার ধারণা?
বেড়ে যেত — কারণ একই ১০ সেকেন্ডে এখন ১০ বার সক্রিয়/আইডল ধাপ চলবে (মোট সক্রিয়+আইডল সময় ১০ গুণ বেড়ে যাবে), অথচ ডিপ স্লিপে কাটানো সময় সেই অনুপাতে কমে যাবে। ফলাফল: ওয়েটেড সমষ্টিতে উচ্চ-কারেন্ট মোডের অবদান বেড়ে যাওয়ায় গড় কারেন্টও বাড়বে, এবং ব্যাটারি লাইফ কমবে — ডিউটি সাইকেলের ফ্রিকোয়েন্সি ও ব্যাটারি লাইফের এই সরাসরি সম্পর্কটাই M34-এ বিস্তারিত দেখা যাবে।
প্র ০৩ ডিপ স্লিপ মোডে RAM-এর কিছু কনটেন্ট হারিয়ে যেতে পারে বলা হয়েছে — এটি ফার্মওয়্যার ডিজাইনের জন্য কেন গুরুত্বপূর্ণ বিবেচনা?
কারণ যদি কোনো গুরুত্বপূর্ণ ভ্যারিয়েবল (যেমন একটি কাউন্টার বা সংগৃহীত ডেটা) সাধারণ RAM-এ রাখা হয় এবং চিপ ডিপ স্লিপে গিয়ে সেই RAM হারায়, তাহলে জেগে ওঠার পর সেই ডেটা হারিয়ে যাবে। এ কারণে অনেক চিপে একটি ছোট "ব্যাকআপ" বা "রিটেনশন" RAM অঞ্চল থাকে যা ডিপ স্লিপেও সচল থাকে, ফার্মওয়্যারকে সেই নির্দিষ্ট অঞ্চলেই গুরুত্বপূর্ণ স্টেট রাখতে হয় — এটি একটি বাস্তব, ডিজাইন-সময়ের সিদ্ধান্ত যা L06-এর মেমরি-ম্যাপ ধারণার সাথে সরাসরি সম্পর্কিত।
অনুশীলন
-
চিন্তা করুন: উপরের কোড সেলে
ACTIVE_MS-এর মান ৫০ থেকে ৫০০-তে বাড়ালে (একই ১০,০০০ ms সাইকেলে)avg_current_maকি বাড়বে না কমবে?বাড়বে — কারণ সূত্রের লবে ($\sum I_i \times t_i$) সবচেয়ে বড় কারেন্ট (25 mA) এখন ১০ গুণ বেশি সময় (৫০ থেকে ৫০০ ms) দিয়ে গুণ হবে, ফলে ওয়েটেড সমষ্টি অনেক বাড়বে, অথচ মোট সাইকেল সময় (হর) একই থাকবে (১০,০০০ ms) — তাই ভাগফল, অর্থাৎ গড় কারেন্ট, বাড়বে।
-
পরীক্ষা করুন: উপরের কোড সেলে
duty_cycle-এ একটি নতুন সেগমেন্ট("ট্রান্সমিট", 80.0, 150)যোগ করুন (এবংDEEPSLEEP_MSথেকে সেই ১৫০ ms বিয়োগ করে সাইকেলের মোট সময় ঠিক রাখুন) — Run চেপে দেখুনsavings_factorকীভাবে বদলায়।৮০ mA-এর একটি ট্রান্সমিট সেগমেন্ট যোগ হলে ওয়েটেড সমষ্টিতে একটি বড় নতুন পদ ($80 \times 150 = 12{,}000$) যোগ হবে, ফলে গড় কারেন্ট আগের চেয়ে অনেক বেড়ে যাবে এবং
savings_factor(25 / avg_current) কমে যাবে — বাস্তবে রেডিও ট্রান্সমিশনই প্রায়ই একটি IoT ডিভাইসের ব্যাটারি খরচের সবচেয়ে বড় একক উৎস, M34 ও M42-এ এই বিষয়টি আরও গভীরে দেখা যাবে।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পরবর্তী পাঠ: ওয়াচডগ টাইমার L33 লো-পাওয়ার মোডে থাকা অবস্থায়ও ফার্মওয়্যার হ্যাং করলে চিপকে কীভাবে স্বয়ংক্রিয়ভাবে রিসেট করা হয়।
- পাওয়ার বাজেটিং ও ব্যাটারি লাইফ এস্টিমেশন L34 এই পাঠের ওয়েটেড-এভারেজ কারেন্ট সূত্রকে ব্যাটারি ক্যাপাসিটির সাথে মিলিয়ে পূর্ণাঙ্গ ব্যাটারি-লাইফ গণনা।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ মাইক্রোপ্রসেসর আর্কিটেকচার, এমবেডেড C, GPIO, টাইমার/PWM/ADC, সিরিয়াল প্রোটোকল, RTOS, সেন্সর/অ্যাকচুয়েটর, IoT আর্কিটেকচার, ওয়্যারলেস প্রোটোকল, MQTT/CoAP ও IoT সিকিউরিটি।