بخش هفتم آموزش ARM : آموزش واحد کنترل سیستم و راه اندازی PLL

بخش هفتم آموزش ARM : آموزش واحد کنترل سیستم و راه اندازی PLL

پیش نیازها :

کل مباحث دوره آموزشی AVR : از اینجا شروع کنید

شروع دوره های آموزش مجازی ARM

بخش اول آموزش ARM

بخش دوم آموزش ARM

بخش سوم آموزش ARM

بخش چهارم آموزش ARM

بخش پنجم آموزش ARM

بخش ششم آموزش ARM


مقدمه

یکی از مهمترین مباحث در راه اندازی میکروکنترلرهای ARM کنترل توان مصرفی و نیز کلاک کاری میکرو ( سرعت پردازش CPU ) است. در میکروکنترلرهای AVR مبحثی به نام فیوز بیت وجود داشت که وظیفه های کنترلی از جمله کنترل کلاک میکرو را برعهده داشت. اما تنظیمات توان و کلاک میکرو در میکروکنترلرهای ARM7 ، درون واحدی به نام کنترل سیستم ( System Control ) صورت می گیرد. علت این مسئله رابطه تنگاتنگ میان سرعت کلاک و توان مصرفی آی سی است. هر چه CPU دارای فرکانس بالاتری باشد ، سرعت اجرای دستورات افزایش یافته و به طبع آن مصرف توان افزایش می یابد. اما به منظور کاهش توان مصرفی و مدیریت روی کلاک میکرو در میکروکنترلرهای ARM7 ، معمولا با راه اندازی واحد PLL ، CPU را در سرعت بالاتر (AHB) قرار داده و بقیه واحد ها را در سرعت کمتر (APB) راه اندازی می کنند.

lpc2138_diagram_pll


معرفی و تشریح واحد کنترل سیستم

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

Control_LPC2138

در این بخش از آموزش تنها رجیسترهای PLL ، Power Control و APB Divider که از اهمیت بسیار زیادی برخوردار هستند معرفی و تشریح می شود. در عمل بیشتر از این رجیسترها استفاده می گردد. برای اطلاعات بیشتر میتوانید به UM10120 مراجعه نمایید.


رجیسترهای کنترل توان و نحوه مدیریت توان

کنترل توان مصرفی میکروکنترلر ( واحد Power Control ) یکی از واحدهای مهم است چرا که در اکثر پروژه ها سعی داریم کمترین توان ممکن مصرف شود تا سیستم بهینه گردد. برای کنترل توان مصرفی دو راهکار وجود دارد :

  • حالت های کاهش مصرف توان ( رجیستر PCON ) : شامل دو حالت Idel Mode و Power-Down Mode
  • کنترل توان مصرفی واحدهای جانبی ( رجیستر PCONP ) : قطع کردن تغذیه واحدهای جانبی بی کار

 

رجیستر PCON : ( صفحه 41 از UM10120 )

توسط این رجیستر میتوان میکروکنترلر را به حالت های کم مصرف برد. در حالت Idle Mode ، کلاک CPU از کار افتاده و CPU به خواب می رود در حالی که دیگر واحدهای جانبی به کار خود مشغول هستند. در حالت Power-Down Mode ، کلاک تمام آی سی از کار افتاده و کل میکرو به خواب می رود. برای فعال کردن حالت Idle Mode در هر کجای برنامه کافی است بیت صفرام از رجیستر PCON را 1 کنیم ( PCON |= 1 ) و نیز برای فعال کردن Power-Down Mode در هر کجای برنامه کافی است بیت اول از رجیستر PCON را 1 کنیم ( PCON |= 2 ). برای غیر فعال کردن این حالت ها دو راه وجود دارد. راه اول زمانی است که بیت های مربوط به هر یک از حالت ها ، در هر کجای برنامه صفر شود. در غیر این صورت به محض فعال شدن هر یک از حالت های فوق با آمدن اولین وقفه خارجی میکرو کنترلر از خواب بیدار شده و به حالت کار نرمال بر می گردد.

 

رجیستر PCONP : ( صفحه 42 از UM10120 )

تغذیه تمامی واحد های جانبی ( I2C ، ADC ، SPI ، RTC و … ) توسط این رجیستر کنترل می شود. به طوری که در حالت نرمال تغذیه تمامی واحدهای جانبی وصل بوده و تمامی واحدهای جانبی آماده به کار هستند. اما فعال بودن تغذیه هر واحد هر چند که در یک پروژه از آن استفاده نشده باشد و آن واحد بیکار باشد ، باعث می شود جریانی کشیده شود و توان مصرفی بالا می رود. بنابراین در یک پروژه حرفه ای باید واحدهای بیکار شناسایی شود و تغذیه آن واحد توسط رجیستر PCONP به کلی قطع گردد.

 


نحوه عملکرد واحد PLL و کنترل کلاک سیستم

همانطور که در بخش معماری میکروکنترلرهای ARM7 به آن اشاره کردیم ، یک باس پرسرعت AHB و یک باس کم سرعت APB و یک واحد PLL وجود دارد. اما چگونه این واحدها عمل می کنند. شکل زیر این مسئله را نشان می دهد.

PLL_Clocking

مثال : برای مثال زمانی که از کریستال 12 مگاهرتز استفاده کنیم و واحد PLL غیر فعال باشد ( N=12 و M=1 ) در نتیجه کلاک اصلی یا Cclk برابر همان 12 مگاهرتز می شود. تقسیم کننده باس APB یا APB Divider نیز در حالت پیش فرض روی 4 است. بنابراین Cclk برابر 12 مگاهرتز و Pclk برابر 3 مگاهرتز می شود.

نکته 1 : کلاک اصلی در کلیه میکروکنترلرهای ARM7 حداکثر می تواند 72 مگاهرتز باشد که البته برای میکروکنترلر LPC21XX نهایتا 60 مگاهرتز است.

نکته 2 : برای هر چه بهتر اجرا شدن برنامه و هنگ نکردن سیستم بهتر است کلاک CPU را تا جای ممکن افزایش داد.

نکته 3 : کلاک تمامی واحدهای جانبی مانند UART ، SPI ، ADC به باس کم سرعت APB متصل هستند.

نکته 4 : در حالت پیش فرض PLL غیر فعال بوده و تقسیم کننده APB روی 4 است. ( M=1 و L=4 )


تنظیم تقسیم کننده APB با استفاده از رجیستر APBDIV

کلاک پر سرعت یا AHB ، توسط یک تقسیم کننده کلاک که به آن پل AHB به APB نیز گویند ( AHB To APB Bridge ) به کلاک کم سرعت تبدیل می شود. کلاک پرسرعت به واحدهای پر سرعت نظیر CPU ، Memory متصل است و کلاک کم سرعت به واحدهای جانبی سرعت پایین نظیر ADC ، I2c ، SPI متصل می باشد. این تقسیم کننده فقط میتواند به یکی از صورت های ( 1÷ ، 2÷ و 4÷ ) عمل کند. دو بیت اول رجیستر APBDIV ، به صورت جدول زیر این ضریب تقسیم را مشخص می کند.

VPBDIV=0x00; Pclk=Cclk/4
VPBDIV=0x01; Pclk=Cclk
VPBDIV=0x02; Pclk=Cclk/2
VPBDIV=0x03; RESERVED

توجه : نوشتن و خواندن بر روی بیت رزرو شده امکان پذیر نمی باشد.

 


راه اندازی واحد PLL

تنها زمانی میتوانیم از واحد PLL استفاده کنیم که از کریستال بین 10 تا 25 مگاهرتز استفاده کرده باشیم. توسط این واحد میتوان فرکانس Cclk را نهایتا تا 60 مگاهرتز افزایش داد. درون این واحد یک آشکار ساز فاز ( Phase Detector ) ، یک اسیلاتور کنترل شونده با جریان ( Current Controled Oscillator ) و یک تقسیم کننده وجود دارد. شکل زیر مدار داخلی واحد PLL را نشان می دهد.

Cortex_PLL

اسیلاتور کنترل شونده با جریان ( CCO ) فقط می تواند در محدوده فرکانسی بین 156 تا 320 مگاهرتز کار کند. بنابراین یک تقسیم کننده دیگر بعد از بلوک Variable Oscillator در شکل فوق وجود دارد که این فرکانس را در محدوده مجاز بین 10 تا 60 مگاهرتز نگه می دارد. در نتیجه برای فعالسازی این واحد ابتدا مقادیری را که نیاز داریم به صورت زیر تعریف می کنیم :

  • Lock Time : مدت زمانی است که طول می کشد تا اسیلاتور PLL روی فرکانس مورد نظر قفل شود. فرکانس خروجی واحد PLL کم کم بالا می آید تا به فرکانس مورد نظر برسد. بعد از گذشت این زمان ، مجاز به استفاده از واحد PLL هستیم.
  • ضریب PLL ( عدد M یا MSEL ) : عدد M ، عدد صحیحی است که مقدار ضرب کنندگی واحد PLL را مشخص می کند. این عدد قابلیت این را دارد که بین 1 تا 32 باشد اما در عمل در میکروکنترلرهای سری LPC21XX ( چون نهایتا 60 مگاهرتز بیشتر نمی تواند باشد ) این عدد صحیح بین 1 تا 6 می باشد.
  • ضریب تقسیم ( عدد P یا PSEL ) : این عدد ، ضریب تقسیم خروجی CCO می باشد. از آن جایی که CCO در محدوده 156 تا 320 مگاهرتز کار می کند ولی خروجی بین 10 تا 60 مگاهرتز است ، نیاز به این تقسیم کننده وجود دارد که فرکانس خروجی را در محدوده مجاز نگه دارد.

نکته 1 : برای استفاده از واحد PLL ، باید ابتدا تنظیمات مربوطه انجام شود ، سپس واحد PLL فعال شود و در نهایت مدت زمانی طول می کشد تا فرکانس خروجی ، روی فرکانس مورد نظر قفل شود و واحد PLL به میکرو اعمال شود.

نکته 2 : به ازای هر مگاهرتز افزایش کلاک در واحد PLL ، تقریبا به اندازه 0.5 میلی آمپر افزایش جریان مصرفی خواهیم داشت.

 


مراحل راه اندازی واحد PLL :

  1. تنظیم MSEL و PSEL در رجیستر PLLCFG
  2. اعمال تنظیمات با استفاده از رجیستر PLLFEED
  3. روشن کردن تغذیه واحد PLL با استفاده از رجیستر PLLCON
  4. اعمال تنظیمات با استفاده از رجیستر PLLFEED
  5. انتظار برای راه افتادن واحد PLL و قفل شدن روی فرکانس مورد نظر ( PLLSTATS )
  6. اتصال واحد PLL در مدار به عنوان اسیلاتور با استفاده از رجیستر PLLCON
  7. اعمال تنظیمات با استفاده از رجیستر PLLFEED

 


معرفی رجیستر PLLCFG :

در این رجیستر تنظیمات MSEL و PSEL صورت می گیرد. نحوه قرار گرفتن بیت های مربوط را در شکل زیر مشاهده می کنید.

تنظیمات رجیستر PLLCFG :

در حالتی که از کریستال 12 مگاهرتز استفاده نماییم ، تنظیمات PSEL و MSEL برای رسیدن به فرکانس Cclk مورد نظر به صورت جدول زیر می باشد.

PLL_frequency

معرفی رجیستر PLLCON :

در این رجیستر دو بیت PLLE و PLLC به صورت شکل زیر وجود دارد. بیت PLLE برای PLL Enable یعنی روشن/خاموش کردن تغذیه واحد PLL می باشد. بیت PLLC برای PLL Connect یعنی اتصال/عدم اتصال واحد PLL به مدار به عنوان اسیلاتور می باشد.

PLL_control-reg


تابع راه اندازی واحد PLL :

تابعی که برای راه اندازی واحد PLL در میکروکنترلر LPC2138 تعریف می کنیم ، دارای دو ورودی M و P می باشد. کافی است طبق جدول معرفی شده اعداد M و P مناسب را در هنگام فراخوانی به این تابع بدهیم و بعد از آن واحد PLL راه اندازی می شود.

توضیح : به علت اینکه 4 بیت اول رجیستر PLLCFG عدد MSEL را مشخص می کند ، این عدد را مستقیما از ورودی تابع گرفته و درون رجیستر قرار دادیم. همچنین برای تنظیم PSEL در رجیستر PLLCFG ، باید 5 شیفت به آن اعمال شود. دو خط بعدی که عینا سه بار در تابع آمده است مربوط به اعمال تنظیمات با استفاده از رجیستر PLLFEED می باشد. تنظیمات بقیه رجیستر ها درون تابع نیز با توجه به UM10120 بدست آمده است.

 

نکته مهم : نحوه استفاده از تابع اهمیت زیادی دارد و تنظیم رجیسترهای صورت گرفته در درون تابع از اهمیت کمتری برخوردار هستند. چرا که ما تابع را به همین صورت کپی کرده و از آن استفاده می کنیم.

مثال : برای مثال می خواهیم کلاک CPU ، حداکثر کلاک ممکن یعنی 60 مگاهرتز باشد. برای تنظیم واحد PLL طبق جدول باید ( M=5 و P=2 ) باشد. در نتیجه داریم :

توضیحات تکمیلی : با مراجعه به جدول مشاهده می شود که در آرگومان اول ورودی تابع ، همیشه M-1 قرار می گیرد و آرگومان دوم تابع نیز عدد 3 یا 2 یا 1 بسته به عدد M و فرکانس مورد نیاز تعیین می گردد.

 


مثال عملی شماره 2 : برنامه LED چشمک زن را با استفاده از واحد PLL و در فرکانس 60Mhz مجددا بنویسید. سپس در نرم افزار پروتئوس شبیه سازی کرده و تفاوت آن با حالت بدون PLL را بررسی نمایید.

حل :

مرحله اول : طراحی سخت افزار

lpc2138_m2

مرحله دوم : طراحی نرم افزار

در این مرحله با اضافه کردن تابع pll_init به قبل از تابع Main و فراخوانی تابع در ابتدای تابع Main برنامه را به صورت زیر تکمیل می کنیم.

مرحله سوم : شبیه سازی

lpc2138_m2_

نتیجه : سرعت چشمک زدن LED در حالت استفاده از واحد PLL روی 60 مگاهرتز نسبت به حالتی که واحد PLL وجود نداشت ( 12 مگاهرتز) ، 5 برابر افزایش می یابد.

 



برای ادامه آموزش ARM روی تصویر زیر کلیک کنید.

next-image


در صورتی که این مطلب مورد پسندتان بود لایک و اشتراک گذاری فراموش نشود

این مطلب را با دوستانتان به اشتراگ بگذارید

دیدگاه (8)

  • ali-ali پاسخ

    واقعا ممنون بی صبرانه منتظر قسمت های بعدی هستیم.

    ۳۰/۱۱/۱۳۹۴ در ۱۴:۴۹
    • محمد حسین پاسخ

      ممنون از همراهیتون دوست عزیز

      ۳۰/۱۱/۱۳۹۴ در ۲۳:۰۶
  • علی پاسخ

    سلام!
    واقعا توضیحاتتون کامل و جامع هست!
    خیلی ممنون!

    ۱۱/۱۲/۱۳۹۴ در ۱۶:۰۰
  • hameddd پاسخ

    واقعا عالی دستتون درد نکنه

    ۲۱/۰۲/۱۳۹۵ در ۱۶:۳۶
  • hameddd پاسخ

    سلام
    برای اینکه بتونیم مثلا توابع تاخیر نسبی رو بندازیم تو ی پوشه پروزه و هدر فایلشو تو برنامه استفاده کنیم(مثل avr)
    چیکار باید بکنیم؟
    من اومدم اون تابعی که تعریف کردین رو با پسوند .h توی پوشه پروزه ذخیره کردم وبعدش هدر فایل delay.h رو به اول برنامه اضاف کردم ولی پروزه بیلد نشد و میگه:
    “can not find source input file “delay.h

    ۲۱/۰۲/۱۳۹۵ در ۱۶:۵۷
    • محمد حسین پاسخ

      سلام دوست عزیز باید هدر فایل بنویسید به بخش سیزدهم آموزش AVR مراجعه کنید و نحوه ساخت هدر فایل را انجام دهید

      ۲۲/۰۲/۱۳۹۵ در ۰۶:۰۸
  • amirlegend36 پاسخ

    سلامداداش برنامه دومت اشتباه داره.مقدار M درسته ، باید 5 باشه به همین خاطر مقدار MSEL به باینری میشه 0100 یعنی باید 4 بذاری برای MSELو مقدار P درسته که 2 هست ولی PSEL میشه 1یعنی تو برنامه دوم باید pll_init(4,1) باشه.اون چیزی که نوشتید در حقیق 72 مگاهرتز میشه و چون مقدار P ش (تقسیم کننده ش) در فرکانس بالا 4 ئه ، فرکانسش خیلی بالاتر از 72 مگاهرتز هم میره.

    ۱۲/۱۱/۱۳۹۵ در ۱۱:۵۹
    • ادمین الکترو ولت پاسخ

      سلام دوست عزیز اشتباه تایپی بود و اصلاح شد ممنونم

      ۱۲/۱۱/۱۳۹۵ در ۱۸:۵۵

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

4 + 19 =