بخش هشتم آموزش AVR : راه اندازی واحد تایمر/کانتر ( 2 )

بازگشت به آموزشگاه

مقدمه :

در بخش گذشته یکی از مهمترین واحدهای میکروکنترلرهای AVR را به طور مفصل تشریح کردیم. در این بخش با هدف آشنایی با تنظیمات و برنامه نویسی واحد تایمر/کانتر چند مثال کاربردی ارائه می کنیم.

pwm_led


مثال 1

برنامه ای بنویسید که با استفاده از Timer0 میکروکنترلر Atmega32 که کلاک کاری آن 1Mhz است ، فرکانس 100 هرتز را روی پایه PORTB.7 تولید کند. از حالت نرمال Timer0 استفاده کنید.

حل :

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

برای اندازه گیری فرکانس تولید شده ، به یک فرکانس متر روی PORTB.7 احتیاج داریم که آن را از نوار ابزار مطابق شکل زیر به میکرو متصل می کنیم. سپس روی آن دابل کلیک کرده و Operating Mode را روی Frequency قرار می دهیم.

mesal1_timer

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

در این مرحله ابتدا تنظیمات چیپ و پورت را مطابق شکل زیر انجام می دهیم.

mesal1_timer2

سپس در سربرگ Timers ، ابتدا تنظیمات اولیه را انجام داده و Mode را روی نرمال قرار می دهیم. سپس یک فرکانس متناسب با فرکانس نهایی خواسته شده ( 100 هرتز ) انتخاب می کنیم ، به طوری که زمان سر ریز شدن آن بیشتر از زمان پریود فرکانس نهایی باشد یعنی داشته باشیم : f/256<100

فرکانس 15.625KHz انتخاب می شود چون اولین فرکانسی است که در این رابطه صدق می کند.

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

فرکانس تایمر در مد نرمال و پریود آن به صورت زیر بدست می آید:

1MHz/64=15.625KHz   , T=1/15.625KHz=64us

چون تایمر 8 بیتی است مدت زمان یکبار سرریز شدن آن برابر است با :

T=64*256us=16384us

فرکانسی که میخواهیم 100 هرتز یعنی 0.01 ثانیه ( 10 میلی ثانیه ) است.

با توجه به اینکه دیوتی سایکل 50% باید باشد ، یعنی 5 میلی ثانیه پالس خروجی 0 و 5 میلی ثانیه 1 است.

در نتیجه مقدار اولیه تایمر به صورت زیر بدست می آید :

16384us-5000us=11384us , 11384/64=177.875≃178 = 0xb2

mesal1_timer3

مرحله سوم : تکمیل برنامه

برنامه را به صورت زیر تکمیل می کنیم :

توضیح برنامه : تنها کاری که انجام دادیم یکی پاک کردن خطوط اضافی در برنامه تولید شده است و دیگری اضافه کردن PORTB.7=~PORTB.7 در تابع سابروتین وقفه می باشد. این خط باعث می شود تا در هر بار سرریز شدن تایمر ، مقدار قبلی PB7 ، Not شده و به خروجی برود.

 

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

mesal1_timer4

دانلود سورس مثال 1

 


مثال 2

با استفاده از Atmega32 برنامه ای بنویسید که فرکانس 40KHz با زمان وظیفه 50% تولید کند. فرکانس میکروکنترلر را 8MHz درنظر گیرید و از مد CTC تایمر 0 استفاده نمایید.

حل :

مرحله اول : پروتئوس

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

mesal2_timer

مرحله دوم : کدویزارد

در سربرگ Timer ، فرکانس کلاک واحد تایمر را به علت اینکه 4000KHz/256=15.625KHz<40KHz روی اولین گزینه N=1 قرار می دهیم. حالت عملکرد تایمر را نیز روی CTC قرار می دهیم. حال باید مقدار اولیه OCR0 را معین کنیم. فرکانس خروجی در مد CTC از رابطه زیر بدست می آمد.

mesal2_timer11بنابراین از رابطه فوق بدست می آوریم :

mesal2_timer2mesal2_timer3

مرحله سوم : تکمیل برنامه

با جز حذف کدهای اضافی ، هیچ کد اضافی دیگری نیاز نیست و برنامه کامل است !

 

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

mesal2_timer4

تذکر : فرکانس میکرو در نرم افزار پروتئوس روی 8Mhz داخلی قرار گرفته است.

 

دانلود سورس مثال 2

 


مثال 3

برنامه ای با استفاده از Atmega32 بنویسید که با استفاده از تایمر شماره 0 ، موجی با فرکانس ثابت 2KHz و دیوتی سایکل متغیر بین 10 تا 90 درصد تولید کند. فرکانس میکرو را خودتان انتخاب کنید.

حل :

مرحله اول : پروتئوس

دو عدد کلید برای تنظیم PWM به پورت C اضافه کردیم. به جای استفاده از فرکانس متر از Oscilloscope برای دیدن تغییرات استفاده می کنیم.

mesal3_timer

مرحله دوم : کدویزارد

می خواهیم فرکانس 2KHz داشته باشیم. یعنی پریود 500us را باید ایجاد کنیم. به علت اینکه فرکانس ثابت و دیوتی سایکل متغیر است ، پس در حالت PWM هستیم و میتوان FastPWM یا PhaseCorrect را انتخاب کرد. طبق فرمول FastPWM داریم :

mesal3_timer1

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

mesal3_timer2

در صورتی که فرض کنیم N=8 ، Fclk=4096000 بدست می آید که تقریبا 4Mhz است. در نتیجه فرکانس کلاک میکرو را روی 4MHz قرار می دهیم و N=8 ضریب تقسیم می شود.

 

نکته : برای اینکه پهنای PWM در حالت عادی روی 50% باشد ، رجیستر OC0 را دقیقا نصف مقدار دهی می کنیم. بنابراین 128 یا 0x80 می شود.

mesal3_timer3

مرحله سوم : تکمیل برنامه

در این مرحله فقط برای کلید برنامه را در حلقه while کامل می کنیم. نیاز به اضافه کردن delay.h برای تاخیر کلید می باشد. برنامه نهایی به صورت زیر است :

توضیح برنامه : در حلقه while تنها دو حلقه شرطی if وجود دارد که فقط در صورت زدن یکی از کلیدها وارد آن می شود و یک واحد به مقدار کنونی OCR0 اضافه یا کم می کند. سپس توسط یک حلقه if دیگر اجازه بیشتر یا کمتر شدن رجیستر OCR0 از مقادیر 250 و 10 را نمی دهد. تاخیر هم برای رفع Bounce کلید ضروری است.

 

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

mesal3_timer4

دانلود سورس مثال 3

 


راه اندازی RTC در میکروکنترلرهای AVR

قابلیت ویژه ای که در برخی از میکروکنترلرهای AVR وجود دارد این است که میتوان از واحد تایمر/کانتر به عنوان زمان سنج حقیقی ( Real Time Clock ) استفاده کرد . با فعالسازی این ویژگی میتوان ۱ ثانیه دقیق را در داخل میکرو ایجاد و از آن در پروژه ها استفاده کرد . در برخی از میکروکنترلرها تایمر شماره ۰ و در اکثر میکروکنترلرها تایمر شماره ۲ این ویژگی را دارد . زمانی که این حالت فعال شود کلاک تایمر از کریستال خارجی ۳۲۷۶۸ هرتز که بین دو پایه به نام های TOSC1 و TOSC2 تامین می شود که به منظور تولید ۱ ثانیه دقیق طراحی شده است . کافی است تا با راه اندازی این تایمر در کد ویزارد و قرار دادن یک کریستال با فرکانس ۳۲۷۶۸ هرتز به این دو پایه و تنظیم ضریب تقسیم در کدویزارد روی PCK2/128 و مد نرمال به این هدف رسید . ضمنا میتوان با فعال کردن خروجی و قرار دادن آن روی Toggle و قراردادن یک LED روی پایه OC2 آن را هر ثانیه یکبار روشن و خاموش نمود . شکل زیر فعالسازی این ویژگی در Atmega32 را نشان می دهد . با فعالسازی وقفه تایمر میتوان کاری که در هر ثانیه در برنامه باید انجام شود را درون تابع روتین وقفه انجام داد .

CodeWizard_RTC_Atmega32


مثال 4

با استفاده از Atmega32 و LCD کاراکتری ، یک ساعت دیجیتال بسازید که دارای دو کلید تنظیم باشد. یک LED هم برای یک ثانیه در نظر بگیرید.

حل :

مرحله اول : پروتئوس

یک کریستال با مقدار 32768 بین پایه های TOSC1 و TOSC2 قرار می دهیم. یک LED روی پایه OC2 و دو عدد کلید به همراه یک LCD کاراکتری به میکرو متصل می کنیم.

mesal4_rtc

مرحله دوم : کدویزارد

تنظیمات سربرگ های chip و LCD میکرو را طبق معمول انجام می دهیم. تنظیمات سربرگ Timer دقیقا به همان صورت گفته شده است.

mesal4_rtc1

مرحله سوم : تکمیل برنامه

با تولید شدن کد اولیه مشاهده می شود که یک تابع سابروتین وقفه ایجاد شده است که در هرثانیه یکبار اجرا می شود. در برنامه سه متغیر s ، m و h به ترتیب برای ثانیه ، دقیقه و ساعت تعریف می کنیم. درون تابع سابروتین وقفه ثانیه را یک واحد افزایش می دهیم. و درون حلقه while کدهای اجرای کلید و نمایش روی lcd را قرار می دهیم.

توضیح برنامه : در حلقه while برای برنامه کلید ، از کلید نوع یک استفاده کردیم. سپس محدوده مجاز برای متغیر های ثانیه ، دقیقه و ساعت را توسط if تعیین کردیم. برای ثانیه و دقیقه به محض بالاتر رفتن از 59 یک واحد به متغیر بالاتر می دهند و خودشان صفر می شوند. برای نمایش روی LCD نیز ابتدا با استفاده از تابع sprintf اعداد ثانیه ، دقیقه و ساعت را به یک آرایه منتقل می کنیم و سپس نمایش می دهیم.

 

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

mesal4_rtc2

دانلود سورس مثال 4

 


تایمرسگ نگهبان

به تایمری خاص اشاره دارد که وظیفه آن نگهداری و نظارت بر کار میکروکنترلر است. این تایمر مجهز به اسیلاتور RC داخلی برای خود است که پس از شمارش و سرریز شدن، این قابلیت را دارد که میکروکنترلر را بصورت داخلی ریست کند. این تایمر در مواردی کاربرد دارد که امکان قفل کردن تراشه وجود دارد و به این وسیله پس از قفل کردن میکروکنترلر، دیگر امکان ریست کردن WDT وجود ندارد و به همین دلیل WDT شمارش خود را انجام داده و سرریز می شود و در نتیجه میکروکنترلر را ریست می کند تا از حالت قفل خارج شود. برنامه میکروکنترلر باید بگونه ای باشد که در حین اجرا، تایمر سگ نگهبان (Watch Dog Timer) بصورت مداوم قبل از سرریز شدن، صفر شود.

تنظیمات تایمر Watchdog در کدویزارد

در سربرگ Timers سربرگی مخصوص تنظیمات تایمر سگ نگهبان وجود دارد. با فعالسازی این قسمت و زدن تیک Enable می بایست ضریبی برای تقسیم فرکانس تایمر انتخاب نمود. فرکانس اصلی نوسان ساز تایمر در حالت عادی ۱ مگاهرتز در ولتاژ تغذیه ۵ ولت می باشد . بر اساس تایمی که میخواهیم تا اگر میکرو هنگ کرد تایمر سگ نگهبان آن را ریست کند باید این ضریب را مشخص نمود که در جدول زیر به طور کامل آورده شده است . برای جلوگیری از سر ریز شدن تایمر سگ نگهبان باید به طور مداوم آن را در طول برنامه ریست کرد . برای ریست کردن تایمر از دستور زیر در طول برنامه استفاده می شود .

Watchdog_Timer


با کلیک بر روی تصویر زیر به بخش بعدی آموزش بروید

next-image



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

دیدگاه (4)

  • Ali پاسخ

    سلام، کارتون عالیه، خدا قوت…

    1395-10-24 در 20:06
    • ادمین الکترو ولت پاسخ

      سلام دوست عزیز ممنون از نظر لطفتون

      1396-07-10 در 02:25
  • امید پاسخ

    سلام ممنون از آموزش های شما
    اگر بخواهیم از اسیلاتور کریستال خارجی،فقط برای شبیه سازی پروتئوس استفاده کنیم، در قسمت کلاک سورس کدام گزینه رو باید انتخاب کرد؟system clock یا TOSC1؟در ATMEGA 16 یا 32 منظورم هست.و اینکه آیا بازهم نیاز هست که برای شبیه سازی پروتئوس فیوزبیت های خود کدویژن رو برنامه ریزی کرد؟

    1397-07-29 در 10:23
    • ادمین الکترو ولت پاسخ

      سلام دوست عزیز ممنون از لطفتون
      ما هم در مثال 4 شبیه سازی کردیم که باید طبق توضیحات این مثال عمل نمایید. فیوز بیت های میکروکنترلر در هنگام شبیه سازی باید در نرم افزار پروتئوس در بخش Properties آی سی تنظیم شود.

      1397-08-14 در 12:37

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

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

بازگشت به آموزشگاه