LPC1768 تنظیم کلاک

بدون دیدگاه

ممکن است تنظیم کلاک میکروکنترلر LPC1768 برای عده ای از کاربران کمی گیج کننده به نظر برسد. به خصوص زمانی که به ظاهر تنظیمات کلاک به درستی انجام شده اما عملکرد میکروکنترلر قابل پیش بینی نیست. مثلا انتقال اطلاعات توسط UART به درستی انجام نمی شود. بنابراین داشتن درک کامل از چگونگی تنظیم کلاک LPC1768 بسیار حیاتی است.

LPC1768 منابع کلاک

در مرحله اول باید منبع کلاک واحد PLL0 را تعیین کنیم. در واقع کلاک اصلی به PLL0 وارد می شود و سپس فرکانس آن در چند عدد ضرب و تقسیم شده و کلاک پردازنده و سایر قسمتها تعیین می گردد. فرکانس کلاک توصیه شده برای میکروکنترلر LPC1768 از جانب NXP حداکثر 100MHz است و می تواند 3 نوع منبع کلاک مختلف داشته باشد:

• اسیلاتور RC داخلی که مقدار نامی آن 4MHz است و چندان دقیق نیست. این منبع پیش فرض می باشد.
• اسیلاتور خارجی که فرکانس آن می تواند بین 1 تا 24MHz باشد.
• اسیلاتور RTC که فرکانس 1Hz را برای واحد ساعت واقعی و 32KHz را برای PLL0 و CPU و watchdog تولید می کند.

باید دقت کرد که فقط اسیلاتور خارجی برای کار با واحدهای USB و CAN مناسب است. برای انتخاب یکی از این سه منبع از رجیستر CLKSRCSEL استفاده می کنیم. بیتهای 0 و 1 این رجیستر برای انتخاب منبع کلاک استفاده می شوند و سایر بیتها رزرو شده اند. برای انتخاب اسیلاتور داخلی 00 ، اسیلاتور اصلی ( خارجی ) 01 ، اسیلاتور RTC 10 را به بیتهای فوق نسبت می دهیم. اما 11 رزرو شده و نباید این دو بیت را با 11 تنظیم نمود. بنابراین در صورتی که بخواهیم منبع کلاک خارجی را انتخاب کنیم می توانیم از دستور زیر استفاده نماییم:

;LPC_SC->CLKSRCSEL=0X00000001


محدوده فرکانس اسیلاتور اصلی می تواند فرکانس پایین و از 1 تا 20MHz و فرکانس بالا بین 15MHz تا 24MHz باشد. برای انتخاب یکی از این دو محدوده از بیت شماره 4 رجیستر SCS به نام OSCRANGE استفاده می شود. 0 بودن این بیت به معنی انتخاب محدوده فرکانس پایین و 1 بودن آن به معنی انتخاب محدوده فرکانس بالا است.

همچنین برای فعال ساختن اسیلاتور اصلی از بیت 5 رجیستر SCS به نام OSCEN استفاده می شود که با 0 کردن آن اسیلاتور غیرفعال و با 1 کردنش اسیلاتور فعال می شود.

بیت 6 رجیستر SCS نیز فقط خواندنی بوده و 0 بودن آن به معنی آماده نبودن اسیلاتور و 1 بودنش به معنی آماده بودن اسیلاتور می باشد.

سایر بیتهای رجیستر SCS رزرو شده هستند. بنابراین اگر بخواهیم از کریستال خارجی 12MHz به عنوان منبع کلاک استفاده کنیم باید از دستور زیر استفاده نماییم:

;LPC_SC->SCS=0x20

PLL0 تنظیم فرکانس

حالا که منبع کلاک و محدوده آن مشخص شد باید فرکانس کلاک PLL0 را مشخص کنیم. فرکانس خروجی PLL0 طبق رابطه زیر محاسبه می شود:

که:
FCCO: فرکانس PLLCLK یا همان خروجی PLL است. مقدار این فرکانس باید بین 275MHz تا 550MHz باشد.
FIN: فرکانس کلاک ورودی PLL است که باید بین 32KHz تا 50MHz باشد.
N: مقداری است که فرکانس ورودی به آن تقسیم می شود و مقدار آن بین 1 تا 32 می باشد.
M: مقداری است که فرکانس در آن ضرب شده و افزایش می یابد. مقدار آن در فرکانسهای محدوده MHz می تواند بین 6 تا 512 باشد.

برای تنظیم فرکانس مورد نظر باید 4 مرحله زیر به ترتیب انجام شوند:

1- با استفاده از رجیستر PLL0CON واحد PLL0 را فعال کرده و خروجی آن را به سایر واحدها وصل می کنیم.
2- با استفاده از رجیستر PLL0CFG مقادیر ضرب کننده و تقسیم کننده M و N را تنظیم و فرکانس خروجی PLL0 را مشخص می نماییم.
3- مقدار رجیستر PLL0STAT را بررسی می کنیم تا خروجی PLL روی فرکانس دلخواه قفل شده باشد.
4- با استفاده از رجیستر PLL0FEED مقادیر تعیین شده در رجیسترهای PLL0CON و PLL0CFG را اعمال می نماییم.

شرح بیتهای 4 رجیستر بالا به شرح زیر است.

PLL0CON: فقط بیتهای 0 و 1 مورد استفاده قرار می گیرند. با 1 کردن بیت 0 واحد PLL اجازه می یابد روی فرکانس دلخواه قفل شود. با 1 کردن بیت 1 خروجی واحد PLL به سایر واحدها متصل می شود.

PLL0CFG: بیتهای 0 تا 14 این رجیستر مربوط به انتخاب ضرب کننده M هستند. هر مقداری که در این قسمت رجیستر قرار داده شود برابر M-1 است. بیت 15 رزرو شده است. بیتهای 16 تا 23 مربوط به انتخاب تقسیم کننده N هستند. هر مقداری که در این قسمت رجیستر قرار داده شود برابر N-1 است. بیتهای 24 تا 31 نیز رزرو شده اند.

PLL0STAT: این رجیستر وضعیت PLL را برمی گرداند. بیتهای 0 تا 14 نشان دهنده M-1 و بیتهای 16 تا 23 نشان دهنده N-1 هستند. بیت 24 نشان دهنده وضعیت فعال بودن PLL است. بیت 25 اتصال خروجی PLL به سایر واحدها را نشان می دهند. اگر بیت 26 این رجیستر 1 باشد PLL0 روی فرکانس مورد نظر قفل شده است. سایر بیتها رزرو شده اند.

PLL0FEED: با نوشتن مقدار 0xAA و بعد مقدار 0x55 در این رجیستر ، مقادیر رجیسترهای PLL0CON و PLL0CFG اعمال می شوند. در واقع تنظیم این دو رجیستر به تنهایی و بدون نوشتن مقدار 0xAA مقدار 0x55 در PLL0FEED هیچ تغییری در PLL0 ایجاد نخواهد کرد.

یکی از نکاتی که هنگام تعیین فرکانس باید رعایت شود این است که آیا قرار است از USB استفاده شود یا خیر؟ چرا که این واحد به دیوتی سایکل 50% فرکانس 48MHz نیاز دارد. بنابراین اگر بخواهیم از USB استفاده کنیم حتما فرکانس خروجی PLL0 باید مضرب صحیحی از 48MHz باشد.

همچنین باید توجه کرد که با انتخاب N کوچک ، M نیز کوچک خواهد بود و PLL0 با ثبات تر عمل خواهد نمود.

PLL0 مثال تنظیم فرکانس

اکنون با یک مثال نحوه محاسبات N و M را بررسی می کنیم.

فرض می کنیم که کریستال خارجی ما 10MHz است، از USB استفاده نمی کنیم و می خواهیم فرکانس کلاک پردازنده 100MHz باشد.

ابتدا با جابه جایی پارامترهای رابطه محاسبه فرکانس PLL0 آن را به شکل زیر بازنویسی می کنیم:

می دانیم که FIN برابر 10MHz است. برای اینکه FCCO مضرب صحیحی از 100MHz باشد و ضمنا بین 275MHz و 550MHz باشد می توانیم دو عدد 400MHz و 300MHz را در نظر بگیریم که از بین این دو 300MHz مناسب تر است چرا که انرژی کمتری مصرف می شود. با انتخاب این عدد و انتخاب N=1 ( کوچکترین عدد صحیح ممکن ) مقدار M برابر 15 خواهد بود. باید توجه نمود که مقادیر باید به نحوی انتخاب شوند که M عددی صحیح باشد.

بنابراین مقداری که باید در رجیستر PLL0CFG نوشته شود 0x0E خواهد بود. چرا که M-1=14 و N-1=0 .

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

کلاک خروجی PLL که همان PLLCLK نامیده می شود کلاک سه بخش مختلف را تامین می کند:

1- کلاک پردازنده یا CCLK
2- کلاک USB یا USBCLK
3- کلاک لوازم جانبی یا PCLK

برای تنظیم فرکانس کلاک پردازنده باید خروجی PLL0 را بر یک عدد بین 1 تا 256 تقسیم نمود. این کار با استفاده از بیتهای 0 تا 7 رجیستر CCLKCFG انجام می شود که CCLKSEL نامیده می شود و مقداری که در آن می ریزیم باید 1 واحد کمتر از عدد تقسیم کننده باشد. برای واضح شدن این مطلب مثال قبل را در نظر می گیریم. با توجه به اینکه می خواستیم CCLK برابر 100MHz باشد و FCCO برابر 300MHz بود بنابراین عدد تقسیم کننده باید برابر 3 باشد و در نتیجه CCLKSEL را با دستور زیر برابر 2 تنظیم می کنیم:

;LPC_SC->CCLKCFG=0x00000002

برای تنظیم کلاک USB یا USBCLK روش مشابهی وجود دارد که روی رجیستر USBCLKCFG اعمال می شود. بیتهای 0 تا 3 که USBSEL نامیده می شود عدد تقسیم کننده FCCO را تعیین می کند که باید باز هم با 1 واحد جمع شود.

تنظیم کلاک لوازم جانبی نیز با استفاده از رجیسترهای PCLKSEL1 و PCLKSEL0 انجام می شود.

در صورتی که نخواهیم USB را با استفاده از خروجی PLL0 راه اندازی کنیم می توانیم کلاک آن را از PLL1 تامین نماییم. در این صورت خروجی PLL0 خود به خود از USB قطع می شود.

PLL0 مراحل راه اندازی

در پایان مراحل کامل راه اندازی PLL0 شرح داده می شود:

1- اگر PLL0 متصل است آن را با یک توالی PLL0FEED قطع می کنیم.
2- PLL0 را با یک توالی PLL0FEED غیر فعال می کنیم.
3- در صورت لزوم CCLKSEL را تغییر می دهیم تا عملیات بدون استفاده از PLL0 تسریع شود.
4- در صورت لزوم CLKSRCSEL برای تعیین منبع کلاک تنظیم می کنیم.
5- PLL0CFG را برای تعیین فرکانس کلاک خروجی PLL0 تنظیم می کنیم و آن را با یک توالی PLL0FEED اعمال می نماییم. توجه شود که PLL0CFG فقط زمانی قابل تغییر است که PLL0 غیرفعال شده باشد.
6- PLL0 را با یک توالی PLL0FEED فعال می کنیم
7- تقسیم کننده کلاک پردازنده یعنی CCLKSEL را با تنظیم CCLKCFG تغییر می دهیم. این کار حتما باید قبل از اتصال PLL0 انجام شود.
8- با بررسی بیت 26 رجیستر PLL0STAT مطمئن می شویم که فرکانس PLL0 قفل شده است. در بعضی فرکانسهای مرج PLL0 ممکن است این بیت 1 نشود. بنابراین می توان یک زمان ثابت نیز برای تثبیت شدن فرکانس خروجی در نظر گرفت و پس از گذشت آن زمان به مرحله بعد رفت.
9- واحد PLL0 را با یک توالی PLL0FEED به واحدهای دیگر وصل می کنیم.

برنامه

در مثال زیر می خواهیم نحوه برنامه نویسی مطالب فوق را نمایش دهیم.

فرض می کنیم که کریستال 12MHz را به عنوان منبع کلاک به کار برده ایم و می خواهیم فرکانس کلاک پردازنده 72MHz باشد. همچنین از USB استفاده نکرده و فرکانس کلاک لوازم جانبی هم مقدار پیش فرض یک چهارم فرکانس پردازنده است.

#include "lpc17xx.h"
	
	int main()
	{
		LPC_SC ->SCS=0x00000020;			//چون از کریستال 12 مگاهرتز استفاده می کنیم 
		while ((LPC_SC->SCS & (1<<6)) == 0);	// صبر می کنیم تا اسیلاتور آماده شود 
		LPC_SC->CCLKCFG   =0x00000003;		// تقسیم کننده پردازنده اصلی را برابر 4 در نظر می گیریم
		LPC_SC->CLKSRCSEL =0x00000001;		// اسیلاتور خارجی را به عنوان منبع کلاک تعیین می کنیم
		LPC_SC->PLL0CFG =0x0000000B;		// N=1 , M=12 => FCCO=288MHz 
		LPC_SC->PLL0CON   = 0x01;			//  را فعال می کنیم PLL0
		LPC_SC->PLL0FEED  = 0xAA;			//  را اعمال می کنیم PLL0 تنظیمات
		LPC_SC->PLL0FEED  = 0x55;
		while (!(LPC_SC->PLL0STAT & (1<<26)));	//   قفل شود PLL0 صبر می کنیم تا فرکانس 
		LPC_SC->PLL0CON   = 0x03;			//  را فعال و وصل می کنیم PLL0  
		LPC_SC->PLL0FEED  = 0xAA;			//  را اعمال می کنیم PLL0 تنظیمات
		LPC_SC->PLL0FEED  = 0x55;
		LPC_SC->PCLKSEL0  = 0x00000000;		// لوازم جانبی به صورت پیش فرض با فرکانس 
		LPC_SC->PCLKSEL0  = 0x00000000;		// یک چهارم کلاک پردازنده کار می کنند
	}

در مطلب بعدی خواهیم دید که چگونه همه تنظیمات فوق به وسیله configuration wizard به راحتی قابل انجام است.

همون طور که می دونید داشتن یه منبع تغذیه dc آمپر بالا خیلی جاها و توی خیلی مدارات و دستگاهها لازمه. اما متاسفانه منابع تغذیه که از ترانس استفاده می کنند برای اینکه بتونن جریان خوبی بدن باید حجم خیلی زیادی رو اشغال کنند و راندمانشون هم چندان خوب نیست.
به همین دلیل استفاده از منابع تغذیه سوییچینگ آمپر بالا کم کم داره متداول می شه. در اینجا فرض ما بر اینه که یه منبع تغذیه با ولتاژ ثابت در اختیار داریم. فرقی هم نمی کنه که سوییچینگ باشه یا ترانس.
مداری که می خوایم معرفی کنیم یه رگولاتور متغیره که می تونه ولتاژ دلخواه شما رو ارایه بده و جریان خروجی مناسبی تا 3 آمپر فراهم می کنه. حتما آی سی lm317 رو می شناسید که یک آی سی رگولاتور قابل تنظیمه که بیشتر از 1.5 آمپر نمی شه ازش کشید. اما ما در مدار خودمون از یه آی سی رگولاتور سوییچینگ به نام lm2576HV-adj استفاده می کنیم.
نقشه مدار که در شکل زیر دیده می شه تقریبا ساده ست.

سیم پیچ رو می شه به صورت آماده از بازار تهیه کرد. یعنی دیگه نیازی به سیم پیچی نیست!
اون دیود هم که می بینین یه دیود شاتکی 60v و 3A هست که اگه پیدا نشد می شه از معادلش استفاده کرد.
R1 باید بین 1 تا 5 کیلو اهم باشه. بنابراین هیچ وقت به جای مقاومتهای R1 و R2 از یه پتانسیومتر یا ولوم تنها استفاده نکنین. بهتره بسته به محدوده ولتاژ مورد نیاز به جای R1 از یه مقاومت ثابت و به جای R2 از یه مقاومت متغیر استفاده کنین.
و حالا چند نکته مهم:
از هیت سینک مناسب استفاده کنین!
مسیرهایی که در شکل با خطوط پررنگ نمایش داده شدند تا حد امکان کوتاه باشند چون ممکنه حلقه های ناخواسته و اثر سلفی به وجود بیاد.
در پایان باید بگیم که قیمت جنس مرغوب این آی سی از lm338 گرونتره و اگه از انواع ارزان قیمتش تهیه کنید در عمل نمی شه به مدت زیاد از جریان خروجی نامی استفاده کرد.
اگه نخواید مدار رو خودتون ببندید می تونید ماژول آماده رو از بازار تهیه کنید. اما در صورتی که نخواید از یه برد آماده توی طراحیتون استفاده کنید، بستن این مدار کار آسونیه.
رابطه بین ولتاژ ورودی و خروجی هم به این صورته:

(Vout=Vref(1+R2/R1

این بار قصد داریم رگولاتور متغیر lm338 معرفی کنیم.
شاید براتون پیش اومده باشه که نیاز داشته باشین برای مدارتون یک ولتاژ متغیر فراهم کنین که جریان خوبی هم داشته باشه. مثلا لازمه که نور یک لامپ هالوژن 12 ولت رو کم و زیاد کنین.
همه می دونیم که lm317 معروفترین رگولاتور متغیر موجود در بازار هست و بستن مدارش هم کار آسونیه. اما در عمل این رگولاتور در بهترین حالت نمی تونه جریان بیشتر از 1/5 آمپر رو تامین کنه.
یکی از گزینه های مناسب رگولاتور سوییچینگ lm2576 adj هست که اگه جنس خوبش رو تهیه کنید می تونه جریان 3 آمپر رو تامین کنه.
اما رگولاتور LM338 که معمولا با بسته بندی TO3 که به قابلمه ای هم معروفه پیدا می شه، طبق دیتاشیت می تونه ولتاژ خروجی بین 1.2 تا 32 ولت رو با 5 آمپر فراهم کنه. خوبی اون استفاده از تعداد کمی عناصر اضافیه. یعنی در ساده ترین حالت می شه با دو تا مقاومت اونو راه اندازی کرد.
اما در عوض اندازه بزرگی داره و برای استفاده در توانهای خروجی بالا باید هیت سینک بسیار بزرگی روش نصب شه. شکل این رگولاتور از زیر همراه با پایه ها به این صورته:

مدار کاملی که برای استفاده از این رگولاتور باید بسته بشه به شکل زیره:

رابطه بین ولتاژ ورودی و خروجی هم به این صورته:

(VO = 1.25 V (1 + R2/R1

مقاومت R1 می تونه 120 یا 240 یا مقادیری نزدیک به این دو باشه. ولتاژ خروجی با مقاومت متغیر R2 تعیین می شه. این مدار می تونه بدون وجود خازنها و دیودها در ولتاژهای پایین تر از 25 ولت کار کنه. اما بهتره برای حذف ریپل خروجی و جریانهای ناگهانی از خازنها هم استفاده بشه. هر چند خازنهایی با مقادیر کوچک دارای مقاومت داخلی مناسبی هستند و این جریانها رو عبور می دند. اما کار از محکم کاری عیب نمی کنه!
دیودها هم برای حفاظت استفاده شده ند.
اما نکات مهم:
1- طبق معمول از هیت سینک مناسبی استفاده کنید که بتونه تبادل گرمایی خوبی رو فراهم کنه.
2- یادتون باشه بین ولتاژ ورودی و خروجی نباید تفاوت زیادی وجود داشته باشه . چرا که این اختلاف پتانسیل روی رگولاتور باید تلف بشه و این نتیجه ای نداره به جز داغ شدن و در نهایت سوختن رگولاتور. این نکته درباره همه رگولاتورها صادقه.

همون طور که می دونید میزان روشنایی یک LED با جریانی که از اون می گذره رابطه مستقیم داره. یعنی برای تنظیم میزان روشنایی یک LED باید جریانی رو که از اون می گذره کنترل کنید.
مداری که در شکل زیر دیده می شه یک منبع جریان کنترل شده با ولتاژ ساده است.

عملکرد مدار منبع جریان

اساس کار مدار به این صورته که پایه مثبت OP AMP به ولتاژ کنترل متصله. این ولتاژ در این مدار با یک ولوم یا پتانسیومتر تنظیم می شه. البته راه های مختلفی برای تنظیم این ولتاژ وجود داره. مثل استفاده از PWM که داره به وسیله یک میکروکنترلر تامین می شه.
پایه منفی OP AMP به امیتر ترانزیستور متصل شده. با توجه به اینکه در OP AMP ولتاژ پایه های ورودی با هم برابر هستند بنابراین جریانی که از مقاومت R1 عبور می کنه همیشه برابر Vref/R1 خواهد بود. با توجه به اینکه جریان ورودی OP AMP و جریان ورودی بیس ترانزیستور خیلی کمه می تونیم بگیم جریانی که از LED می گذره تقریبا با جریان R1 برابره.
انتخاب Vcc و R1 باید طوری باشه که به قطعات آسیبی نرسه. انتخاب LM358 اینه که نیاز به منبع تغذیه دوبل نیست و با یه تغذیه 5 ولت هم راه اندازی می شه.
ترانزیستور BC547 هم یه ترانزیستور ارزون قیمته که برای راه اندازی LED توان پایین کفایت می کنه. اما در صورتی که بخوایم LED توان بالا یا هر باری رو راه اندازی کنیم که جریان یا ولتاژ بیشتری نیاز داشته باشه باید ترانزیستور و مقاومت مناسب رو انتخاب کنیم.
درباره ولوم یا پتانسیومتر هم باید گفت که لازم نیست مقدارش رو کمتر انتخاب کنیم. در واقع هر چی مقدارش کمتر شه صرفا تلفات بیشتری خواهیم داشت.

آشنایی با LCD کاراکتری

کسانی که با میکروکنترلر کار کردند حتما با LCD کاراکتری هم آشنا هستند. در کامپایلرهای مختلف معمولا کتابخانه های آماده برای استفاده از این نوع نمایشگرها وجود داره. اما اگه قصد داشته باشیم خودمون این نمایشگرها رو راه اندازی کنیم باید چکار کنیم؟ مثلا اگه چه راهی وجود داره اگه بخوایم برای یه میکروکنترلر دارای پردازنده ARM که کتابخونه ای براش نوشته نشده برنامه بنویسیم و خروجیها رو روی LCD کاراکتری نمایش بدیم ؟
در این مطلب نحوه راه اندازی LCD کاراکتری 16×2 توضیح داده شده.

پایه های LCD کاراکتری

عملکرد پایه های LCD کاراکتری از 1 تا 16 در شکل زیر دیده می شن:

پایه 1 به زمین و پایه 2 معمولا به 5 ولت متصل و کنتراست LCD با اتصال پایه 3 به سر وسط یک پتانسیومتر تنظیم می شه. پایه 4 یا همون RS اگه بالا باشه LCD در حالت داده قرار می گیره، یعنی اطلاعاتی که روی پایه های D0 تا D7 قرار می گیره برای LCD به معنی کد کاراکترهایی هستند که باید نمایش داده بشن. اما اگه پایه RS پایین باشه LCD در حالت دستوری قرار می گیره. یعنی با قراردادن کد مناسب روی پایه های D0 تا D7 می شه دستوراتی مثل پاک کردن صفحه نمایش رو انجام داد.
پایه 5 اگه high باشه LCD در حالت خواندن و اگه low باشه در حالت نوشتن قرار می گیره. اکثرا نیازی به خوندن وضعیت LCD نداریم و معمولا می شه این پایه رو به زمین وصل کنیم.
پایه های 15 و 16 هم به ترتیب پایه تغذیه و زمین LED نور پس زمینه هستند ام باید یه مقاومت مناسب مثلا 390 اهم برای راه اندازی نور پس زمینه استفاده بشه.
راه اندازی LCD کاراکتری در دو حالت 8 بیتی و 4 بیتی امکان پذیره. در مد 4 بیتی فقط پایه های D4 تا D7 مورد استفاده قرار می گیرند.

راه اندازی LCD کاراکتری در حالت 8 بیتی

1- پایه E رو high می کنیم.
2- پایه RS رو low می کنیم.
3- عدد 0011100 رو روی پایه های D0 تا D7 قرار می دیم. طوری که رقم سمت چپ باید به D7 و رقم سمت راست به D0 اعمال بشه.
4- بعد پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
5- بعد عدد 00001100 رو مثل مرحله 3 روی پایه های داده قرار می دیم.
6- مثل مرحله 4 پایه E رو low و high می کنیم.

با اعمال دستورات بالا LCD آماده کار می شه. اولین دستوری که به LCD داده شد حالت کاری رو مشخص می کنه که در اینجا نمایشگر 2 ردیفی، نحوه اتصال 8 بیتی و فونت 7×5 پیکسلی انتخاب شدند. در واقع هر بیت نشان دهنده یک وضعیت می تونه باشه که با رجوع به دیتاشیت می تونین به راحتی عملکرد هر بیت رو پیدا کنین.
دستور دوم هم نمایشگر رو روشن، cursor رو خاموش و چشمک زن رو هم خاموش می کنه. اگه بخوایم cursor دیده بشه بیت مربوط به D1 رو 1 می کنیم و اگه بخوایم چشمک زن رو هم فعال کنیم بیت مربوط به D0 رو 1 می کنیم.
حالا LCD آماده دریافت اطلاعات از میکروکنترلر هست. برای این کار مراحل زیر رو انجام می دیم.

1- پایه RS رو high می کنیم.
2- کد اسکی کاراکتر دلخواه رو روی پایه های D0 تا D7 قرار می دیم. مثلا برای نمایش حرف K عدد 01001011 رو روی باس داده قرار می دیم.
3- بعد پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.

در این مرحله کاراکتر K روی صفحه نمایش ظاهر می شه.
عیب روش 8 بیتی اینه که مجبوریم 4 پایه میکروکنترلر رو بیشتر از حالت 4 بیتی به LCD متصل کنیم. به همین علت روش راه اندازی LCD کاراکتری به روش 4 بیتی در اینجا به طور کامل توضیح داده شده.

راه اندازی LCD کاراکتری به روش 8 بیتی قبلا توضیح داده شد. گفتیم که برای آزاد کردن 4 تا پایه میکروکنترلر می تونیم از روش راه اندازی 4 بیتی استفاده کنیم.
در این روش مراحل راه اندازی اولیه LCD کمی طولانی تره و برای فرستادن کد اسکی به نمایشگر هم به دو مرحله احتیاج داریم. بنابراین این روش از روش 8 بیتی کند تر عمل می کنه اما با توجه به سرعت میکروکنترلرهای امروزی در عمل به مشکلی بر نمی خوریم.

در روش 4 بیتی پایه های D0 تا D3 استفاده نمی شن و به طور کلی در مدار به جایی متصلشون نمی کنیم. اتصال بقیه پایه ها مثل روش 8 بیتی هست.

راه اندازی LCD کاراکتری به روش 4 بیتی

ابتدا تغذیه LCD رو وصل می کنیم و 100mS صبر می کنیم. بعد مراحل زیر رو به ترتیب انجام می دیم:

1- پایه E رو high می کنیم
2- پایه RS رو low می کنیم
3- عدد 0011 رو روی پایه های D4 تا D7 قرار می دیم. طوری که رقم سمت چپ به D7 و رقم سمت راست به D4 اعمال بشه.
4- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
5- به مدت 50mS صبر می کنیم.
6- عدد 0011 رو روی باس داده قرار می دیم.
7- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
8- به مدت 100uS صبر می کنیم.
9- عدد 0011 رو روی باس داده قرار می دیم.
10- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
11- به مدت 100uS صبر می کنیم.
12- عدد 0010 رو روی باس داده قرار می دیم.
13- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
14- به مدت 100uS صبر می کنیم.
15- عدد 0010 رو روی باس داده قرار می دیم.
16- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
17- عدد 1000 رو روی باس داده قرار می دیم.
18- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
19- به مدت 100uS صبر می کنیم.
20- عدد 0000 رو روی باس داده قرار می دیم.
21- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
22- عدد 1000 رو روی باس داده قرار می دیم.
23- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
24- به مدت 100uS صبر می کنیم.
25- عدد 0000 رو روی باس داده قرار می دیم.
26- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
27- عدد 0001 رو روی باس داده قرار می دیم.
28- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
29- به مدت 3mS صبر می کنیم.
30- عدد 0000 رو روی باس داده قرار می دیم.
31- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
32- عدد 0110 رو روی باس داده قرار می دیم.
33- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
34- به مدت 100uS صبر می کنیم.
35- عدد 0000 رو روی باس داده قرار می دیم.
36- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
37- به مدت 100uS صبر می کنیم.
38- عدد 1100 رو روی باس داده قرار می دیم.
39- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
40- به مدت 100uS صبر می کنیم.

با پایان این مراحل LCD آماده نوشتنه. از ابتدای مرحله 15 تا آخر مرحله 19 مربوط به تنظیم حالت کاری LCD در نمایشگر 2 ردیفی، نحوه اتصال 4 بیتی و فونت 7×5 پیکسلی هست. از ابتدای مرحله 20 تا آخر مرحله 24 صفحه نمایشگر خاموش می شه. از ابتدای مرحله 25 تا آخر مرحله 29 دستور پاک کردن صفحه نمایش صادر می شه. از ابتدای مرحله 30 تا آخر مرحله 34 نحوه افزایش شاخص مکان نما مشخص می شه که در اینجا با تایپ هر کاراکتر یکی به اون اضافه می شه. و بالاخره از ابتدای مرحله 35 تا آخر مرحله 40 نمایشگر روشن می شه، cursor خاموش و چشمک زن هم غیر فعال می شه.
حالا LCD آماده دریافت کد اسکی کاراکترهاست. برای نمایش هر کاراکتر مراحل زیر رو انجام می دیم:

1- پایه RS رو high می کنیم.
2- 4 بیت سمت چپ کد اسکی رو روی باس داده قرار می دیم. مثلا 0100 رو برای حرف K
3- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.
4- 4 بیت سمت راست کد اسکی رو روی باس داده قرار می دیم. مثلا 1011 رو برای حرف K
5- پایه E رو به مدت حداقل 500nS low می کنیم و بعد دوباره high می کنیم.

در اینجا اگه همه مراحل درست انجام شده باشه باید حرف K روی LCD ظاهر بشه.

اگه قصد دارید کار با میکروکنترلر LPC1768 رو که از خانواده ARM Cortex-M3 هست شروع کنید، احتمالا این آموزش که توسط کاراکیت براتون تدارک دیده شده بدردتون می خوره.
برای شروع یک فولدر در محل دلخواه ایجاد کنید و نام متناسب با پروژه رو بهش اختصاص بدید. بعد نرم افزار Keil رو باز کنید و طبق شکل زیر روی منوی Project برید و روی New uVision Project کلیک کنید و پروژه رو با نام دلخواه در فولدری که ایجاد کردید ذخیره کنید.

بلافاصله پنجره ای باز می شه و از شما می خواد که تراشه مورد نظر رو انتخاب کنید. ابتدا مثل شکل زیر نام NXP رو که سازنده میکروکنترلر LPC1768 هست انتخاب کنید.

حالا از فهرستی که باز شده میکروکنترلر LPC1768 رو پیدا و انتخاب کنید. دقت کنید که با انتخاب میکروکنترلر در کادر سمت راست مشخصات مربوط به اون نوشته می شه.

با کلیک روی دکمه ok نرم افزار مثل شکل پایین از شما می پرسه که آیا باید فایل استارت آپ رو اضافه کنه یا نه که شما yes رو انتخاب می کنین.

حالا پروژه شما ایجاد شده و شما باید فایلهای مورد نیاز رو به پروژه تون اضافه کنید. قبل از هر کاری باید دو تا فایل ضروری رو توی فولدر پروژه کپی کنید. اولی system_LPC17xx.c و دومی core_cm3.c هست.

اگه این دو تا فایل رو در اختیار ندارید می تونید ازانتهای همین مطلب  دانلودشون کنید.

حالا منوی File رو باز کنید و با استفاده از گزینه New یک فایل جدید بوجود بیارید. این فایل فعلا به فرمت متن یا text هست.

بنابراین دوباره منوی File رو باز کنید و با کلیک روی گزینه Save as فایل رو در محل فولدر پروژه و با نام مناسب و پسوند .c ذخیره کنید. مثلا می تونید اسمش رو main.c بگذارید.

با اینکه فایلها در محل فولدر پروژه ایجاد شدند اما هنوز به خود پروژه اضافه نشدند. به همین علت در این مرحله باید طبق شکل زیر روی آیکن File extensions کلیک کنید تا فایلها رو به پروژه اضافه کنید.

با کلیک روی دکمه Add files فایلهای مورد نیاز رو به پروژه تون اضافه کنید.


اگه این مرحله درست انجام شده باشه فایلهاتون در قسمت راست دیده می شه. حالا با کلیک روی دکمه OK عمل اضافه کردن فایلهای مورد نیاز به پایان می رسه.

حالا موقع اونه که تنظمات پروژه رو انجام بدیم. برای اینکار روی آیکن Target Options کلیک کنید.

پنجره ای باز می شه که چند تا لبه داره و به صورت پیش فرض لبه Target فعال هست. در این لبه اول مقدار کریستال متصل به میکروکنترلر رو تنظیم کنید. بعد اگه برای پروگرام میکرو از بوتلودر استفاده می کنید آدرس ابتدای حافظه رو در محل IROM1 به 0x2000 تغییر بدید

بعد از انجام این تنظیمات روی لبه Output کلیک کنید و طبق شکل زیر چک گزینه Create HEX File رو بذارید تا موقع کامپایل برنامه فایل HEX تولید بشه و بتونید اون رو روی میکرو پروگرام کنید. با کلیک روی دکمه OK کار تنظیمات پروژه به پایان می رسه و می تونید کدنویسیتون رو شروع کنید.

قبل از هر کاری طبق شکل زیر فایل هدر #include “lpc17xx.h” رو معرفی کنید. سایر فایلها و کتابخونه های مورد نیاز رو هم می تونید بعدا زیر همین خط اضافه کنید. بلوک تابع اصلی یا main رو هم طبق همین شکل اضافه کنید و حتما می دونید که متن برنامه اصلی داخل آکولادهای همین تابع نوشته می شه. نکته آخر اینه که بعد از آکولاد پایانی تابع اصلی main چند تا Enter بزنید و چند تا خط خالی ایجاد کنید تا موقع کامپایل برنامه با خطا مواجه نشید.

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

در صورتی که از سایت شرکت SEGGER مجموعه نرم افزار JLink رو دانلود و نصب کرده باشید حتما نرم افزار J-Flash Lite هم براتون نصب شده.
این نرم افزار قابلیت پروگرام کردن انواع میکروکنترلرهای مبتنی بر پردازنده های ARM رو داره و نسبت به نرم افزار J-Flash خیلی ساده تر و جمع و جور تره.
برای اینکه برنامه تون رو به حافظه فلش میکروکنترلر منتقل کنید باید اون رو به hex یا bin تبدیل کنید.

با فرض اینکه فایل آماده است ابتدا نرم افزار J-Flash Lite رو باز می کنیم. بعد طبق شکل زیر نوع میکروکنترلر رو انتخاب می کنیم و روش پروگرام رو هم به JTAG تغییر می دیم و نیازی هم به تغییر سرعت وجود نداره. همین طور که دیده می شه میکروکنترلر LPC1768 انتخاب شده.

در این مرحله با کلیک روی دکمه OK صفحه زیر ظاهر می شه.

از قسمت Data File فایل برنامه رو که در اینجا اسمش led.hex هست انتخاب می کنیم. بعد با کلیک روی دکمه Program Device فایل به حافظه میکرو منتقل می شه. اگه پروگرام درست انجام شده باشه مثل شکل زیر پیغام Programming Done رو می تونیم ببینیم.

اگه از هدر برد استفاده می کنین چند تا نکته ساده اما مهم هست که باید رعایت کنید ، وگرنه میکرو پروگرام نمی شه.
اول اینکه تغذیه هدربرد باید جداگانه تامین شه که این کار معمولا از طریق یک کابل USB جداگانه که به پورت هدربرد متصل می شه صورت می گیره.
دوم اینکه حتما دیپ سوییچ ها رو طبق دستورالعمل سازنده تنظیم کنید. مثلا در همین مثال از هدربرد فروشگاه eca استفاده شده که برای ارتباط با پروگرامر J-link باید دیپ سوییچ شماره یک فعال باشه و بقیه غیر فعال باشن.
سوم اینکه اگه هدربرد دکمه ON/OFF داره حتما اون رو روی حالت ON قرار بدید.

یکی از خصوصیات تقویت کننده ها مقاومت ورودی هست. معمولا گفته می شه که بهتره مقاومت ورودی تقویت کننده زیاد باشه و علتش هم چندان پیچیده نیست. چرا که اگه مقاومت ورودی مدار در مقابل مقاومت منبع سیگنال به اندازه کافی بزرگ نباشه ولتاژ تقسیم می شه و در نقطه ورود به تقویت کننده افت می کنه.

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

البته این موارد زمانی صادق هستند که فرض ما بر این باشه که جنس سیگنال ما ولتاژ باشه نه جریان.

حالا فرض می کنیم که یک تقویت کننده داریم و از مقاومت ورودیش اطلاعی نداریم. به چه روشی می تونیم مقاومت ورودی رو پیدا کنیم؟

می تونیم تقویت کننده رو مثل یک جعبه در نظر بگیریم که معلوم نیست توش چه خبره و اون رو طبق شکل زیر مدل می کنیم:

مقاومت ورودی تقویت کننده همون Zin هست. برای اینکه بتونیم این مقدار رو پیدا کنیم یک مقاومت متغیر که توی مدار با pot نشون داده شده رو به ورودی تقویت کننده وصل می کنیم و سر دیگه اون رو به یک فانکشن ژنراتور. خروجی تقویت کننده رو هم به اسیلسکوپ وصل می کنیم.

مقدار pot رو به 0 اهم می رسونیم و فرکانس فانکشن ژنراتور رو 1000 هرتز و ولتاژ اون رو 1 ولت تنظیم می کنیم. دامنه ولتاژ خروجی رو روی اسیلسکوپ اندازه می گیریم و مقدار مقاومت pot رو به تدریج زیاد می کنیم و این کار رو تا اونجا انجام می دیم که اندازه ولتاژ خروجی روی اسیلسکوپ به نصف مقدار اولیه کاهش پیدا کنه. حالا اگه pot رو از مدار خارج کنیم مقاومت دو سر اون برابر مقاومت ورودی تقویت کننده یعنی Zin خواهد بود.

برای آشنایی با چگونگی اندازه گیری مقاومت خروجی تقویت کننده اینجا کلیک کنید.

حتما تا حالا با سلف های مقاومتی سر و کار داشتین. به ویژه اگه خواسته باشین با واحد ADC میکرو کار کنین.
سلفهای مقاومتی که در اصل axial lead inductor نامیده می شن سلفهای جریان پایینی هستند که مقدار اونها بر اساس کدهای رنگی که روشون چاپ شده مشخص می شه.
در زیر جدول مربوط به نحوه محاسبه مقدار اندوکتانس این سلفها بر حسب میکروهانری نشون داده شده.