
چرا باتری در حالت Deep Sleep میکروکنترلرها خیلی زود خالی میشود؟
در دیتاشیت میکروکنترلر نوشته شده است: «جریان مصرفی در حالت خواب عمیق، چند میکروآمپر». شما هم برنامه را مینویسید، دستور Deep Sleep را اجرا میکنید و انتظار دارید دستگاه با یک باتری ماهها کار کند. اما در عمل، باتری بعد از چند روز خالی میشود!
مشکل معمولاً اینجاست که Deep Sleep فقط مصرف میکروکنترلر را کاهش میدهد، نه مصرف تمام برد را. رگولاتور، مبدل USB به سریال، LEDها، تقسیمکنندههای مقاومتی و سنسورها ممکن است همچنان از باتری جریان بکشند. حتی وضعیت نامناسب یک پایه میتواند مصرف خواب را چند برابر کند.
در این مطلب، مسیرهای پنهان مصرف را بررسی میکنیم و قدمبهقدم میبینیم چطور یک مدار واقعاً کممصرف بسازیم.
۱. جریان خواب میکروکنترلر با جریان خواب دستگاه متفاوت است
عدد درجشده در دیتاشیت، معمولاً تحت شرایط مشخصی اندازهگیری شده است: ولتاژ تغذیه معین، دمای مشخص، غیرفعال بودن برخی واحدها و وضعیت تعریفشده پایهها.
در برد واقعی، جریان باتری از مجموع مصرف تمام بخشها تشکیل میشود:
جریان باتری = مصرف میکروکنترلر + مصرف تجهیزات جانبی
+ مصرف مدار تغذیه + جریان مسیرهای ناخواسته
برای مثال، در یک مدار با رگولاتور خطی، ممکن است وضعیت چنین باشد:
| بخش مدار | جریان فرضی هنگام خواب |
|---|---|
| میکروکنترلر | ۵ میکروآمپر |
| جریان سکون رگولاتور | ۱۰۰۰ میکروآمپر |
| مبدل USB به سریال | ۲۰۰۰ میکروآمپر |
| LED تغذیه | ۸۰۰ میکروآمپر |
| سنسور در حالت آمادهبهکار | ۵۰ میکروآمپر |
| مجموع | ۳۸۵۵ میکروآمپر |
این اعداد صرفاً نمونهاند، اما نکته روشن است: کاهش مصرف میکروکنترلر از ۵ به ۲ میکروآمپر، تأثیر محسوسی بر مصرف چنین بردی ندارد.
ابتدا بزرگترین مصرفکننده را پیدا کنید؛ بعد سراغ بهینهسازیهای میکروآمپری بروید.
۲. رگولاتور؛ مصرفکنندهای که هیچوقت نمیخوابد
رگولاتور برای کار کردن مدار داخلی خودش به جریان نیاز دارد. این مقدار معمولاً با عنوان Quiescent Current یا جریان سکون، با نماد IQ معرفی میشود.
چیزی که در گفتگوهای روزمره «نشتی رگولاتور» نامیده میشود، اغلب همین جریان سکون است؛ درحالیکه جریان خاموشی و جریان معکوس، مشخصههای جداگانهای هستند.
بعضی رگولاتورهای عمومی، از جمله بسیاری از مدلهای خانواده 1117، برای طراحی باتریخور کممصرف مناسب نیستند. مصرف داخلی آنها ممکن است در محدوده میلیآمپر باشد؛ بسیار بیشتر از مصرف میکروکنترلر خوابیده.
برای انتخاب رگولاتور، این موارد را بررسی کنید:
- جریان سکون در شرایط واقعی ورودی و بار؛
- جریان ورودی در حالت Shutdown؛
- افت ولتاژ یا Dropout در جریان موردنیاز؛
- جریان معکوس از خروجی به ورودی؛
- پایداری با خازن خروجی انتخابشده؛
- رفتار هنگام جهش جریان ناشی از بیدار شدن پردازنده یا رادیو.
در رگولاتور خطی، جریان ورودی تقریباً برابر جریان بار بهعلاوه مصرف داخلی است. در مبدل سوئیچینگ، نسبت ولتاژ و بازده نیز وارد محاسبه میشوند.
بنابراین صرفاً دیدن عبارت «بازده ۹۵ درصد» کافی نیست. نمودار بازده در بار بسیار سبک و مصرف بیباری، برای دستگاه خوابمحور اهمیت بیشتری دارد.
۳. چیپ USB به سریال هنوز روشن است
بردهای توسعه برای سهولت برنامهنویسی ساخته شدهاند، نه الزاماً برای بیشترین عمر باتری. تراشههایی مانند CH340، CP210x و FT232، بسته به مدل، وضعیت ارتباط و طراحی برد، ممکن است هنگام خواب میکروکنترلر همچنان مصرف قابلتوجهی داشته باشند. نبودن کابل USB نیز لزوماً به معنی خاموش بودن این تراشه نیست. اگر تغذیه آن به ریل اصلی برد متصل باشد، باتری همچنان آن را روشن نگه میدارد. راهکارهای عملی عبارتاند از:
- استفاده از پروگرامر یا مبدل خارجی و جداکردن آن پس از برنامهریزی؛
- قراردادن جامپر برای قطع تغذیه بخش USB؛
- استفاده از Load Switch برای خاموش کردن این بخش؛
- طراحی برد نهایی بدون مبدل دائمی USB به سریال.
اما قطع تغذیه همیشه کافی نیست. پایه TX میکروکنترلر ممکن است از طریق پایه RX تراشه خاموش، جریان تزریق کند و آن را نیمهروشن نگه دارد. پس هم تغذیه و هم مسیر سیگنالها باید بررسی شوند. راهحل مناسب میتواند ایزولهکردن خطوط یا انتخاب قطعات دارای قابلیت تحمل سیگنال در حالت خاموش باشد.
۴. LED تغذیه از خود پردازنده بیشتر مصرف میکند
یک LED کوچک، در مدار معمولی مسئله مهمی نیست؛ اما برای دستگاهی با هدف مصرف خواب ۱۰ میکروآمپر، مصرف یک میلیآمپری آن بسیار بزرگ است.
جریان تقریبی LED از رابطه زیر به دست میآید:
|
1 |
I_LED = (VCC − VF) / R |
اگر تغذیه ۳٫۳ ولت، افت LED حدود ۲ ولت و مقاومت سری ۱ کیلواهم باشد، جریان تقریباً ۱٫۳ میلیآمپر خواهد بود.
راهکار ساده است: LED دائمی را حذف کنید یا فقط هنگام رویدادهای ضروری روشن کنید. استفاده از مقاومت بزرگتر و پالس کوتاه نیز کمک میکند.
در برد توسعه، LED تغذیه ممکن است مستقیماً به ریل برق وصل باشد. در این حالت، هیچ دستور نرمافزاری آن را خاموش نمیکند و باید مسیر سختافزاری تغییر کند.
۵. تقسیمکننده اندازهگیری باتری، خودش باتری را تخلیه میکند
برای خواندن ولتاژ باتری توسط ADC، معمولاً از دو مقاومت استفاده میشود. این تقسیمکننده حتی وقتی ADC خاموش است، جریان میکشد:
|
1 |
I = VBAT / (R1 + R2) |
برای باتری ۴٫۲ ولتی و دو مقاومت ۱۰ کیلواهم، جریان دائمی برابر ۲۱۰ میکروآمپر است. این مقدار برای یک مدار کممصرف قابلتوجه است.
اگر هر مقاومت ۱ مگااهم شود، جریان به حدود ۲٫۱ میکروآمپر کاهش مییابد؛ اما مقاومت بزرگتر، امپدانس منبع ADC را بالا میبرد و ممکن است دقت یا زمان نشست را تحتتأثیر قرار دهد.
راهکارها شامل افزایش زمان نمونهبرداری، افزودن خازن مناسب در ورودی ADC، یا روشنکردن تقسیمکننده فقط هنگام اندازهگیری است.
اگر تقسیمکننده را با ترانزیستور قطع میکنید، اتصال را دقیق بررسی کنید: قطع شاخه پایین تقسیمکننده ممکن است ولتاژ پایه ADC را به سمت ولتاژ کامل باتری ببرد.
۶. سنسورها و ماژولها الزاماً همراه پردازنده نمیخوابند
ورود میکروکنترلر به Deep Sleep، فرمان خاموشی برای سنسور دما، حافظه خارجی، نمایشگر یا ماژول رادیویی نیست. ممکن است سنسور همچنان اندازهگیری پیوسته انجام دهد، نمایشگر روشن بماند یا رگولاتور روی ماژول مصرف داشته باشد. پیش از خواب:
- تبدیلها و انتقالهای فعال را متوقف کنید.
- فرمان Sleep یا Power-down قطعات جانبی را ارسال کنید.
- تکمیل عملیات ضروری، مانند نوشتن حافظه، را بررسی کنید.
- در صورت نیاز، تغذیه تجهیزات را با Load Switch قطع کنید.
قطع تغذیه با GPIO فقط برای بارهای بسیار کوچک و با رعایت محدودیتهای پایه قابلبررسی است؛ برای ماژولها، کلید تغذیه اختصاصی معمولاً انتخاب مطمئنتری است. همچنین خاموشی کامل همیشه بهترین گزینه نیست. اگر راهاندازی مجدد سنسور طولانی و پرمصرف باشد، نگهداشتن آن در Standby ممکن است انرژی کمتری مصرف کند.
۷. پایههای GPIO مسیرهای پنهان جریان میسازند
فرض کنید سنسور خاموش است، اما پایه ارتباطی متصل به آن در سطح High باقی مانده است. جریان میتواند از ساختار حفاظتی ورودی سنسور وارد تغذیه داخلی آن شود. این پدیده را Back-powering یا تغذیه ناخواسته از مسیر سیگنال مینامند.
نمونه دیگر، خروجی Low متصل به پولآپ خارجی است:
|
1 |
۳٫۳ ولت / ۱۰ کیلواهم = ۳۳۰ میکروآمپر |
تنها یک پایه میتواند چنین جریان دائمیای ایجاد کند. برای هر GPIO مشخص کنید:
- هنگام خواب ورودی است یا خروجی؟
- پولآپ یا پولداون فعال دارد؟
- به قطعه روشن متصل است یا خاموش؟
- وضعیت آن در Deep Sleep حفظ میشود؟
- آیا برای بیدارکردن پردازنده استفاده میشود؟
قرار دادن همه پایهها در حالت ورودی شناور، راهحل عمومی نیست. ورودیهای شناور میتوانند نویز بگیرند و در برخی ساختارها مصرف را افزایش دهند. وضعیت مناسب باید مطابق دیتاشیت و اتصالات واقعی تعیین شود.
۸. شاید میکروکنترلر واقعاً در عمیقترین خواب نیست
نام حالتهای خواب بین خانوادههای مختلف یکسان نیست. Sleep، Stop، Standby و Deep Sleep ممکن است امکانات متفاوتی را روشن نگه دارند.
موارد زیر را بررسی کنید:
- آیا ADC، تایمرها یا واحدهای ارتباطی فعال ماندهاند؟
- آیا کلاک پرسرعت خاموش شده است؟
- آیا دیباگر اجازه ورود کامل به خواب را میدهد؟
- آیا وقفهای معلق، پردازنده را بلافاصله بیدار میکند؟
- آیا نویز روی پایه Wake-up باعث بیداری مکرر میشود؟
- آیا نگهداری RAM یا سایر دامنهها ضروری است؟
ممکن است برنامه مرتب وارد خواب شود، اما هر چند میلیثانیه دوباره بیدار شود. در این حالت، دیدن اجرای دستور خواب کافی نیست؛ باید مدت واقعی خواب را اندازه گرفت.
۹. جریان خواب را درست اندازه بگیرید
برای سنجش مصرف واقعی، جریان ورودی کل دستگاه از باتری را اندازه بگیرید؛ نه فقط جریان پایه تغذیه میکروکنترلر. کابل USB، پروگرامر و دیباگر را جدا کنید. این اتصالات ممکن است بخشی از مدار را تغذیه کنند یا رفتار خواب را تغییر دهند.
مولتیمتر معمولی برای بررسی اولیه مفید است، اما دو محدودیت دارد:
- پالسهای کوتاه جریان را ممکن است نمایش ندهد.
- افت ولتاژ داخلی در رنج میکروآمپر، موسوم به Burden Voltage، ممکن است هنگام بیداری باعث افت تغذیه یا ریست شود.
اندازهگیری را از رنج مناسب شروع کنید و جهش جریان راهاندازی را در نظر بگیرید. برای تحلیل دقیقتر، پاورآنالایزر یا مقاومت شنت همراه ابزار ثبت مناسب مفید است؛ البته شنت نیز نباید افت ولتاژ نامجاز ایجاد کند. سپس بخشها را یکییکی جدا کنید و تغییر مصرف را یادداشت کنید: LED، مبدل USB، سنسورها و مدار اندازهگیری باتری. این روش معمولاً سریعتر از تغییر تصادفی تنظیمات نرمافزار است.
۱۰. عمر باتری را با جریان متوسط حساب کنید
مصرف خواب، تنها بخشی از بودجه انرژی است:
|
1 2 |
I_avg = (I_active × t_active + I_sleep × t_sleep) / (t_active + t_sleep) |
فرض کنید دستگاه در هر دقیقه، ۰٫۲ ثانیه با جریان ۶۰ میلیآمپر فعال باشد و باقی زمان با جریان ۲۰ میکروآمپر بخوابد. جریان متوسط حدود ۰٫۲۲ میلیآمپر میشود.
با باتری ۲۰۰۰ میلیآمپرساعتی:
|
1 |
عمر ایدهآل ≈ ۲۰۰۰ / ۰٫۲۲ ≈ ۹۰۹۰ ساعت ≈ ۳۷۹ روز |
این محاسبه فرض میکند جریانها در سمت باتری اندازهگیری شدهاند. عمر واقعی به خودتخلیه، دما، ولتاژ قطع، ظرفیت قابلاستفاده و تحمل پالس جریان بستگی دارد.
اگر ارسال داده، اتصال شبکه یا تلاش مجدد طولانی باشد، کاهش زمان فعالیت ممکن است بسیار مؤثرتر از کمکردن چند میکروآمپر جریان خواب باشد.
جمعبندی: کل برد باید برای خواب طراحی شود
برای رسیدن به مصرف پایین، این ترتیب را دنبال کنید:
- مصرف کل برد را بدون USB و دیباگر اندازه بگیرید.
- رگولاتور و مصرفکنندههای دائمی را بررسی کنید.
- تجهیزات جانبی را واقعاً بخوابانید یا خاموش کنید.
- مسیرهای Back-powering و وضعیت GPIOها را اصلاح کنید.
- بیداریهای ناخواسته و انرژی هر چرخه را اندازه بگیرید.
Deep Sleep یک دستور جادویی برای افزایش عمر باتری نیست؛ نتیجه طراحی هماهنگ سختافزار، نرمافزار و مدار تغذیه است. تا وقتی بقیه برد بیدار است، خوابیدن میکروکنترلر بهتنهایی باتری را نجات نمیدهد.



