محدودیت توان مصرفی یکی از مسائل مهمی است که طراحان باید در زمان انتخاب میکروکنترلر مدنظر داشته باشند، به ویژه در کاربردهایی از اینترنت اشیاء که توان در آنها نقش مهمی را ایفا میکند. در این زمینه، گرههایی از اینترنت اشیاء قابل استفاده هستند که سالها یا و حتی یک دهه با یک باتری دوام بیاورند.
در میان تولیدات نیمه هادی رقابت زیادی برای تولید تجهیزات کم مصرف وجود دارد و هر تولید کننده دارای یک خط اختصاصی SOC/MPU/MCU است که در دسته کم یا بسیار کم توان طبقهبندی میشوند.
سری میکروکنترلرهای 8 بیتی ATTINY که توسط ATMEL ( فناوری فعلی میکروچیپ ) تولید شده است، یک دههی پیش به عنوان پادشاه hibernation در نظر گرفته شده بود. این واقعیت که توان مصرفی یک ATTINY در حالت sleep عمیق 0.2µA میباشد باعث شده تا توجه مهندسان را به خود جلب کند و به اولویت اصلی طراحان برای کاربردهای کم مصرف تبدیل شود.
امروزه، ATTINY به دلیل پیشرفت سریع در مدیریت توان و مقیاسبندی نیمههادی تراشههای میکروکنترلر دیگری را هم به بازار عرضه کرده است. با این وجود، به دلیل تنوع در کاربردها و نیازهای کاربر حتی در حالت sleep (RTC، DMA، DAC فعال و غیره)، توافق در مورد انتخاب پیشگام رقابت کم مصرف بودن امری دشوار میباشد.
در دهههای اخیر، میکروکنترلرهای 32 بیتی محبوبیت زیادی پیدا کردند. میکروکنترلرهای 8 بیتی عمدتاً 5 ولت تلرانس دارند، در حالی که میکروکنترلرهای 32 بیتی دارای 3.3 ولت هستند.
این اختلاف توان مصرفی با طراحی فشرده و پینهای ورودی/خروجی عمومیتر باعث شد تا سهم قابل توجهی از بازار به MCUهای 32 بیتی تعلق گرفت. میکروکنترلرهای 32 بیتی نه تنها توان مصرفی کمی دارند، بلکه تجهیزات جانبی و پروتکلهای دیگری را در یک تراشه ارائه میدهند.
در این آموزش، در مورد مصرف برق میکروکنترلرهای سری 32 بیتی STM32F0xx که توسط STMicroelectronics ارائه شده اند، بحث و اندازهگیری کردیم.
Stm32f0xx دارای سه حالت کم مصرف است.
- حالت stop
- حالت sleep
- حالت standby
.
ویژگیهای حالت stop
در حالت stop، کلاک در زمان واقعی توسط منبع کلاک LSI (سرعت داخلی کم) تأمین میشود. درگاههای کلاک HIS (داخلی با سرعت بالا) وHSE (خارجی) خاموش هستند. تنظیم کننده نیرو در حالت کم مصرف میباشد.
قرارگرفتن رگولاتور در حالت کم مصرف به این معنی است که فلش در حالت power-down نیز هست. در حالت stop، تمام کلاکها به جز کلاک متصل به RTC متوقف میشوند. خروج از حالت stop با وقفه کلاک در زمان واقعی یا هر وقفه گلوبال دیگری امکان پذیر است.
ویژگیهای حالت sleep
در حالت sleep، CPU در حالت power-down قرار میگیرد. تمام وسایل جانبی MCU روشن و فعال هستند. برای خروج از حالت sleep، میتوان از هر وقفه گلوبالی استفاده کرد، یا هر رویدادی (خارجی/داخلی) میتواند دستگاه را از حالت sleep خارج کند.
با غیرفعال کردن لوازم جانبی و پینهای GPIO قبل از رفتن در حالت stop یا sleep، میتوان در مصرف برق نیز صرفه جویی کرد که باعث میشود تا جریان نشتی باتری تخلیه نشود.
حالت Standby
در حالت Standby، تمام کلاکها متوقف میشوند و حافظهی RAM تمام محتوای خود را از دست میدهد. فقط کلاک RTC فعال است. خروج از حالت Standby، روند راهاندازی را شروع میکند، مانند ریست کردن MCU.
تنها تفاوت این است که، با ریست کردن حالت Standby، محتویات رجیستر RTC از بین نمیروند و RTC دادهها را حفظ میکند. خروج از حالت Standby با یک رویداد خارجی در برخی از پایههای MCU اختصاصی امکان پذیر است، به تعبیری دیگر آلارم RTC میتواند MCU را از حالت Standby خارج کند.
مقایسه نتایج
حالت ایدهآل
براساس دیتاشیت، STM32 در شرایط ایدهآل در حالت اجرا 12.7 mA جریان مصرف میکند.
در کد این برنامه، برای صرفهجویی در توان مصرفی، تمامی لوازم جانبی را غیرفعال و تمام GPIOها را در حالت آنالوگ قرار دادیم. با استفاده از آمپرمتر، میزان جریان مصرفی MCU در حالت اجرا در 13.26 mA ثبت میشود.
حالت sleep
کد حالت sleep در تصویر زیر نشان داده شده است. با پیکربندی تمام GPIOS به صورت آنالوگ و غیرفعال کردن کلاکهای GPIO، حالت sleep فعال میشود. با استفاده از وقفه خارجی EXTI حالت sleep قطع شده و push-button در پین EXTI نگاشت میشود.
void SleepMode_Measure ( void)
{
___IO uint32_t index = 0;
GPIO_InitTypeDef GPIO_InitStructure
/* Configure all GPIO as analog to reduce current consumption on non used IOs */
/* Enable GPIOs clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph GPIOA | RCC_AHBPeriph GPIOB | RCC_AHBPeriph GPIOC |
RCC_AHBPeriph GPIOD | RCC_AHBPeriph GPIOF , ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_SOMHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin All;
GPIO_Init(GPIOC, &GPIO_InitStructure) ;
GPIO_Init(GPIOD, &GPIO_InitStructure) ;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Disable GPIOs clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph GPIOB | RCC_AHBPeriph GPIOC |
RCC_AHBPeriph_GPIOD | RCC_AHBPeriph GPIOF, DISABLE
/* Configure User Button */
STM_EVAL_PBInit (BUTTON_USER, BUTTON_MODE_EXTI);
/* Request to enter SLEEP mode */
___WFI();
براساس دیتاشیت، توان مصرفی در حالت sleep دارای مقدار 0.8mA میباشد.
با اندازهگیری میزان مصرف فعلی در حالت sleep، آمپرمتر 0.82 mA را نشان میدهد.
حالتهای stop و standby
سادهترین حالت کم مصرف که MCU میتواند در آن وارد شود، حالت Standby است. برای ورود به حالت Standby فقط یک بیت از رجیستر گلوبال نیاز داریم. قبل از ورود به حالت Standby، باید پین/پروتکل خروجی را از حالت Standby تعریف کنیم. کد زیر از حالت Standby میکروکنترلر stm32f051 استفاده میکند.
void StandbyMode_Measure (void)
{
/* Enable WKUP pin 2 */
PWR_WakeUpPinCmd (PWR_WakeUpPin_1, ENABLE) ;
/* Request to enter STANDBY mode (Wake Up flag is cleared in PWR_EnterSTANDBYMode function) */
PWR EnterSTANDBYMode ():
برای ورود به حالت stop باید رجیسترهای زیادی به روز شود. خروج از حالت stop نیز نیاز به دستکاری بسیاری از رجیسترها دارد.
براساس دیتاشیت، جریان مصرفی در حالت stop، 4uA و در حالت Standby میزان 3.3uA میباشد.
در آمپرمتر، میزان جریان مصرفی در حالت stop، 7.4uA و در حالت Standby میزان 4.6uA میباشد.
خروج از تمام حالتهای توان پایین نیاز به پاک شدن چند بیت/فلگ دارد. وقفههای داخلی و خارجی نقشی حیاتی در خروج از حالتهای توان پایین دارند. وقفههای جانبی، به ویژه کلاک بلادرنگ، باید برای خارج شدن از حالت توان پایین تنظیم شوند.
برای تست حالتهای کم مصرف از برد STM32F0 استفاده کردهایم.
همه چیز در کد پروژه تعریف شده است. هنگام راه اندازی، LEDهای صفحه چشمک میزند و سپس MCU وارد حالت stop میشود. وقفه RTC ( کلاک در زمان واقعی ) برای خارج شدن از حالت stop استفاده میشود. RTC به مدت 5 ثانیه برنامه ریزی شده است. بعد از 5 ثانیه، MCU از حالت stop خارج میشود.
با خروج از حالت stop، LED دوباره چشمک میزند و پس از چند چشمک، MCU وارد حالت sleep میشود. برای خارج شدن از حالت sleep، push button روی برد را فشار دهید.
دوباره، با خروج از حالت sleep، چراغ چشمک میزند و سرانجام، MCU در حالت Standby قرار میگیرد. برای خروج از حالت Standby، pushbutton را فشار دهید. Standby باعث ریست شدن MCU میشود و اجرا از ابتدا شروع میشود.
عالی بود