آموزش AVRآموزش الکترونیک

آموزش جامع تایمر / کانتر در میکروکنترلر های AVR ( آموزش AVR #8)

سلام. آموزش جامع تایمر / کانتر در میکروکنترلر های AVR ( آموزش AVR #8) را آماده کردیم.

آموزش کامل مبحث تایمر و کانتر AVR

آموزش کامل مبحث تایمر و کانتر AVR

در قسمت قبلی سری آموزش های AVR ، ما مبحث آنالوگ به دیجیتال را به طور کامل مورد بحث قرار دادیم. و در این قسمت میخواهیم با تایمر و کانتر در AVR آشنا شویم.

قسمت قبلی : آموزش کامل مبدل آنالوگ به دیجیتال ADC در میکروکنترلر های AVR (آموزش AVR #7)

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

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

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

به تصویر زیر نگاه کنید :

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

همانطور که میبینید بخش ها از هم جدا هستند و دلیل این جدایی کاهش بار پردازشی CPU میکروکنترلر است. و واحد تایمر / کانتر وظیفه شمارش را بر عهده دارد.

تایمر مانند یک رجیستر است که مقادیر آن به صورت اتوماتیک کم و زیاد میشود. میکروکنترلرهای AVR دارای تایمر بسیار دقیقی هستند. نحوه کار تایمر / کانتر به این صورت است که اغلب از صفر شروع میکند به شمارش و ترتیب میشمارد تا به مقدار حداکثری که برای آن تعریف شده است برسد.

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

انواع Timer / Counter در میکروکنترلر های AVR

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

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

مفهوم 8 بیتی و 16 بیتی را در قسمت قبلی به طور کامل توضیح دادیم. و به طور خلاصه : در نوع 8 بیتی طول داده ها 8 بیت است و در نوع 16 بیتی طول داده ها 16 بیت است.

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

با یک مثال بحث را برایتان کامل باز میکنم.

اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید.

مثال مبحث تایمر و کانتر

فرض کنید یک چراغ چشمک زن داریم. این چراغ به طور متناوب چشمک میزند. خب شیوه کار این چشمک زن چطور است ؟

حتما ببینید :  مقایسه ویژگی های انواع برد آردوینو (معرفی قویترین و بهترین)

فرض میکنیم که تاخیر چشمک زن یک ثانیه است. یعنی :

  1. روشن میشود
  2. 1 ثانیه روشن میماند
  3. خاموش میشود
  4. 1 ثانیه خاموش میماند

>> و تکرار همین 4 مرحله به طور متناوب

خب ما باید این چهار مرجله را به صورت الگوریتم بنویسیم. یعنی :

  1. روشن شو
  2. یک ثانیه صبر کن >> تاخیر
  3. خاموش شو
  4. یک ثانیه صبر کن >> تاخیر

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

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

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

آموزش کامل timer Counter

 

این فرمول به ما نشان میدهد دوره تناوب با فرکانس رابطه عکس دارد. با فرض اینکه فلاشر دارای تاخیر 10 میلی ثانیه ای باشد، یعنی دوره تناوب آن 10 میلی ثانیه است. یعنی هر 10 میلی ثانیه یک عمل تکرار میشود.

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

محاسبه فرکانس

یعنی فرکانس فلاشر 100 هرتز است. خب اگر فرکانس کاری میکروکنترلر را روی 4MHz تنظیم کنیم :

فرکانس کاری میکروکنترلر

با توحه به محاسبه بالا یعنی هر پالس میکروکنترلر 0.00025 میلی ثانیه طول میکشد.حالا تصویر میکنیم که مقدار شمارنده ما 0 است و قرار است شمارش را شروع کند تا به مقدار حداکثر برسد.

وقتی از مقدار 0 به 1 برسد یک پالس اعمال شده است. وقتی از 0 به 2 برسد یک پالس اعمال شده است. و وقتی …

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

محاسبه مدت پالس در AVR

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

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

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

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

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

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

بدست آوردن تعداد کانتر زمان AVR

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

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

زیرا همانطور که گفتیم تایمر کانتر 8 بیتی تنها میتواند نهایتا تا عدد 255 را بشمارد در حالی که تایمر/کانتر 16 بیتی میتواند تا عدد 65535 را بشمارد. و این عدد 39999 در بازه تایمر / کانتر 16 بیتی قرار دارد.

حتما ببینید :  تست برد آردوینو (آموزش تعمیر خرابی سوختن آردوینو)

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

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

تنظیم تایمر/کانتر برای زمان های بالا

اگر به یاد داشته باشید ما در ابتدا فرکانس کاری میکروکنترلر را 4 مگا هرتز قرار دادیم. اگر این مقدار را به 0.5 مگاهرتز کاهش دهیم، در این صورت دوره تناوب 0.002 میلی ثانیه میشود و Timer Count هم میشود 9999.

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

فرکانس پردازنده =4 MHz , دوره تناوب =0.00025 ms , تایمر کانت=39999

فرکانس پردازنده =0.5 MHz , دوره تناوب=0.002 ms , تایمر کانت =9999

خوب به این دو نتیجه بالا دقت کنید.

همانطور که متوجه شدید در فرکانس 0.5 مگاهرتز دوره تناوب بیشتر میشود یعنی تقریبا 10 برابر اما TimerCount کمتر شده است. کم شدن مقدار تایمر کانت چه مفهمومی دارد ؟

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

یعنی همین مدت زمان را با تعداد پالس های کمتر ساختیم یعنی یک میکروکنترلر با تایمر/کانتر 16 بیتی که حداکثر مقدار آن 65636 پالس هست میتوانیم با فرکانس کمتر زمان بیشتری بسازیم.

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

خب حتما با خودتان میگویید فرکانس را به حداقل برسانیم ؟ خیر این کار اشتباه است. زیرا با این کار سرعت پردازش میکروکنترلر کم میشود و همه چیز به هم میریزد ! یعنی واحد های ADC ، USART و … تنظیم هایشان بهم میریزد.

حالا باید چه کار کنیم ؟

در قسمت ADC ، راجع به تقسیم فرکانس صحبت کردیم. حالا نیز باید همان کار را انجام دهیم. مثلا یک مقدار تقسیم شده از فرکانس اصلی را به واحد Timer/Counter میدهیم. شرکت Atmel این تکنیک را برای واحدهای میکروکنترلر در نظر گرفته است و به آن prescaling میگویند.

میکروکنترلر مورد نظر ما Atmega32 است که دارای تایمر/کانتر های زیر است :

  1. تایمر/کانتر 0 (8 بیتی)
  2. تایمر/کانتر 1 (16 بیتی)
  3. تایمر/کانتر 2 (8 بیتی)

در قسمت های بعد راجع به این Timet / Counter ها بحث خواهیم کرد.

قسمت بعدی : آموزش کامل تایمر / کانتر 0 در میکروکنترلر AVR (توضیح Timer/Counter صفر) ( آموزش AVR #9)

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

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

دیدگاهتان را بنویسید

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

دکمه بازگشت به بالا