الکترونیک، رباتیک و مکانیک

آموزش به زبان بسیار ساده و روان (از صفر تا بینهایت)

الکترونیک، رباتیک و مکانیک

آموزش به زبان بسیار ساده و روان (از صفر تا بینهایت)

الکترونیک، رباتیک و مکانیک

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

نویسندگان
پیوندهای روزانه
طبقه بندی موضوعی
آخرین نظرات

سه شنبه, ۱ دی ۱۳۹۴، ۰۶:۲۲ ب.ظ

۱

 

 

این بار مبحث شیرین تایمر/کانتر در میکروکنترلر AVR رو دنبال خواهیم کرد.

 

پس با ما در ادامه مطلب همراه باشید ...

سلام

بازهم با عذرخواهی مطلبو شروع میکنم،نمیدونم چرا اینقدر وقفه میوفته تو کارام و کلا برنامه ریزی بلد نیستم اگه بلد بودم که الان ... cool

پس ببخشید دیگه ...

تشکر و قدردانی هم میکنم از اون دسته دوستانی که با ارسال پیام و نظر به بنده دلگرمی میدند و تشویقم میکنند که مطالب رو ادامه بدم.

ازتون درخواست میکنم که با یه نظر هرچند کوچیک به بنده امید بدید که کارها رو با جدیت بیشتری پیش ببرم ! ممنونheart

 

بریم سراغ اصل مطلب ...

 

بحث امروز ما راجع به واحدی در میکروکنترلر به نام Timer/Counter هست که اگه یادتون باشه چندین بار تو پستهای قبلی ازش یاد کردیم و حالا دیگه وقتشه که بهتر بشناسیمش.

پس معرفی میکنم : دوستان،،،،تایمر/کانتر  ---   تایمر/کانتر،،،،،دوستان  laughcool

 

تایمر/کانتر چیست ؟

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

وظیفه واحد تایمر/کانتر هم همینجور کارهاست.

کلیه کارهایی که داخل برنامه،مربوط به محاسبات زمانی میشه،زیر نظر واحدی تحت عنوان Timer/Counter انجام میگیره.

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

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

 

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

 

میبینید که واحدها از هم مجزا هستند.

پس علت این مجزا بودن واحدها رو متوجه شدید که؟!

===>  دلیل اصلیش کاهش بار پردازشی CPU میکروکنترلرمونه !

همون تقسیم وظایف خودمونه که میایم به جای اینکه همه کارها رو خودمون انجام بدیم،چند نفر رو بکار میگیریم و تحت رهبری خودمون اون کارها رو برامون انجام میدند.

 

این واحد تایمر/کانتر کارش شمارش هم هست.

در واقع شاید درست ترش این باشه که بگیم کار اصلیش شمارشه !

 

دیگه کاملا هم واضحه که ساخت زمان و استفاده هایی که از اون میشه چقدر کاربردی و مهمه !

 

پس بریم ببینیم که اوضاعش توی میکروکنترلر AVR چجوریه ؟!

 

تایمر مثل یه رجیستر میمونه که مقادیر داخلش بصورت اتوماتیک کم و زیاد میشه !!! (اصلا وظیفه شناسه و وظیفه اش هم همینه !)

میکروکنترلرهای AVR دارای تایمر بسیار دقیقی هستند.

 

نحوه کار یک تایمر/کانتر اینجوریه که از صفر (نه همیشه!) شروع میکنه به شمارش،و به ترتیب میشماره تا به مقدار ماکزیممی که براش تعریف شده برسه !

بعد که به اون مقدار ماکزیمم رسید Overflow میشه و اعلام میکنه که شمارش مورد نظر انجام شد.

حالا این که اون مقدار ماکزیمم چقدره رو بحث روش داریم.

 

در میکروکنترلرهای AVR دو نوع تایمر/کانتر وجود داره :

 

1.تایمر/کانتر 8 بیتی

2.تایمر/کانتر 16 بیتی

 

مفهوم 8 و 16 بیتی رو هم تو پست قبلی یادمه گفتم،بازم میگم : تو 8 بیتی طول داده 8 بیته،تو 16 بیتی طول داده 16 بیت !

 

در تایمر 8 بیتی شمارش از 0 شروع میشه و تا 255 میتونه ادامه پیدا کنه.

در تایمر 16 بیتی شمارش از 0 شروع میشه و تا 65535 میتونه ادامه پیدا کنه.

 

 

احتمال میدم که هنوز نتونسته باشید ارتباط بین زمان و شمارش و تایمر و ... رو درک کنید !

اما اگه اجازه بدید با یه مثال و 2 تا فرمول بحث رو ادامه میدم :

 

مثال :

فرض کنید یه چراغ چشمک زن داریم که بصورت متناوب چشمک میزنه !

حالا این چراغ چشمک زن میتونه هر چیزی باشه؛مثلا چراغ راهنمای اتومبیل !!!

شیوه ی کارش چجوریه ؟

 

با فرض تاخیر : یک ثانیه

 

1.روشن میشه

2.یک ثانیه روشن میمونه

3.خاموش میشه

4.یک ثانیه خاموش میمونه

5. ... ==> به همین ترتیب

 

همین روند متناوبا تکرار میشه.

 

اما اگه همینو بخوایم بصورت الگوریتمی بنویسیم؛اینجوری میشه :

 

1.روشن شو

2.یک ثانیه صبر کن ==> تاخیر

3.خاموش شو

4.یک ثانیه صبر کن ==> تاخیر

5 . ...  ==> به همین ترتیب

 

در مثال بالا با نحوه کار یک چراغ چشمک زن آشنا شدید.

اما حالا برای اینکه بحث علمی تر پیش بره،ما اون میزان تاخیری رو که در مثال بالا 1 ثانیه فرض کرده بودیم رو به 10 میلی ثانیه کاهش میدیم !

 

خب؛یه فرمولی اینجا داریم که مطمئنم همتون اینو بلدید ولی بازم میگم و مینویسمش :

 

 

مفهوم : این رابطه میخواد بگه که دوره تناوب(حوزه زمان) با فرکانس(حوزه فرکانس) رابطه عکس داره.

این رابطه برعکسش هم قاعدتا وجود داره که بنده روبروش نوشتم !

 

گفتیم با فرض اینکه فلاشر ما دارای تاخیر 10 میلی ثانیه باشه،معنا و مفهومش اینه که دارای دوره تناوب 10 میلی ثانیه هم هست ! OK ؟

یعنی هر 10 میلی ثانیه یکبار داره یه عملی متناوبا تکرار میشه.

خب با استفاده از فرمول بالا داریم :

 

 

پس میگیم فرکانس فلاشر 100 هرتزه !

 

بیاین تصور کنیم که فرکانس کاری میکرو رو روی 4MHz تنظیم کردیم ! (منظورم فرکانس اصلی میکروکنترلره که قبلا راجع بهش بحث کردیم.)

 

 

به این معنا که هر پالس میکرو 0.00025 میلی ثانیه طول میکشه تا انجام بشه !!!  (خیلی این عدد کوچیکه ها ، تو کفش برید !)

 

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

 

وقتی از مقدار 0 میره به مقدار 1 میگیم یه پالس اعمال شده (یا طول کشیده).

وقتی از مقدار 1 میره به مقدار 2 میگیم یه پالس دیگه اعمال شده (یا طول کشیده) !

و به همین ترتیب ...

 

حالا هر پالس ما هم تو حوزه زمان طبق فرض بالا 0.00025 میلی ثانیه طول میکشه و این میشه اصل ماجرای ما ...

 

یعنی ما اگه بخوایم زمان بسازیم باید مقدار متناظرش رو به تعداد پالس(که بشه همون شمارش) بدست بیاریم.

از یه فرمول جدید رونمایی میکنم با این قیافه :

 

 

TimerCount : همون تعداد شمارشیه که باید تایمر/کانتر انجام بده.(مجهول)

Duration : مدت زمانیه که میخوایم تایمر/کانتر برامون بسازه.

Period : دوره تناوبی که بدست آوردیم.

1- : این 1- هم بخاطر اینه که شمارش همیشه از 0 شروع میشه نه 1 .

 

بیاین همون مثالی که گفتیم میخوایم 10 میلی ثانیه تاخیر بسازیم رو حل کنیم.

دقت کنید که 10 میلی ثانیه برای ما خیلی زمان ناچیزیه اما برای میکرو یه زمان بسیار بزرگه !!!

اینجوری اعداد رو در فرمول جایگذاری میکنیم :

 

 

میبینید که عدد 39999 در خروجی ظاهر میشه و معنای این عدد اینه که تایمر/کانتر باید از صفر تا 39999 رو به ترتیب بشماره،وقتی رسید به این عدد     10 میلی ثانیه طی شده ! چون هر شمارش 0.00025 میلی ثانیه طول میکشه.

 

اگر به عدد 39999 دقت کنید متوجه خواهید شد که تنها میتونیم از تایمر/کانتر 16 بیتی برای ساختنش استفاده کنیم.

چون تایمر/کانتر 8 بیتی تنها میتونست تا عدد 255 رو بشماره در حالیکه تایمر/کانتر 16 بیتی قابلیت شمارش تا عدد 65535 رو داره و عدد بدست آمده از مثال(39999) در بازه تایمر/کانتر 16 بیتی قرار دارد.

با یه محاسبه متوجه میشیم که حداکثر زمانی که میتونیم با یه تایمر/کانتر 16 بیتی بسازیم 16.384 میلی ثانیه است !

 

حالا اومدیم و دلمون خواست که یه تاخیر بزرگتر،مثلا 20 میلی ثانیه ای ایجاد کنیم،اونوقت اوضاع از چه قراره ؟

خب،اینجا به بعد دیگه بحث تکنیکیه !!!

 

اگه یادتون باشه اومدیم و فرکانس کاری میکرو رو 4 مگاهرتز در نظر گرفتیم.

اگه بیایم و این مقدار رو به 0.5 مگاهرتز کاهش بدیم،اون موقع T=0.002 ms میشه و TimerCount= 9999 میشه.

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

 

F_CPU=4 MHz ,T=0.00025 ms ,TimerCount=39999

F_CPU=0.5 MHz ,T=0.002 ms ,TimerCount=9999

 

نتایج رو هم لیست کردم که یه وقت خسته نشید برید بالاتر دنبالشون ! من خیلی هواتونو دارم cheeky

خیلی دقت کنید به اعداد و تفاوتهاشون !

قبل از اینکه بیاین و مطالب پایین تر رو بخونید،سعی کنید مطالب بالا رو بفهمید.

 

اگه دقت کنید تو فرکانس 0.5 مگاهرتز،دوره تناوب بیشتر شده (تقریبا 10 برابر) و مقدار TimerCount هم کمتر شده!

 

این کم شدن مقدار TimerCount چه مفهومی داره ؟

یعنی اینکه تو حالت 4 مگاهرتز برای رسیدن به مدت زمان 10 میلی ثانیه 39999 پالس نیاز بود.

اما در حالت 0.5 مگاهرتز تعداد پالس ها کم شده و به 9999 رسیده !

یعنی همین مدت زمان رو با تعداد پالس های کمتری ساختیم و نتیجه اش اینکه با تایمر/کانتر 16 بیتی (مثلا !) که حداکثر مقدارش  65535 پالس هست میتونیم با فرکانس کمتر،مدت زمان بیشتری بسازیم.چون تایمر/کانتر با پیمودن 9999/65535 تونست 10 میلی ثانیه بسازه پس باید با 65535/65535 زمان بزرگتری نسبت به فرکانس 4 مگاهرتز بسازه !

جالبه بدونید که حداکثر زمانی که میشه با فرکانس 0.5 مگاهرتز و تایمر/کانتر 16 بیتی ساخت 131.072 میلی ثانیه است !

 

خب؛پس به این نتیجه رسیدیم که برای اینکه مدت زمان بزرگتری بسازیم باید فرکانس رو کم کنیم تا دوره تناوب بزرگتر بشه.

 

حالا حتما میگید که میایم و فرکانس کاری میکروکنترلر رو هرچی هست کمش میکنیم !!!

نه دیگه ! نه عزیزم ... surprise

این کارو بکنی که دیگه همه چی بهم میریزه،سرعت پردازش میکرو هم کم میشه !

تازه واحد های دیگه هم داریم مثل : ADC,USART,... اونا هم هرکدوم تنظیم شده فرکانسهاشون !

نمیشه که !!!

دیگه از این حرفا نزنیا !؟ وگرنه به وبلاگمون دیگه رات نمیدم ! تازه بستنی هم برات نمیخرم ! ههههه laugh

 

پس چه کنیم ؟

یادتون باشه تو بخشی که ADC ها رو توضیح میدادم راجع به تقسیم فرکانسی صحبت کردم. یادتونه ؟!

الان هم میایم و دقیقا همین کارو میکنیم !

میایم یه مقدار تقسیم شده ای از فرکانس اصلی میکرو رو به واحد تایمر/کانتر میدیم ! (نگرفتی چی شد حتما برو بخش ADC رو بخون )

به این تکنیک که شرکت Atmel برای واحد تایمر/کانتر و دیگر واحد ها در نظر گرفته اصطلاحا prescaling میگند.

 

میکروکنترلر مورد نظر ما که فعلا ATmega 32 هست دارای تایمر/کانتر هایی به قرار زیر است :

 

1.تایمر/کانتر 0 ==> 8 بیتی

2.تایمر/کانتر 1 ==> 16 بیتی

3.تایمر/کانتر 2 ==> 8 بیتی

 

پس مطالب آینده ما که توضیح این تایمر/کانترها و مدهای فعالیت اونهاست رو از دست ندید.

پاینده و پیروز باشید ...


منبع : www.noise.blog.ir
موافقین ۰ مخالفین ۰ ۹۴/۱۰/۰۱
قاسم قاسمی

AVR

Atmega32

Counter

Timer

آموزش AVR

نظرات  (۱)

عالی بود دمت گرم مهندس

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی