مقدمه
یکی از مهمترین واحدهای میکروکنترلر واحد تایمر/کانتر می باشد که در اکثر پروژه های مهم وجود آن ضروری است. این واحد از نظر سخت افزاری متشکل از یک شمارنده اصلی و چندین رجیستر برای تنظیمات می باشد به طوری که با اعمال تنظیمات متفاوت چندین کاربرد مختلف از این سخت افزار خاص می شود. از مهمترین کاربردهای این سخت افزار میتوان به تایمر ( زمان سنج ) ، کانتر ( شمارنده ) ، Real Time Clock ( زمان سنج حقیقی ) و PWM ( مدولاسیون عرض پالس ) اشاره کرد. در این فصل ابتدا به تشریح مفاهیم مربوطه می پردازیم و سپس مشابه بخش های قبلی به تشریح سخت افزاری و آموزش کدویزارد به همراه پروژه مربوطه خواهیم پرداخت .
رجیستر چیست ؟
رجیستر ها نوعی از حافظه های موقت هستند که معمولا ۸ بیتی ، ۱۶ بیتی ، ۳۲ بیتی یا ۶۴ بیتی هستند . بدین معنی که توانایی ذخیره کردن همان تعداد بیت را دارند . در میکروکنترلرهای AVR همه رجیستر ها ۸ بیتی هستند یعنی یک بایت را ذخیره می کنند . هر رجیستر به جز ورودی و خروجی دارای سیگنال کلاک و ریست نیز می باشد که به محض آمدن لبه سیگنال کلاک ورودی به خروجی منتقل می شود یا به عبارت دیگر ورودی تنها در زمان آمدن لبه سیگنال کلاک ذخیره می شود . شکل زیر یک رجیستر ۸ بیتی را نشان می دهد . در صورتی که ریست فعال شود تمام ۸ بیت در خروجی ۰ می گردد و در صورتی که ریست غیر فعال بوده باشد و لبه سیگنال کلاک بیاید ، ۸ بیت ورودی عینا در رجیستر ذخیره شده و سپس به خروجی می رود .
کانتر یا شمارنده چیست ؟
شمارنده ها نیز نوعی حافظه هستند که می توانند هر تعداد بیت دلخواه پهنا داشته باشند . وظیفه شمارنده ، شمردن تعداد پالس های سیگنال ورودی کلاک است . بنابراین یک شمارنده از یک ورودی کلاک و یک ورودی ریست و تعدادی خروجی ( n تا ) تشکیل شده است . خروجی شمارنده با آمدن سیگنال کلاک ورودی یک واحد افزایش پیدا می کند . بنابراین هنگامی که ریست فعال باشد تمام خروجی ها ۰ می شود سپس با آمدن هر پالس کلاک یک واحد به مقدار خروجی اضافه می شود ، تا اینکه نهایتا خروجی به مقدار (۲n-1) برسد . شکل زیر یک شمارنده ۸ بیتی را نشان می دهد . خروجی این شمارنده تعداد پالس های کلاک ورودی را از ۰ تا ۲۵۵ می شمارد . یعنی با آمدن اولین پالس کلاک ، خروجی ۰۰۰۰۰۰۰۱ ، دومین پالس کلاک خروجی ۰۰۰۰۰۰۱۰ ، سومین پالس کلاک ۰۰۰۰۰۰۱۱ و … تا اینکه در نهایت خروجی با آمدن ۲۵۶ پالس کلاک به ۱۱۱۱۱۱۱۱ می رسد و با آمدن کلاک بعدی دوباره همه خروجی ها ۰ می شود ….
واحد تایمر/کانتر چیست ؟
بخش اصلی یک واحد تایمر/کانتر یک شمارنده ( counter ) می باشد که در بالا توضیحات آن داده شد . در کنار این شمارنده تعدادی رجیستر جهت تنظیمات واحد و چندی مدارات منطقی دیگر وجود دارد . رجیستر های تنظیمات واحد ، عملکرد این واحد را مشخص می کند مثلا مشخص می کند که کلاک ورودی از چه منبعی باشد ، یا حالت کار واحد در حالت تایمری باشد یا کانتری و …
مفهوم تایمر : تایمر یا زمان سنج می تواند حسی از زمان را بوجود آورد مثلا هر n میکروثانیه یکبار عملی انجام شود .
مفهم کانتر : کانتر یا شمارنده می تواند تعداد دفعات وقوع یک رخداد را بشمارد مثلا تعداد افرادی که از یک گیت رد می شود .
تفاوت اصلی در مفهوم تایمر با کانتر : همانطور که از تعاریف فوق مشخص است در تایمر نظم و ترتیب وجود دارد یعنی بعد از گذشت مدتی میتوان حدس زد چند بار آن عمل مورد نظر انجام شده اما در کانتر لزوما اینطور نیست و ممکن است هر تعدادی رخداد در یک بازه زمانی بوجود آید .
نتیجه : در صورتی که به شمارنده ( Counter ) پالس کلاکی متناوب با دوره تناوب ثابت اعمال کنیم ، به دلیل اینکه زمان اضافه شدن به مقدار شمارنده را می دانیم ، تایمر بوجود می آید و در صورتی که پالس کلاک به صورت نامتناوب و غیر منظم باشد ، کانتر بوجود می آید .
مهمترین ویژگی های یک واحد تایمر/کانتر در میکروکنترلرهای AVR
مهمترین مسائلی که در هنگام کار با واحد تایمر/کانتر بوجود می آید به شرح زیر می باشد :
- طول شمارنده واحد : تعداد بیت های شمارنده(کانتر) که میتواند ۸ ، ۱۶ ، ۳۲ و … باشد. در میکروکنترلرهای AVR تنها طول ۸ بیتی و ۱۶ بیتی وجود دارد .
- رجیسترهای تنظیمات واحد : همواره تعدادی رجیستر در کنار واحد به منظور انجام تنظیمات وجود دارد که بسته به ساده یا پیچیده بودن تعداد آنها کم یا زیاد می شود .
- مد ( mode ) یا حالت کار واحد : برای این واحد دو حالت کار متفاوت وجود دارد . حالت کار تایمری و حالت کار کانتری .
- تنظیمات کلاک ورودی واحد : در حالت تایمری کلاک ورودی تقسیمی از کلاک اصلی می باشد و از داخل میکروکنترلر به واحد وارد می شود اما در حالت کانتری کلاک واحد از طریق پایه مربوطه ( پایه های Tx ) و از خارج میکروکنترلر به واحد اعمال می شود.
- مشخص کردن رخداد در حالت کانتری : زمانی که واحد در حالت کانتری کار میکند باید نوع رخدادی که میخواهیم شمرده شود را تنظیم نماییم . این رخداد یکی از انواع رخدادها در سیگنال ورودی به شرح زیر است :
- لبه بالارونده ( Rising Edge )
- لبه پایین رونده ( Falling Edge )
- پالس مثبت ( Positive Pulse )
- پالس منفی ( Negative Pulse )
در شکل زیر انواع رخداد های فوق که در یک نمونه سیگنال مشخص شده است را مشاهده می کنید .
- مشخص کردن حالت کار واحد تایمر/کانتر : زمانی که واحد در حالت تایمری کار می کند میتوان از آن در حالت های مختلف زیر استفاده کرد :
- حالت ساده(عادی)
- حالت مقایسه ( CTC )
- حالت PWM سریع ( تک شیب )
- حالت PWM تصحیح فاز ( دو شیب )
- حالت PWM تصحیح فاز و فرکانس
تذکر : نحوه عملکرد دقیق واحد تایمر/کانتر در حالت های فوق ، در بخش مربوط به هر یک تشریح خواهد شد .
- فعال یا غیر فعال بودن خروجی : هر یک از واحدهای تایمر/کانتر ، حداکثر سه خروجی دارد که هر کدام از خروجی ها به یکی از پایه های میکروکنترلر متصل می شود . پایه هایی که مربوط به واحد تایمر/کانتر هستند در میکروکنترلرهای AVR با نام OCx مشخص می شوند که در آن x یک عدد بین ۰ تا ۴ است . در صورت فعال بودن خروجی واحد ، پایه مربوطه از حالت I/O معمولی ( واحد ورودی/خروجی ) خارج می شود و به خروجی واحد تایمر/کانتر متصل می گردد .
انواع واحد تایمر/کانتر در میکروکنترلرهای AVR
بسته به پیچیدگی تنظیمات مورد نیاز آن واحد ، در میکروکنترلر های AVR دو نوع تایمر/کانتر ساده و پیشرفته در ابعاد ۸ و ۱۶ بیتی وجود دارد . شکل زیر انواع این واحد را به همراه میکروکنترلر AVR مورد نظر نشان می دهد . لازم به تذکر است که هر میکروکنترلر AVR حداقل یک و حداکثر پنج واحد تایمر/کانتر دارد که هر کدام از آنها میتواند یکی از ۴ حالت زیر باشد .
تذکر : هر میکروکنترلر AVR دارای تعدادی واحد تایمر/کانتر می باشد ( حداقل ۱ تا حداکثر ۵ واحد ) که به ترتیب از شماره ۰ نامگذاری می شود . هر یک از این واحد ها به خودی خود میتواند ساده ، پیشرفته ، ۸ بیتی یا ۱۶ بیتی باشد .
مثال : میکروکنترلر Atmega8 دارای ۳ واحد تایمر/کانتر می باشد . تایمر/کانتر شماره ۰ به صورت ساده ۸ بیتی ، تایمر/کانتر شماره ۱ به صورت پیشرفته ۱۶ بیتی و تایمر/کانتر شماره ۲ به صورت پیشرفته ۸ بیتی می باشد . پایه های خروجی مربوط به هریک از واحدهای تایمر/کانتر را در شکل زیر مشاهده می کنید .
نکته : همانطور که در شکل فوق نیز مشاهده می کنید ، در تایمر/کانتر های ساده ۸ بیتی پایه خروجی وجود ندارد ، در تایمر/کانترهای پیشرفته ۸ بیتی ۱ خروجی و در تایمر/کانترهای پیشرفته ۱۶ بیتی ، دو خروجی و در برخی میکروکنترلرها سه خروجی وجود دارد .
نکته : همانطور که در شکل فوق نیز مشاهده می کنید ، کلیه ورودی های واحدهای تایمر/کانتر ، کلاک حالت کار کانتری می باشند که در حالت کار تایمری بدون استفاده است . ضمنا ورودی کلاک تایمر/کانتر سوم ( پایه های TOSC1 و TOSC2 ) تنها میتواند برای RTC ( زمان سنج حقیقی ) استفاده شود.
معرفی اجمالی رجیستر های واحدهای تایمر/کانتر ۸ بیتی
این رجیسترها که نام آنها در همه واحد های تایمر/کانتر اعم از ساده ، پیشرفته ، ۸ بیتی یا ۱۶ بیتی یکسان هستند و به طور اتوماتیک توسط کدویزارد مقدار دهی می شوند ، به شرح زیر می باشد :
رجیستر کنترل تایمر/کانتر ( TCCRX ) :
این رجیستر که مخفف Timer Counter Control Register است ، وظیفه کنترل کلیه تنظیمات واحد تایمر کانتر را بر عهده دارد . این تنظیمات که در کد ویزارد نیز انجام می شود ، به شرح زیر است :
- فعال یا غیر فعال بودن واحد
- مشخص کردن حالت کار تایمری یا کانتری ( منبع کلاک )
- تنظیم عدد تقسیم کلاک ورودی واحد در حالت تایمری
- مشخص کردن نوع رخداد در حالت کانتری
- تنظیم حالت های مختلف کاری واحد ( PWM ، CTC و … )
- فعال یا غیر فعال کردن خروجی واحد ( پایه های OCX )
رجیستر تایمر/کانتر ( TCNTX ) :
این رجیستر ۸ بیتی ، مقدار شمارنده در هر لحظه را به صورت اتوماتیک در خود ذخیره می کند . این رجیستر امکان دسترسی مستقیم برای خواندن و نوشتن در شمارنده را فراهم می کند. به طوری که این رجیستر هنگام خواندن مقدار شمارش شده رو برمیگرداند و به هنگام نوشتن مقدار جدید را به شمارنده انتقال می دهد.
رجیستر مقایسه خروجی ( OCRX ) :
این رجیستر هشت بیتی خواندنی و نوشتنی بوده و به طور مستقیم با مقدار شمارنده TCNT مقایسه می شود. از تطابق این دو برای تولید وقفه خروجی یا تولید یک شکل موج روی پایه OCX می توان استفاده نمود.
رجیستر پوشش وقفه تایمر/کانتر ( TIMSK ) :
این رجیستر برای تنظیمات وقفه در هنگام سر ریز شدن تایمر/کانتر یا در هنگام تطبیق مقایسه ( Compare Match ) مورد استفاده قرار می گیرد .
رجیستر پرچم سر ریز تایمر/کانتر ( TIFR ) :
که در این رجیستر بیت TOV0 زمانی یک می شود که یک سر ریز در تایمر یا کانتر صفر رخ داده باشد و بیت های دیگر … که همه توسط کدویزارد تنظیم می شوند.
معرفی و تشریح تایمر/کانتر ساده ۸ بیتی
همانطور که در شکل فوق مشاهده می کنید ، شمارنده دارای ۸ بیت ورودی می باشد که به کمک آن میتوان عدد دلخواه را در هر لحظه در طول برنامه روی شمارنده ( رجیستر TCCNT ) بارگذاری نمود . همچنین خروجی شمارنده نیز ۸ بیت می باشد که با آمدن هر یک رخداد ، یک واحد به آن اضافه می گردد تا اینکه مقدار شمارنده به حداکثر مقدار خود یعنی ۲۵۵ برسد . بعد از اینکه مقدار شمارنده به ۲۵۵ رسید با آمدن رخداد بعدی ، بیت سر ریز ۱ می شود و همزمان مقدار شمارنده نیز ریست می گردد یعنی همه خروجی ها ۰ می شود .
در کنار شمارنده ، واحد کنترل و تقسیم فرکانس وجود دارد . این واحد وظیفه کنترل منبع کلاک ورودی را دارد که در حالت تایمری ، کلاک داخلی انتخاب می شود و در حالت کانتری نیز کلاک خارجی انتخاب می شود . همچنین در این واحد در صورت انتخاب کلاک داخلی میتوان تقسیمی از آن را به عنوان کلاک شمارنده انتخاب و به شمارنده داد که به آن پیش تقسیم کننده ( Prescaler ) گویند به طوری که توسط این واحد یکی از Cclk ، Cclk/8 ، Cclk/64 ، Cclk/256 و Cclk/1024 را میتوان انتخاب نمود .
نکته : در حالت استفاده از کلاک خارجی ( کانتر ) باید توجه داشت که حداقل زمان بین دو رخداد Cclk می باشد ( Cclk همان فرکانس کاری میکروکنترلر می باشد )
محاسبه زمانبندی سر ریز شدن تایمر در حالت ساده
فرض کنید که از واحد تایمر/کانتر در حالت تایمری استفاده می کنیم . در این صورت مدت زمان یک شمارش یعنی زمانی که طول می کشد تا یک واحد به مقدار رجیستر TCNT اضافه شود از رابطه زیر بدست می آید که در آن N ضریب پیش تقسیم کننده و Fclk فرکانس کاری میکروکنترلر می باشد .
چون برای سر ریز شدن تایمر نیاز است تا تمامی ۸ بیت شمارنده ، شمارش شود بنابراین ۲۵۶ کلاک مورد نیاز است . در نتیجه مدت زمانی که طول می کشد تا تایمر از ۰ تا ۲۵۵ رفته و پرچم سر ریز فعال شود برابر است با :
اگر شمارش از صفر آغاز نشده باشد یعنی در ابتدای برنامه به رجیستر TCNT مقداری داده باشیم ، زمانی کمتر از زمان فوق طول می کشد تا پرچم سر ریز فعال شود که این زمان برابر است با :
که در آن TCNTx مقدار اولیه رجیستر TCNT در هنگام شروع به کار واحد تایمر/کانتر می باشد.
معرفی و تشریح تایمر/کانتر پیشرفته ۸ بیتی
همانطور که در شکل فوق مشاهده می کنید ، در حالت پیشرفته واحد مقایسه ، واحد تولید شکل موج و رجیستر ایجاد شده و نیز خود شمارنده و واحد کنترل آن پیچیدگی و قابلیت های بیشتری نسبت به حالت ساده دارد . در این واحد خروجی شمارنده توسط واحد مقایسه کننده با رجیستر هشت بیتی OCR مقایسه می شود . هرگاه این دو مقدار با هم منطبق شود ( Match ) ، مقایسه کننده پرچم OCF را فعال کرده و وارد واحد تولید شکل موج می گردد .
در تایمر کانترهای ۸ بیتی در حالت پیشرفته علاوه بر حالت عادی تایمری/کانتری که همانند ۸ بیتی ساده است ، حالت های دیگر نیز وجود دارد . به طور کلی عملکرد تایمر/کانتر ۸ بیتی پیشرفته می تواند در یکی از حالت های ( Mode ) زیر باشد :
- تایمر/کانتر در حالت ساده( Normal )
- تایمر/کانتر در حالت مقایسه ( CTC )
- تایمر/کانتر در حالت PWM سریع ( Fast PWM )
- تایمر/کانتر در حالت PWM تصحیح فاز ( Phase Correct PWM )
واحد تولید شکل موج وظیفه چگونگی اتصال یا عدم اتصال خروجی واحد مقایسه به پایه OCx میکروکنترلر را دارد و در صورتی که واحد تایمر/کانتر در حالت ساده یا حالت CTC باشد برای آن چهار حالت عملکرد زیر قابل تنظیم می باشد :
- پایه OC غیر فعال است . ( Disconnected )
- پایه OC در هر بار تطبیق تغییر وضعیت دهد یعنی اگر ۰ بود ۱ شود و بالعکس. ( Toggle )
- پایه OC در هر بار تطبیق ۰ شود . ( Clear )
- پایه OC در هر بار تطبیق ۱ شود . ( Set )
و در صورتی که واحد تایمر/کانتر در حالت PWM باشد ( حالت ۳ یا ۴ ) برای آن سه عملکرد زیر قابل تنظیم می باشد :
- پایه OC غیر فعال است . ( Disconnected )
- پایه OC در حالت PWM رابطه عکس با رجیستر OCR دارد ( Inverted )
- |ایه OC در حالت PWM رابطه مستقیم با رجیستر OCR دارد ( Non-Inverted )
بررسی تایمر/کانتر ۸ بیتی پیشرفته در حالت ساده ( Normal )
عملکرد واحد در این حالت همان عملکرد حالت ۸ بیتی ساده می باشد که تشریح شد . همانطور که در شکل زیر نیز نشان داده شده است ، در این حالت شمارش از ۰ تا ۲۵۵ می باشد و بعد از سر ریز شدن به ۰ بر می گردد . ویژگی که در حالت ۸ بیتی پیشرفته بوجود آمده ، آن است که در صورت فعال بودن پایه خروجی میتوان شکل موج زیر را در حالت Toggle روی پایه OCX ایجاد کرد .
فرکانس شکل موجی که در حالت عادی روی پایه OC ایجاد می شود ، همیشه ثابت بوده و از رابطه زیر بدست می آید :
که در آن N ضریب پیش تقسیم کننده و Fclk فرکانس کاری میکرو و TCNTx مقدار اولیه رجیستر TCNT در لحظه شروع به کار تایمر است .
بررسی تایمر/کانتر ۸ بیتی پیشرفته در حالت مقایسه ( CTC )
در این حالت مقدار شمارش شده در شمارنده با هر بار آمدن کلاک علاوه بر اضافه شدن با مقدار OCR مقایسه می شود و در صورت برابر شدن این دو مقدار شمارنده ریست می شود . در حالت نرمال وقتی شمارنده به مقدار حداکثر خود یعنی ۲۵۵ میرسید ، ریست میشد اما در این حالت به محض رسیدن به مقدار OCR که خود مقداری بین ۰ تا ۲۵۵ میتواند باشد ، ریست می شود . شکل زیر عملکرد واحد را در این حالت نشان می دهد .
از این حالت میتوان برای تولید شکل موج با فرکانس متغیر روی پایه خروجی ( OC pin ) استفاده نمود به طوری که با تغییر رجیستر OCR در طول برنامه فرکانس پایه OC خروجی طبق رابطه زیر تغییر می کند . در این رابطه N ضریب تقسیم فرکانس کلاک کاری میکرو ( Fclk ) است که درون واحد تایمر/کانتر تنظیم می شود و OCRx مقدار رجیستر OCR در واحد تایمر/کانتر شماره x است .
PWM چیست ؟
مخفف عبارت Pulse Width Modulation به معنای “مدولاسیون عرض پالس” می باشد . کاربرد PWM در میکروکنترلر ها برای مصارف مختلفی مانند کنترل شدت نور LED ها ، کنترل سرعت انواع موتور های DC ، انتقال پیام ، مبدل های ولتاژ و … است . در واقع با استفاده از این تکنیک میتوان موجی با فرکانس ثابت اما عرض پالس های متفاوت بوجود آورد . عرض پالس را دیوتی سایکل ( Duty Cycle ) نیز می گویند . دیوتی سایکل مدت زمان ۱ بودن به مدت زمان کل پریود در هر سیکل موج است که معمولا بر حسب درصد ( % ) نمایش داده می شود. به فرض مثال اگر Duty Cycle یک موج PWM برابر با ۴۰% باشد بدان معنی است که در هر سیکل ۴۰% ولتاژ برابر VCC و در ۶۰% اوقات ولتاژ برابر ۰ است. همانگونه که می دانید در چنین حالتی ولتاژ موثر یا Vrms برابر با ۴۰% VCC خواهد بود. به فرض مثال شما اگر با یک میکرو با تغذیه ۵V ، موج PWM با دیوتی سایکل ۵۰% ایجاد نمایید ولتاژ RMS شما برابر ۵۰% VCC یا به عبارتی ۲٫۵ ولت خواهد بود. در شکل زیر تعدادی موج PWM با فرکانس ثابت و دیوتی سایکل متفاوت نمایش داده شده است.
تذکر : با استفاده از ویژگی PWM در میکروکنترلرهای AVR میتوان انواع موتورهای DC را به پایه OC متصل کرده و سرعت آنها را از طریق تغییر توان کنترل کرد به طوری که هر چه Duty Cycle بیشتر باشد ، موتور سریعتر و هرچه کمتر باشد موتور کندتر می چرخد . در دیوتی سایکل ۱۰۰ درصد بیشترین توان به موتور اعمال می شود .
تولید PWM به روش نرم افزاری و بدون استفاده از واحد تایمر
برای تولید موج PWM در روش نرم افزاری ، نیاز به تولید یک موج با فرکانس ثابت و دیوتی سایکل متغیر داریم . فرض می کنیم فرکانس مطلوب f باشد در این صورت زمان هر پریود ۱/f می شود . میخواهیم برنامه ای بنویسیم که فرکانس دلخواه و دیوتی سایکل را بر حسب درصد داشته باشد و شکل موج مورد نظر را برای مثال روی پایه PA.0 ایجاد کند . بنابراین برنامه به صورت زیر می باشد :
1 2 3 4 5 6 7 8 9 10 11 12 |
... unsigned int f=1000; //PWM Frequency unsigned int T=1/f; //PWM Period unsigned int DutyCycle=60; //Percent Of DutyCycle ... while(1) { PORTA.0=0; delay_ms((1-DutyCycle/100)*T); PORTA.0=1; delay_ms(DutyCycle/100*T); } |
توضیح برنامه : در ابتدا فرکانس ، پریود و دیوتی سایکل مورد نیاز برای PWM را تعریف می کنیم . برنامه درون حلقه نامتناهی دائما اجرا می شود و نتیجه آن تولید شکل موجی مربعی با فرکانس تقریبا ۱ کیلوهرتز ( زیرا مجموع تاخیرهای موجود در برنامه به اندازه T است ) و دیوتی سایکل تقریبا ۶۰ درصد است .
نکته : تولید PWM به روش فوق دقیق نبوده و به علت اینکه CPU میکروکنترلر برای تولید موج PWM درگیر می شود کاربرد چندانی ندارد اما برای تولید دقیق موج PWM از سخت افزار مجزا از CPU به نام واحد تایمر/کانتر در حالت PWM میتوان استفاده کرد .
بررسی تایمر/کانتر ۸ بیتی پیشرفته در حالت PWM سریع ( Fast PWM )
در این حالت عملکرد واحد تایمر/کانتر مانند حالت مقایسه است با این تفاوت که در زمان تطابق میان OCR و TCNT مقدار شمارنده ریست نمی شود بلکه تا مقدار ماکزیمم خود یعنی ۲۵۵ ادامه میابد و بعد از سر ریز شدن صفر می گردد . همچنین هنگام ۰ شدن مقدار شمارنده پایه OC نیز صفر می شود . در حالت PWM پایه OC در دو حالت تغییر وضعیت می دهد یکی در زمان تطبیق OCR و TCNT و دیگری در زمان سر ریز شدن TCNT در حال که در حالت CTC پایه خروجی تنها در زمان تطابق تغییر می کرد . این عملکرد باعث می شود که موج خروجی دارای فرکانس ثابت باشد و عرض پالس ( Duty Cycle ) توسط رجیستر OCR کنترل می شود به طوری که هر چقدر مقدار OCR بیشتر باشد عرض پالس کاهش می یابد و بالعکس .
در این حالت فرکانس پایه خروجی ثابت است و دیوتی سایکل بین ۰ تا ۱۰۰ درصد تغییر می کند . فرکانس خروجی از رابطه زیر بدست می آید که در آن N ضریب پیش تقسیم کننده و Fclk فرکانس کاری میکروکنترلر است .
نکته مهم : در حالت PWM پایه خروجی میتواند قطع ( Disconnect ) یا به صورت معکوس ( Inverted ) ویا به صورت غیر معکوس ( Non-Inverted ) باشد . شکل موج خروجی در حالت معکوس با شکل موج خروجی حالت غیر معکوس Not یکدیگر هستند به طوری که مثلا اگر دیوتی سایکل در حالت معکوس ۸۰ درصد باشد ، دیوتی سایکل در حالت غیر معکوس ۲۰ درصد است . شکل زیر علاوه بر نشان دادن عملکرد حالت PWM این موضوع را نیز نشان می دهد .
بررسی تایمر/کانتر ۸ بیتی پیشرفته در حالت PWM تصحیح فاز ( Phase Correct PWM )
در این حالت موج PWM تولید شده دارای دقت بالاتری نسبت به حالت قبل است چرا که شیفت فاز ناخواسته که در حالت PWM سریع ممکن است رخ دهد ، در این حالت اصلاح شده است . از این حالت برای کارهای با دقت بیشتر ( مثلا راه اندازی سروو موتور یا ارسال دیتای مخابراتی ) مورد استفاده قرار می گیرد . تنها تفاوت این حالت با حالت قبل این است که شمارش ابتدا در جهت افزایشی و سپس در جهت کاهشی است . بنابراین ابتدا شمارنده از ۰ تا ۲۵۵ و سپس از ۲۵۵ تا ۰ می شمارد و فقط در هربار تطابق با OCR ، خروجی تغییر وضعیت می دهد .
نکته : تولید PWM به روش تصحیح فاز دارای فرکانس خروجی پایین تری نسبت به حالت سریع آن است و طبق رابطه زیر محاسبه می شود که در آن N ضریب پیش تقسیم کننده و Fclk فرکانس کاری میکرو است .
معرفی اجمالی رجیسترهای تایمر/کانترهای ۱۶ بیتی
در تایمر/کانترهای ۱۶ بیتی ، شمارنده اصلی تایمر/کانتر رجیستر TCNTx می باشد . این رجیستر یک رجیستر ۱۶ بیتی است که از دو رجیستر ۸ بیتی با نامهای TCNTXL و TCNTXH تشکیل شده است و به صورت خواندنی و نوشتنی قابل دسترسی است .
رجیستر های مقایسه خروجی تایمر/کانتر در تایمر/کانترهای ۱۶ بیتی به جای یک رجیستر ۸ بیتی ، از ۳ رجیستر ۱۶ بیتی با نامهای OCRxA ، OCRxB و OCRxC تشکیل شده است . این رجیسترها که به صورت خواندنی و نوشتنی هستند هر یک واحد مقایسه مجزایی دارند که خروجی آنها به واحد تولید شکل موج و نهایتا به یکی از پایه های میکروکنترولر به نامهای OCXA ، OCXB و OCXC متصل می شود .
نکته : رجیستر OCRXC فقط در برخی از میکروکنترلرهای AVR که دارای چهار یا پنج واحد تایمر/کانتر هستند نظیر Atmega128 و … وجود دارند . ( استثنا : Atmega162 که با وجود ۴ تایمر/کانتر این رجیستر را ندارد )
در تایمر/کانترهای ۱۶ بیتی به جای یک رجیستر تنظیمات سه رجیستر ۸ بیتی به نام های TCCRXA ، TCCRXB و TCCRXC وجود دارد . این سه رجیستر کلیه اعمال واحد تایمر/کانتر را نظیر حالت عملکرد ، ضریب پیش تقسیم کننده ، نحوه اتصال خروجی و … کنترل می کند .
رجیستر های TIFR و TIMSK در اینجا نیز به همان صورت و برای همان کاربردهای ذخیره پرچم ( Flag ) و پوشش وقفه وجود دارند .
رجیستر ۱۶ بیتی دیگری به نام ICxR مربوط به واحد تسخیر نیز وجود دارد که در زمان رخ دادن تسخیر محتوای رجیستر TCNTx به این رجیستر منتقل می شود.
تذکر : به علت اینکه از تایمر/کانتر ۱۶ بیتی ساده تنها در دو میکروکنترلر AtTiny13 و AtTiny2313 استفاده شده است از بیان آن اجتناب می کنیم زیرا با توضیح و بررسی تایمر/کانتر ۱۶ بیتی پیشرفته ، نوع ساده در این دو میکروکنترلر نیز پوشش داده می شود .
معرفی و تشریح تایمر/کانتر پیشرفته ۱۶ بیتی
تایمر/کانتر ۱۶ بیتی ساختاری همانند تایمر/کانتر ۸ بیتی پیشرفته دارد با این تفاوت که علاوه بر ۱۶ بیتی شدن پهنای شمارنده اصلی ، تنظیمات و کنترل های بیشتر و پیچیده تری در واحد تایمر/کانتر وجود دارد به طوری که به جای یک رجیستر مقایسه ، سه رجیستر مقایسه و در برخی میکروها دو رجیستر مقایسه وجود دارد . همچنین به تعداد این رجیستر های مقایسه ، واحد مقایسه و واحد تولید شکل موج نیز وجود دارد . و همچنین یک واحد دیگر به نام واحد تسخیر به آن اضافه شده است . واحد تسخیر میتواند در زمان رخداد خارجی روی پایه ICPx ( در برخی میکروکنترلرهای ICx ) محتوای رجیستر ۱۶ بیتی TCNTx را در رجیستر ۱۶ بیتی ICRx ذخیره کرده و وقفه تسخیر را نیز فعال نماید. بدین ترتیب واحد تسخیر میتواند رخدادهای خارجی را تسخیر کرده و به آن یک عملکرد خاص نسبت دهد .
به طور کلی عملکرد تایمر/کانتر ۱۶ بیتی پیشرفته در یکی از حالت های زیر می باشد :
- تایمر/کانتر در حالت ساده( Normal )
- تایمر/کانتر در حالت مقایسه ( CTC )
- تایمر/کانتر در حالت PWM سریع ( Fast PWM )
- تایمر/کانتر در حالت PWM تصحیح فاز ( Phase Correct PWM )
- تایمر/کانتر در حالت PWM تصحیح فاز و فرکانس ( Phase & Frequency Correct PWM )
نکته : واحد تایمر/کانتر پیشرفته ۱۶ بیتی در صورت وجود در هر یک از میکروکنترلرهای AVR معمولا تایمر/کانتر شماره ۱ یا شماره ۳ است .
نکته : اکثر میکروکنترلرهای AVR حداکثر ۳ واحد تایمر/کانتر دارند و فقط میکروکنترلرهای Atmega64 ، Atmega128 ، Atmega162 ، Atmega2560 ، Atmega2561 ، Atmega640 ، Atmega1280 و Atmega1281 هستند که دارای تایمر چهارم و پنجم نیز می باشند .
نکته : اگر فیوز بیت M161C در میکروکنترلر Atmega162 که برای تطابق میکروکنترلر Atmega162 با Atmega161 تعبیه شده است ، فعال باشد ، تایمر/کانتر شماره ۳ در دسترس نبوده و غیر فعال می شود .
نکته : اگر فیوز بیت M103C در میکروکنترلرهای Atmega128 و Atmega64 که برای تطابق میکروکنترلرهای Atmega64 و Atmega128 با Atmega103 تعبیه شده است ، فعال باشد ، تایمر/کانتر شماره ۳ و نیز رجیستر OCR3C در دسترس نبوده و غیر فعال می شود .
تایمر/کانتر ۱۶ بیتی پیشرفته در حالت ساده( Normal )
ساده ترین حالت عملکرد این واحد می باشد که در این حالت شمارش رو به بالا بوده و مقدار رجیستر TCNTx از ( ۰۰۰۰Hex ) تا ( FFFF Hex ) می باشد و بعد از سر ریز شدن به ۰ بر می گردد . در هنگام شمارش رجیستر TCNTx دائما با رجیسترهای ( OCRxA ، OCRxB ، OCRxC ) مقایسه شده و در صورت برابر شدن هر یک از آنها بیت تطابق مربوطه ( OCFxA ، OCFxB ، OCFxC ) روشن شده و خروجی مربوط به آن با توجه به تنظیمات واحد تولید شکل موج روی پایه های مربوطه ( OCxA ، OCxB ، OCxC ) ظاهر می شود .
فرکانس شکل موجی که در حالت عادی روی پایه OCx ایجاد می شود ، همیشه ثابت بوده و از رابطه زیر بدست می آید :
که در آن N ضریب پیش تقسیم کننده و Fclk فرکانس کاری میکرو و TCNTx مقدار اولیه رجیستر TCNTx در لحظه شروع به کار تایمر است .
تایمر/کانتر ۱۶ بیتی پیشرفته در حالت مقایسه ( CTC )
در حالت مقایسه رجیستر TCNTx به طور دائم با رجیستر OCRxA یا ICRx مقایسه می شود و در صورت برابری ، رجیستر TCNTx برابر صفر می شود . شکل زیر نحوه عملکرد تایمر/کانتر در این حالت را نشان می دهد .
با تغییر هر یک از رجیستر های OCRxA,B,C میتوان فرکانس های مختلفی روی پایه های OCxA,B,C ایجاد کرد که فرکانس هر یک از رابطه زیر بدست می آید :
برای پایه های OCnB و OCnC نیز چنین فرمولی صادق است که در آن N ضریب پیش تقسیم کننده و Fclk فرکانس کاری میکرو است .
تایمر/کانتر ۱۶ بیتی پیشرفته در حالت PWM سریع ( Fast PWM )
در این حالت تولید شکل موج PWM با فرکانس بالا قابل انجام است . این حالت خود حداکثر دارای پنج مد عملکرد زیر است :
- PWM سریع هشت بیت ( با حداکثر مقدار FF )
- PWM سریع نه بیت ( با حداکثر مقدار ۱FF )
- PWM سریع ده بیت ( با حداکثر مقدار ۳FF )
- PWM سریع با حداکثر مقدار رجیستر ICRx
- PWM سریع با حداکثر مقدار رجیستر OCRxA
در این حالت تایمر تا زمانی که مقدارش مطابق تنظیمات فوق یکی از مقادیر FF ، ۱FF ، ۳FF ، مقدار درون رجیستر ICRx و یا مقدار درون رجیستر OCRxA شود ، به صورت افزایشی ادامه می یابد سپس پرچم سر ریز فعال شده و تایمر ریست می شود . در زمان سر ریز تایمر و نیز زمان تطابق آن با رجیستر OCRxA,B,C مربوطه تغییر حالت در خروجی رخ می دهد . شکل زیر نحوه عملکرد تایمر/کانتر در این حالت را نشان می دهد .
نکته : همواره باید توجه داشت که مقدار حداکثر شمارش همیشه معادل یا بیشتر از مقدار رجیسترهای مقایسه باشد . اگر این مقدار کمتر باشد هیچگاه تطابق رخ نمی دهد و تایمر به درستی کار نمی کند .
فرکانس موج PWM بسته به مقدار حداکثری که دارد ، دارای فرکانس ثابت و دیوتی سایکل متغیر است . دیوتی سایکل توسط رجیسترهای OCRxA,B,C کنترل می شوند و فرکانس موج PWM از رابطه زیر بدست می آید :
که در آن N ضریب پیش تقسیم کننده و Fclk فرکانس کاری میکرو و TOP مقدار حداکثری است که در هر یک از حالت های پنج گانه فوق الذکر مشخص است .
تایمر/کانتر ۱۶ بیتی پیشرفته در حالت PWM تصحیح فاز ( Phase Correct PWM )
در این حالت تولید موج PWM با تفکیک بالا و فرکانس پایینتر نسبت به حالت سریع در دسترس می باشد . این حالت خود حداکثر دارای پنج مد عملکرد زیر است :
- PWM تصحیح فاز هشت بیت ( با حداکثر مقدار FF )
- PWM تصحیح فاز نه بیت ( با حداکثر مقدار ۱FF )
- PWM تصحیح فاز ده بیت ( با حداکثر مقدار ۳FF )
- PWM تصحیح فاز با حداکثر مقدار رجیستر ICRx
- PWM تصحیح فاز با حداکثر مقدار رجیستر OCRxA
در این حالت تایمر تا زمانی که مقدارش مطابق تنظیمات فوق یکی از مقادیر FF ، ۱FF ، ۳FF ، مقدار درون رجیستر ICRx و یا مقدار درون رجیستر OCRxA شود ، به صورت افزایشی ادامه می یابد سپس جهت شمارش تغییر نموده و از حداکثر مقدار به سمت صفر شمارش به صورت نزولی ادامه می یابد . در لحظه رسیدن به مقدار حداکثر ، پرچم ICRx یا OCxA و در لحظه رسیدن به صفر ، پرچم سر ریز فعال می شود . شکل زیر نحوه عملکرد تایمر/کانتر در این حالت را نشان می دهد .
در این حالت نیز دیوتی سایکل توسط رجیسترهای OCRxA,B,C کنترل می شوند و رابطه زیر برای فرکانس موج خروجی را داریم :
که در آن N ضریب پیش تقسیم کننده و Fclk فرکانس کاری میکرو و TOP مقدار حداکثری است که در هر یک از حالت های پنج گانه فوق الذکر مشخص است .
تایمر/کانتر ۱۶ بیتی پیشرفته در حالت PWM تصحیح فاز و فرکانس ( Phase & Frequency Correct PWM )
عملکرد واحد تایمر/کانتر در این حالت مشابه عملکرد حالت تصحیح فاز می باشد . تنها تفاوت این حالت با حالت تصحیح فاز زمان بروزرسانی رجیسترهای OCRxA,B,C است که در حالت تصحیح فاز در زمان حداکثر مقدار تایمر بود اما در این حالت در زمان مقدار صفر اتفاق می افتد . این عمل باعث بهبود موج PWM و متقارن شدن آن می گردد . این حالت خود حداکثر دارای دو مد عملکرد زیر است :
- PWM تصحیح فاز و فرکانس با حداکثر مقدار رجیستر ICRx
- PWM تصحیح فاز و فرکانس با حداکثر مقدار رجیستر OCRxA
شکل زیر نحوه عملکرد تایمر/کانتر در این حالت را نشان می دهد .
در این حالت نیز دقیقا همانند حالت قبل ، دیوتی سایکل توسط رجیسترهای OCRxA,B,C کنترل می شوند و رابطه زیر برای فرکانس موج خروجی را داریم :
که در آن N ضریب پیش تقسیم کننده و Fclk فرکانس کاری میکرو و TOP مقدار حداکثری است که در هر یک از حالت های پنج گانه فوق الذکر مشخص است .
تنظیمات واحد تایمر/کانتر در کد ویزارد CodeWizard
در کد ویزارد برگه ی Timers مربوط به تنظیمات تایمر/کانتر میکرو می باشد. هر میکروکنترلری که انتخاب شود کدویزارد به طور اتوماتیک برگه ی Timer را بر حسب نوع تایمر/کانترهای همان میکروکنترلر و امکانات و تنظیمات آن آپدیت می کند . در قسمت Clock Source ، ورودی تحریک تایمر مشخص می شود که میتواند از پایه خارجی میکرو ( کانتر ) یا از کلاک خود میکرو ( تایمر ) باشد . در صورتی که ورودی تحریک از کلاک سیستم باشد آنگاه باید در قسمت Clock Value ، ضریب پیش تقسیم کننده ( N ) مشخص شود . در قسمت Mode ، حالت کار تایمر/کانتر مشخص می گردد به طوری که کلیه حالت های ممکن در این قسمت وجود دارد و انتخاب می شود . در قسمت Output مشخص می شود که هنگام تساوی دو رجیستر TCNTx و OCRx پایه ی خروجی OCx چگونه عمل کند. در دو گزینه ی بعدی امکان فعال شدن وقفه در زمان سرریز و یا در زمان تساوی دو رجیستر TCNTx و OCRx فراهم می شود . در قسمت Timer Value مقدار شروع عدد داخل رجیستر TCNT مشخص می شود . در قسمت Compare نیز عدد داخل رجیستر OCR مشخص می شود .
نکته : در برخی از تایمر/کانترها واحد کاهش نویز ( Noise Canceler ) وجود دارد که با استفاده از یک فیلتر دیجیتال ساده ، سیگنال ICPx نسبت به نویز را بهبود می بخشد به طوری که با اعمال سیگنال به پایه ICPx ، چهار نمونه یکسان از آن گرفته و در صورت برابری آنها تسخیر صورت می پذیرد.
در شکل های زیر نحوه تنظیمات واحد تایمر/کانتر به طول کامل برای تایمر شماره ۱ میکروکنترلر Atmega32 ( پیشرفته ۱۶ بیتی ) و با کلاک کاری میکرو ۱ مگاهرتز آورده شده است .
شکل اول : تنظیم حالت کار تایمری یا کانتری
شکل دوم : تنظیم پیش تقسیم کننده در حالت تایمری
شکل سوم : تنظیم حالت عملکرد تایمر/کانتر
شکل چهارم : تنظیم خروجی
شکل پنجم : تنظیمات نهایی
با کلیک بر روی تصویر زیر به بخش بعدی آموزش بروید
در صورتی که این مطلب مورد پسندتان بود لایک و اشتراک گذاری فراموش نشود.
دیدگاه (19)
سلام
مطلبتون رو ینک کردم تو مطلبم
تشکر 🙂
سلام دوست عزیز متشکرم
سلام برادر خدا خیرت بدهد دستت در نکنه واقعا عالی و مفید لطفا ادامه بدهید
خسته نباشید
سلام دوست عزیز خواهش می کنم حتما ادامه خواهیم داد سلامت باشید
با سلام و عرض خسته نباشید مهندس
از مطالبتون واقعا استفاده کردم
انشاالله به کارتون ادامه بدید مام استفاده کنیم
موفق و موید باشید
سلام دوست عزیز خیلی ممنونم و خوشحالم که مفید بوده با ما همراه باشید انشاالله ادامه خواهد داشت شما هم موفق باشید
یعنی واقعا دمتون گرم . عالی بود . اما ای کاش pdf گذاشته بودید. البته خود فایر فاکس pdf میکنه ولی خیلی عکس را جا میندازه
ممنونم دوست عزیز چرا pdf اشو هم گذاشتیم که کسی کپی نکنه
تو یه جمله عاللللللللللللللللللللی بود با این سایت تقریبا میشه گفت آدم میتونه یه مهندس الکترونیک کامل و حرفه ای شه.
بسیار سپاسگذارم از حسن نظرتون
سلام دستتون درد نکنه ممنون واسه مطالب کاملتون .
سلام دوست عزیز سپاسگزارم
سلام خسته نباشيد
ميخواستم قطعه كدي بنويسم با استفاده از تايمر
به اينصورت كه
اگر “تغییرات” دما در یک بازه زمانی 10 ثانیه ای، بیش تر از 3 درجه سانتیگراد بود؛ فن روشن بشه و تا زمانی که دما به مقدار اولیه (یعنی 3 درجه کمتر از دمای فعلی) نرسیده، فن همچنان کار کنه و بعدش خاموش شه.
ممنون ميشم راهنمايي كنيد
سلام دوست عزیز ببخشید دیر جواب میدم
بله امکان پذیره کافیه شما از دو تا تایمر میکرو استفاده کنید
یکی از اونا تا روی 1 ثانیه که 10 بار باید اتفاق بیوفته
اون یکی روی مقدار نمونه برداری در زمان مثلا هر 100 میلی ثانیه دما رو نمونه برداری می کنه
نمونه ها ذخیره میشن و مقدار مینیمم و ماکزیمم اونا در 10 ثانیه محاسبه میشه و تغییرات اون بدست میاد
سلام.خدا قوت.یه سوال،من یه کد دارم برای راه اندازی ماژولsrf04 که یه قسمتش رو متوجه نمیشم.اونم مقدار رجیستر TCCR هستش که توی برنامه یکبار بصورت0x00 و یکبار 0x02 تغییر میکنه.من تا بحال بصورت دستی توی خود برنامه ندیدم که این مقدار رو تعیین کنن.لطفا راهنماییم کنید.
سلام ممنونم
اگر به دیتاشیت میکرو مراجعه کنید رجیستر TCCR جهت کنترل واحد تایمر/کانتر هستش
سه بیت کم ارزش این رجیستر کلاک ورودی تایمر رو مشخص میکنه
باسلام و تشکر از مطالب اموزندتون.
چه طور میشه از واحد کانتر استفاده کرد توی برنامه؟تابع فراخوانی باید براش نوشت ؟یا وقفه ی خاصی رو باید فعال کرد؟چون میخوام از این شمارش استفاده کنم.خیلی ممنون
سلام ممنونم
برای شمارش به جای استفاده از واحد کانتر میتوانید از واحد وقفه خارجی استفاده نمایید
با سلام، میخواستم از مگا۳۲ استفاده کنم با دو تایمر ۱۶ بیتی در حالت کانتر، میشه از دو تایمر ۸ بیتی رو به ۱۶ بیتی تبدیل کرد…
به این شکل وقتی یک تایمر که در حالت کانتر هم هست به ۲۵۶ رسید،یک پایه تغییر وضعیت بده البته نه بصورت نرم افزاری و بعد این پایه به ورودی تایمر ۸ بیتی دیگه وصل باشه و یک واحد اون رو افزایش بده، و نهایتا با خوندن دوتا مقدار دو تایمر ۸ بیتی و کنار هم قرار دادن اونا به یک تایمر ۱۶ بیتی برسم
تمام موضوع حل شدنی هست اگر یکی از تایمرهای ۸ بیتی پایه ورودی و خروجی داشته باشه، خروجی وقتی فول شد تغییذ وضعیت بده، و تایمر ۸ بیتی بعدی پایه ورودی داشته باشه
به دلیل درگیری cpu میکرو و سرعت پالسهایی که به کانتر وارد میشه دوتا ۱۶ بیتی نیاز هست و نرم افزاری ۱۶ بیتی درست کردن، ممکنه مشکلاتی در کارهای دیگه میکرو ایجاد کنه
با تشکر