تایمر کانتر در میکرو کنترلر

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

در زندگی روزمره اکثر کارها با زمان هماهنگ می شود. به عنوان مثال در ساعتی خاص از خواب بیدار می شویم، در ساعتی خاص ورزش کرده و صبحانه می خوریم و …
وظیفه تایمر کانتر هم به همین صورت است. کلیه کارهایی که داخل برنامه، مربوط به محاسبات زمانی می شود، زیر نظر واحدی تحت عنوان Timer/Counter انجام می گیرد. در میکروکنترلرها این واحد را از CPU جدا کردند تا محاسبات زمانی دقیق تر انجام شود و تحت تاثیر فعالت های پردازنده قرار نگیرد. با این حال این واحد تحت رهبری پردازنده فعالیت می کند. در بلوک دیاگرام زیر این مسئله به وضوح روشن است.

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

 هرچه اسیلاتور ما دقیق تر باشد زمان دقیق تری خواهیم داشت، به عبارت دیگر طبق فرمول زیر هرچه اسیلاتور به عددی که روی آن درج می شود نزدیک تر باشد زمان تناوب به دست آمده دقیق تر خواهد بود.
F=1/T  <–> T=1/F

برای درک بهتر تفاوت بین زمان و شمارش به مثال چراغ چشمک زن از فصل گذشته رجوع می کنیم.
فرض کنید برنامه ای نوشتید که LEDهای موجود بر روی PORTB به صورت زیر روشن و خاموش می شوند:
روشن
یک ثانیه تاخیر
خاموش
یک ثانیه تاخیر
حال برای اینکه بحث را علمی تر بررسی کنیم تاخیر ۱ ثانیه را به ۱۰ میلی ثانیه کاهش می دهیم. و با استفاده از فرمول محاسبه فرکانس، فرکانس ۱۰ میلی ثانیه را بدست می آوریم.

F=1/T=1/(10×۱۰^(-۳) )=۱۰۰Hz

با توجه به رابطه فوق در می یابیم که در هر ثانیه LEDها ۵۰ بار روشن و ۵۰ بار خاموش می شوند، به عبارت دیگر فرکانس فلشر ۱۰۰ هرتز است.

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

TimerCount=Duration/Period-1

بخش TimerCount : تعداد شمارش تایمر/کانتر می باشد.
بخش Duration : مدت زمانی که قرار است توسط تایمر/کانتر ساخته شود.
بخش Period : دوره تناوبی که از فرکانس کاری میکروکنترلر به دست می آید.

نکته: منفی یک موجود در فرمول به منظور آن است که شمارش همیشه از ۰ شروع می شود.

فرض کنید که ما می خواهیم توسط تایمر/کانتر ۱۶ بیتی تا ۶۵۵۳۵ که حداکثر مقدار شمارش آن است بشماریم، با جای گذاری در فرمول گفته شده در می یابیم که تایمر/کانتر ۱۶ بیتی حداکثر زمانی را که می تواند ایجاد کند ۳۸۴/۱۶ میلی ثانیه است. در اولین قدم چیزی که به ذهن می رسد کاهش فرکانس میکروکنترلر است، با کاهش فرکانس کاری میکروکنترلر زمان تایمر/کانتر افزایش می یابد اما این کاهش باید به اندازه ای باشد که مقدار فرکانس کمتر از مگا هرتز نشود زیرا در غیر این صورت سرعت پردازش CPU کاهش یافته و واحدهای دیگر (ADC, USART, ..) نیز بهم می ریزد.
با توجه به مطالب فوق نتیجه می گیرم که کم کردن فرکانس کاری میکروکترلر عملی منطقی نیست. برای حل این مشکل شرکت اتمل تکنیکی برای تایمر/کانتر و سایر واحد ها به نام Prescaling ایجاد کرده است.

تکنیک  #prescaling در #کدویژن

در کدویژن ابتدا فرکانس کاری میکروکنترلر را بر روی ۸ مگا هرتز تنظیم کنید، به قسمت Timer0 یا Timer1 بروید، می بینید که اگر Clock Source بر رو System Clock تنظیم باشد، Clock Value شامل زیر مجموعه ای می شود. این زیر مجموعه در واقع تقسیمی از ۲۵۶,۶۴,۸,۱ و ۱۰۲۴ است که به آن Prescaler می گویند. به این ترتیب توانستیم با فرکانس ۸ مگا هرتز به فرکانس های ۳۱٫۲۵k,125k,1M,8M و ۷٫۸۱۲k هرتز برسیم. این تقسیم فرکانسی در تمامی فرکانس های صادق است. (فرکانس ۸ مگا هرتز فقط یک مثال بود.)

تایمر کانتر ها در میکروکنترلر AVR در چهار حالت (Mode) اصلی می توانند مورد استفاده قرار بگیرند:
یک- #Normal_Mode
دو- #CTC_Mode
سه- #Fast_PWM_Mode
چهار- #Phase_Correct_PWM_Mode
پنج- #Phase_and_Frequency_Correct_PWM_Mode  (در برخی از میکروکنترلرهای AVR موجود است.)

ادامه دارد…

پاسخ دهید

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