در قسمت یازدهم آموزش میکروکنترلر AVR به بررسی تایمرکانترها و عملکرد تایمر کانتر شماره 0 در mega32 پرداختیم. در این قسمت از آموزش AVR نیز ادامه مطلب تایمر کانتر 0 در ATMEGA32 را بررسی خواهیم کرد.
تایمر کانتر 0 در ATMEGA32 چه مدهایی دارد؟
مدهای نرمال، ctc، fast PWM و phase Correct PWM چهار مد قابل فعالسازی در تایمر کانتر صفر در ATMEGA32 هستند. در این قسمت بیشتر درباره مدهای غیر PWM صحبت میکنیم.
مد نرمال
در مد نرمال مقدار تایمر کانتر از صفر تا ۲۵۵ حرکت میکند و مجدداً به صفر میرسد. اگر فرکانس کلاک وارد شده به تایمر کانتر، بهصورت ثابت باشد، میتوان آن را بهصورت یک خط مستقیم نمایش داد و اگر در روند تغییر مقدار، مقدار فرکانس نیز تغییر کند، شکل آن نیز دیگر بهصورت یک خط صاف نیست و مانند یک منحنی میشود. بهعنوانمثال، فرض کنید در مدت زمانی که فرکانس کمتر یا بیشتر شده، کلاکی به تایمر کانتر وارد نشده است؛ بنابراین مقدار آن ثابت مانده است.
کاربردهای مد نرمال چیست؟
یکی از کاربردهای مد نرمال بحث وقفه اورفلو و سرریز است که در قسمت قبل در مورد آن توضیح داده شد. یکی دیگر از این موارد، بحث match compare یا برابری مقدار تایمر کانتر صفر با رجیستر OCR0 میباشد.
همه مدهای تایمر کانتر 0 را می توانید در قسمت 11 آموزش میکروکنترلر AVR مطالعه نمایید.
تفاوت مد PWM (fast PWM) و مد نرمال در ATmega32
یکی از تفاوتهای عمده مد PWM (fast PWM) با مد نرمال، این است که مقداردهی به رجیستر OCR0 در مد نرمال فوراً روی رجیستر OCR0 تأثیر میگذارد؛ ولی در مد fast PWM تنها در نقاط خاصی از تایمر کانتر این اتفاق میافتد (در قسمت قبل توضیح داده شد)؛ این موضوع به این دلیل است که پالسهای ناخواستهای ایجاد نشود.
نکته
امکان مقداردهی به رجیستر OCR0 بهصورت فوری این امکان را فراهم میکند که در طول یک مسیر از صفر تا ۲۵۵، گاهی چندین وقفه و چندین زمان مختلف یا چندین شمارش مختلف از طریق وقفه OCR0 تأمین شود.
مثال
بهعنوانمثال، اگر مقدار OCR0 با مقدار تایمر کانتر صفر برابر باشد، درصورتیکه در کد برنامه، پیشبینیشده باشد، میتواند منجر به ایجاد وقفه match compare در تایمر کانتر صفر شود. همچنین، اگر مقدار وقفه match compare در تایمر کانتر صفر شود، میتواند در روتین وقفه، مقدار جدیدی ایجاد کند؛ بنابراین با واردشدن کلاک و رسیدن مقدار تایمر کانتر به نقطه موردنظر، مجدداً وقفهای ایجاد میشود؛ به همین ترتیب، از طریق تغییر مقدار OCR0، ممکن است چندین وقفه در طی یک مسیر از صفر به ۲۵۵ ایجاد شود.
اما در fast PWM چنین امکانی وجود ندارد؛ به این دلیل که تا زمانی که مقدار تایمر کانتر به صفر نرسد (حتی اگر مقدار OCR0 تغییر کند)، بحث آپدیت شدن OCR0 اعمال نخواهد شد؛ بنابراین از این روش میتوان برای ایجاد چند وقفه استفاده کرد.
در ادامه این مطلب درباره تایمر کانترهایی که بیش از چند رجیستر OCR دارند، صحبت میکنیم. (این رجیسترها ۱۶ بیتی هستند) بهطورکلی، هر چه تعداد این رجیسترها بیشتر باشد، این مزیت وجود دارد که از طریق یک تایمر کانتر بتوان به تعداد رجیسترهای OCR، زمانهای مستقل تولید کرد.
مثال
بهعنوانمثال، در تایمر کانتر 1 در ATMEGA32 می توان از طریق رجیسترهای OCR، دو زمان مستقل از هم که مضربی از هم نباشند و هیچ ارتباطی به هم نداشته باشند، تولید کرد.
ازآنجاییکه تایمر کانتر، یک تایمر کانتر واحد است، این امکان وجود دارد که با یک تایمر کانتر بهازای سه رجیستر، سه زمان مستقل از هم تولید کرد؛ یعنی عملاً با تایمر کانتر ۱ و تایمر کانتر ۳ در ATMEGA64 میتوان ۶ زمان مستقل از هم تولید کرد؛ این یک روش ابتکاری است که در جای خودش این موضوع را توضیح خواهیم داد.
شکل موج
یکی دیگر از مواردی که در اطلاعات اتمل شفاف توضیح داده نشده و ما باید آن را بررسی کنیم، بحث تولید شکل موج از طریق برابری مقدار تایمر کانتر با رجیسترهای OCR است؛ همانطور که در قسمت قبل گفته شد، فلگ مربوط به match compare و برابری تایمر کانتر با رجیستر مربوطه بعد از گذر از مقدار رجیستر کامپایل، یک خواهد شد؛ بهعنوانمثال، اگر مقدار OCR0 برابر با ۱۰۰ باشد و مقدار تایمر کانتر نیز به مقدار ۱۰۰ برسد، زمانی که مقدار تایمر کانتر از ۱۰۰ به ۱۰۱ تغییر میکند، آن فلگ یک خواهد شد.
اگر کلاک io تقسیم بر یکی از ضرایب یعنی 1، 8، 64، 256 و 1024 شود، در این حالت شکل موج ها به صورت منظم هستند و می توانیم شکل موج را به صورت یک خط صاف بکشیم.
اما با فرض ثابتبودن OCR0، OC0 یکشکل موج متناوب و منظم خواهد بود و در نهایت، شکل موجی با Duty Cycle (دیوتیسایکل) 50 درصد ایجاد خواهد شد.
فرکانس شکل موج
حالا سؤال بعدی این است که فرکانس این شکل موج چقدر است؟ به شکل زیر دقت کنید.
باتوجهبه اینکه 256 کلاک لازم است که یک سیکل طی شود؛ بین دو نقطه مشابه از این منحنی 256 کلاک باید طی شود تا دو نقطه مشابه تکرار شوند و برای هر سیکلی باید این شکل موج دو بار اتفاق بیوفتد.
بنابراین، فرکانس خروجی برابر خواهد بود با f clock io تقسیم بر N ضربدر 512 که این را می توان به صورت N ضربدر (2 ضربدر 256) هم نوشت که منظور این است که این سیکل حداکثر 256 کلاک نیاز دارد.
این فرکانس یک فرکانس ثابت است؛ یعنی دو بار باید سیکل 256 کلاک تکرار شود؛ به عبارت دیگر، اگر فرض کنیم که f clock io تقسیم بر N یک عدد ثابت باشد و یک بار تنظیم شود، این فرکانس یک فرکانس ثابت خواهد بود، پس شکل موج از طریق انتخاب گزینه تاگل در مد نرمال قابل تولید است که دارای یک فرکانس ثابت است.
البته در شرایطی که کلاک از ورودی T0 تامین شود، باید 512 کلاک وارد شود. این 512 کلاک می تواند منظم نباشد و فواصل زمانی متفاوتی داشته باشد؛ مثلا فرض کنید که ما یک سنسور متصل کردیم؛ به عنوان مثال، اگر سنسور 512 بار، لبهی بالا رونده یا لبهی پایین رونده ایجاد کند، در نهایت یک تکرار در شکل ایجاد خواهد شد؛ یعنی دو لبهی بالا رونده یا دو لبهی پایین رونده مشاهده خواهد شد؛ البته اگر پالس های ایجاد شده و منبع کلاک توسط T0 منظم نباشد، ممکن است مثلا زمان high طولانی تر باشد یا… .
تعداد کلاک
سؤال بعدی این است که: برای ایجاد این شکل موج، چند کلاک باید وارد شود؟ 512 کلاک باید وارد شود. همین مسئله در مد CTC نیز برقرار است، با این تفاوت که در آنجا مقدار OCR0 برابر است با حداکثر شکل موج؛ یعنی اگر بخواهیم به نقطهای برسیم که ضریب 256 در مد CTC برابر باشد با یک بهعلاوه OCR0، به این صورت است که در مد CTC شکل موج از مقدار صفر حرکت میکند و به OCR0 میرسد و به همین ترتیب. اگر از مد تاگل استفاده کنیم، در نقطهای که match compare اتفاق میافتد، شکل موج تغییر خواهد کرد.
فرمول فرکانس
باتوجهبه اینکه بین هر دونقطه مشابه در این منحنی یک بعلاوه OCR0 کلاک نیاز است؛ فرمول فرکانس برابر خواهد بود با f clock io تقسیم بر N در 2 در (1 بعلاوه OCR0). یک بعلاوه OCR0 کلاک برای طی یک سیکل لازم است؛ زیرا در هر سیکل یک بار شکل موج تاگل می شود و نات می شود.
f clock io تقسیم بر N به این دلیل است که فرکانس clock io ممکن است بر یکی از ضرایب N تقسیم شود. حالا اگر ما این منبع را بهجای f clock io تقسیم بر N از T0 تامین کنیم، در این صورت، فرکانسی که از T0 وارد می شود، تقسیم بر 2 در (1 بعلاوه OCR0)، تعداد کلاکی است که لازم است وارد شود تا یک تغییر کامل در این شکل موج مشاهده شود.
ممکن است شخصی که در برنامهنویسی مهارت کافی نداشته باشد و برای تولید یک فرکانس همواره، وقفههای مختلف ایجاد کند، یعنی یک وقفه ایجاد کند، پین را high کند، دوباره وقفه بعدی رو ایجاد کند و پین را low کند؛ اما این امکان بهصورت سختافزاری پیشبینیشده است که یکبار با تنظیم مقدار صحیح، فرکانس مربوطه بهصورت سختافزاری تولید شود؛ بنابراین CPU اشغال نمیشود و اگر لازم است فرکانس تغییر کند، مقدار فرکانس با تغییر مقدار OCR0 تغییر کند.
پس ما سعی میکنیم که از این امکانات سختافزاری تاحدامکان استفاده کنیم و بار پردازشی را بیجهت به CPU تحمیل نکنیم؛ یعنی از طریق قراردادن مقدار این دو بیت در مد تاگل و استفاده از دو بیت مربوطه برای قراردادن تایمر صفر در مد CTC و محاسبه اینکه چه مقداری باید در OCR0 قرار گیرد تا آن فرکانس موردنظر تأمین شود، این کار را انجام دهیم.
یکبار که این مقادیر، مقداردهی صحیح شدند، فرکانس شروع به تولیدشدن روی پین مربوطه میکنند و نیازی نیست که برای هر high و low شدنی، یک وقفه ایجاد شود و توسط خطوط نرمافزار این کار انجام شود؛ بنابراین، اگر قرار باشد، تولید فرکانس متغیر توسط تایمر کانتر صفر انجام شود، مد CTC، مد بسیار مناسبی برای این کار است.
نکته
گاهی لازم است بعد از واردشدن تعداد مشخصی کلاک (کلاک میتواند توسط کلاک io یا تقسیمشدههای آن یا توسط پالسی که از بیرون وارد میشود، تأمین شود) بعد از اینکه یک تعداد مشخصی کلاک وارد شد و شرایط match compare اتفاق افتاد، گاهی لازم است که با حداکثر سرعت و حداقل زمان و بدون اینکه نیاز باشد که از کدهای نوشته شده خطوطی اجرا شود، پین OC0، high و low شود که در این شرایط میتوانیم بسته به اینکه لازم باشد آن پین low یا high شود، یکی از این دو مد را برنامهریزی کنیم؛ بنابراین این عملیات بهصورت سختافزاری انجام میشود.
در قسمت سیزدهم آموزش میکروکنترلر AVR، به ادامه بررسی تایمر 0 در ATMEGA32، خواهیم پرداخت. با سیسوگ همراه باشید.
سری مقالات آموزش میکروکنترلر AVR توسط آقای مهندس کینژاد تهیه شده است.