تایمر در میکروکنترلرهای AVR
تایمرهای میکروکنترلر
تایمرها یکی از بخش های مهم میکروکنترلرها هستند که برای اندازه گیری زمان و ایجاد وقفه در برنامه استفاده می شوند.
انواع تایمر
تایمرهای 8 بیتی: این تایمرها می توانند مقادیر تا 255 را شمارش کنند.
تایمرهای 16 بیتی: این تایمرها می توانند مقادیر تا 65535 را شمارش کنند.
تایمرهای 32 بیتی: این تایمرها می توانند مقادیر تا 4294967295 را شمارش کنند.
کاربردهای تایمر
ایجاد تاخیر: می توان از تایمرها برای ایجاد تاخیر در برنامه استفاده کرد.
اندازه گیری زمان: می توان از تایمرها برای اندازه گیری زمان سپری شده بین دو رویداد استفاده کرد.
ایجاد وقفه: می توان از تایمرها برای ایجاد وقفه در برنامه در زمان های مشخص استفاده کرد.
تولید PWM: میتوان از تایمرها برای تولید شکل موج PWM استفاده کرد.
تایمر/کانتر 0 و 1 در AVR:
منبع کلاک داخلی
کلاک تایمر/کانتر میتواند مستقیما توسط کلاک سیستم تامین شود. اگر پیش تقسیم کننده CSn2:0 = 1 باشد کلاک سیستم وارد تایمر میشود و تایمر سریعترین شمارش را انجام میدهد که معادل ایجاد کمترین زمان هست. همچینین توسط پیش تقسیم کننده میتوان چهار حالت برای تقسیم کلاک ورودی تایمر ایجاد کرد که معادل تقسیم کلاک سیستم به 8, 64, 256, 1024 است.
پیش تقسیم کننده کلاک تایمر
منبع کلاک خارجی
یک منبع کلاک خارجی میتواند از طریق پایه های T0/T1 به عنوان منبع کلاک تایمر/کانتر اعمال شود. پایه T0/T1 در هر سیکل کلاک سیستم نمونه گیری میشود سپس از یک آشکارساز لبه عبور میکند. آشکارساز لبه برای هر لبه مثبت (CSn2:0 =7) یا هر لبه منفی (CSn2:0 = 6) یک پالس کلاک تولید میکند (بسته به تنظیمات مقدار CS در رجیستر)
نصف کلاک خارجی اعمال شده باید از یک کلاک سیستم طولانی تر باشد تا نمونه برداری صحیح انجام شود. کلاک خارجی اعمال شده برای تایمر/کانتر باید از نصف فرکانس کلاک سیستم کمتر و دارای دیوتی سایکل 50 درصد باشد. با این حال، به دلیل تغییر فرکانس کلاک سیستم و دیوتی سایکل ناشی از تلرانس های منبع اسیلاتور (کریستال، رزوناتور و خازن)، توصیه می شود حداکثر فرکانس یک منبع کلاک خارجی کمتر از fclk_I/O/2.5 باشد.
کلاک خارجی اعمال شده برای تایمر امکان تقسیم شدن از طریق پیش تقسیم کننده را ندارد.
تایمر – کانتر 1 (16 بیتی)
1- طراحی 16 بیتی واقعی
2- دو واحد مقایسه کننده خروجی مستقل
3- رجیسترهای مقایسه خروجی دو بافر
4- یک ورودی واحد کپچر
5- پاک کردن تایمر در تطبیق مقایسه
6- تولید فرکانس
7- PWM
8- شمارنده وقفه خارجی
9- چهار منبع ورودی وقفه مستقل
واحد تایمر / شمارنده 16 بیتی امکان زمان بندی دقیق اجرای برنامه، تولید موج و اندازه گیری زمان بندی سیگنال را فراهم می کند.
بلوک دیاگرام کلی تایمر/کانتر 1 در شکل زیر نشان داده شده.
تایمر شامل واحد های مختلفی از قبیل شمارنده، مولد شکل موج، ورودی کپچر و انتخاب کلاک ورودی تایمر میشود.
منبع کلاک تایمر
کلاک تایمر میتواند توسط منبع داخلی یا خارجی تامین شود. منبع کلاک توسط بیتهای CSn2:0 از رجیستر TCCRnB انتخاب میشود.
واحد شمارنده
واحد اصلی تایمر 16 بیتی، یک شمارنده 16 بیتی دوجهت میباشد که از دو رجیستر TCNTnH و TCNTnL برای نگه داری مقدار شمارنده استفاده میکند. 8 بیت ارزش بالا در TCNTnH و 8 بیت با ارزش پایین در TCNTnL نگه داری میشود.
بسته به مد عملکرد مورد استفاده، یک کلاک تایمر باعث پاک شدن، کاهش یا افزایش مقدار شمارنده میشود.
بلوک دیاگرام واحد شمارنده
کلاک تایمر میتواند توسط منبع کلاک داخلی یا خارجی تولید و توسط بیت های انتخاب کلاک CSn2:0 انتخاب شود زمانی که هیچ منبع کلاکی انتخاب نشده باشد تایمر در حالت STOP است. البته مقدار TCNTn توسط CPU قابل دسترس میباشد.
پرچم سرریز تایمر – کانتر (TOVn) بسته به مد عملکرد انتخاب شده توسط بیت های WGMn3:0 یک میشود و میتوان از آن برای تولید وقفه استفاده کرد.
واحد ورودی کپچر (ثبت رویداد)
تایمر دارای یک واحد کپچر میباشد که میتواند یک اتفاق خارجی را کپچر (ضبط) کند و از طریق آن بتوان زمان وقوع را اندازه گیری کرد. یک سیگنال خارجی از طریق پایه ICP یا واحد مقایسه کننده آنالوگ میتواند به واحد کپچر اعمال شود.
زمان بدست آمده میتواند برای اندازه گیری مقدار فرکانس، دیوتی سایکل (چرخه کار) یا سایر ویژگی های سیگنال استفاده شود.
زمانی که یک تغییر سطح روی پایه ورودی کپچر ICP یا واحد مقایسه کننده آنالوگ ACO اتفاق بیافتد و توسط آشکارساز لبه تایید شود کپچر انجام میشود و مقدار 16 بیتی شمارنده TCNTn در رجیستر کپچر (ICRn) نوشته میشود همزمان پرچم ورودی کپچر (ICFn) یک میشود.
اگر TICIEn یک شده باشد یک وقفه ورودی کپچر تولید میشود. پرچم وقفه به صورت اتومات بعد از اجرای وقفه پاک میشود همچنین توسط نرم افزار با نوشتن 1 در بیت پرچم میتوان آن را پاک کرد. برای خواندن مقدار 16 بیتی رجیستر کپچر (ICRn) ابتدا باید مقدار ICRnL خوانده شود زمانی که مقدار بایت کم ارزش خوانده میشود مقدار بایت با ارزش در رجیستر TEMP کپی میشود و زمانی که CPU مقدار ICRnH را میخواند به رجیستر TEMP دسترسی پیدا میکند.
رجیستر ICRn فقط زمانی که مد تولید PWM انتخاب شده باشد، قابل نوشتن است و مقدار حداکثر شمارنده را در این مد تعیین میکند. در این حالت، مد تولید شکل موج (WGMn3:0) باید قبل از نوشتن مقدار TOP در رجیستر ICRn نوشته شود.
زمانی که مقدار رجیستر ICRn نوشته میشود ابتدا باید مقدار بایت با ارزش بالا در رجیستر ICRnH نوشته شود سپس باید بار ارزش پایین در رجیستر ICRnL نوشته شود.
پایه ورودی کپچر
منبع تحریک اصلی واحد کپچر ورودی پایه ICPn میباشد (برای ATmega32 پایه PORTD6). همچنین تایمر 1 میتواند از خروجی واحد مقایسه کننده آنالوگ برای تحریک ورودی واحد کپچر استفاده کند. مقایسه کننده آنالوگ از طریق تنظیم بیت ACIC در رجیستر ACSR انتخاب میشود. توجه کنید که تغییر منبع کپچر میتواند باعث تحریک کپچر شود از این رو باید پرچم کپچر بعد از تغییر منبع پاک شود.
یک ورودی کپچر را میتوان با کنترل پایه ICPn در پورت، از طریق برنامه تولید کرد (میتوان با یک کردن بیت معادل پایه ICPn در پورت توسط نرم افزار پالس تحریک کپچر را در برنامه تولید کرد).
کنسل کننده نویز
حذف نویز با استفاده از یک فیلتر دیجیتال، ایمنی در برابر نویز را بهبود می بخشد. ورودی ضد نویز چهار نمونه گیری از ورودی انجام میدهد و تمام 4 نمونه باید با هم برابر باشند تا خروجی واحد ضد نویز تغیر کند. واحد ضد نویز با تنظیم بیت ICNCn از رجیستر TCCRnB فعال میشود. زمانی که کنسل کننده نویز فعال شود یک تاخیر به اندازه چهار کلاک سیستم از لحظه تغیر در ورودی تا اعمال به واحد کپچر ایجاد میشود. تنظیمات پیش تقسیم کننده فرکانس تایمر روی واحد کنسل کننده نویز تاثیر ندارد و این واحد از کلاک سیستم استفاده میکند.
استفاده از واحد کپچر ورودی
چالش اصلی در استفاده از واحد کپچر اختصاص ظرفیت پردازش کافی برای اجرای ایونت های ورودی هست. زمان بین دو رویداد (ایونت) بسیار مهم است. اگر پردازنده مقدار کپچر شده در رجیستر ICRn را قبل از رویداد بعدی نخوانده باشد مقدار ICRn با مقدار جدید باز نویسی میشود.
برای اندازه گیری دیوتی سایکل (چرخه کاری) یک سیگنال خارجی نیاز هست تا لبه تحریک بعد از هر کپچر تغیر کند. تغیر تشخیص لبه باید در سریع ترین زمان ممکن بعد از خواندن رجیستر ICRn انجام شود. بعد از تغیر لبه، پرچم وردی کپچر ICFn باید توسط برنامه پاک شود.
برای اندازه گیری فرکانس پاک کردن پرچم ICFn نیاز نیست (در صورتی که روتین وقفه اجرا شود).
واحدهای مقایسه خروجی
مقایسه کنننده 16 بیتی به صورت مداوم مقدار TCNTn را با رجیستر مقایسه خروجی OCRnx مقایسه میکند. اگر TCNT با OCRnx برابر شود مقایسه کننده یک تطابق را نشان میدهد. تطابق پرچم مقایسه خروجی OCFnx را در کلاک بعدی تایمر یک میکند. اگرOCIEnx یک باشد پرچم مقایسه خروجی یک وقفه تولید میکند. پرچم OCFnx به صورت اتومات با اجرای وقفه پاک میشود همچنین با نوشتن یک توسط برنامه در OCFnx پرچم پاک میشود.
مولد شکل موج از سیگنال تطابق برای تولید خروجی بر اساس مد عملکرد که توسط بیت های WGMn3:0 و بیت های COMnx1:0 تنظیم میشود استفاده میکند.
یک ویژگی خاص از واحد مقایسه خروجی اجازه می دهد تا مقدار حداکثر تایمر (یعنی وضوح شمارنده) را مشخص کند. علاوه بر رزولوشن شمارنده، مقدار TOP مدت زمان پریود شکل موج های تولید شده توسط مولد شکل موج را مشخص می کند.
واحد خروجی تطابق مقایسه
بیت های مد مقایسه خروجی COMnx1:0 دو عملکرد دارند. مولد شکل موج از بیت های COMnx1:0 برای تعریف وضعیت خروجی مقایسه OCNx در تطابق مقایسه بعدی استفاده میکند. همچنین بیت های COMnx1:0 منبع خروجی پایه OCNx را کنترل میکنند. بیت رجیستر جهت داده DDRx برای پایه OCNx باید قبل از اینکه وضعیت OCNx روی پایه قرار بگیرد به صورت خروجی تنظیم شود.
مد خروجی مقایسه و مولد شکل موج
مولد شکل موج از بیتهای COMnx1:0 در مدهای نرمال، CTC و PWM به صورت متفاوت استفاده میکند. در تمام مدها تنظیم COMnx1:0 = 0 باعث میشود مولد شکل موج هیچ عملیاتی روی رجیستر OCnx انجام ندهد. ایجاد یک تغیر در وضعیت بیتهای COMnx1:0 در اولین تطابق مقایسه بعد از نوشتن در این بیت ها تاثیر میگذارد.
مدهای عملکرد تایمر
حالت عملکرد تایمر ( یعنی رفتار تایمر و پایه های خروجی مقایسه) توسط ترکیب حالت بیت های WGMn3:0 تعریف میشود و مد خروجی مقایسه کننده توسط بیت های COMnx1:0 تنظیم میشود. بیت های COMnx1:0 مشخص میکنند که خروجی PWM تولید شود یا خیر همچنین به صورت معکوس یا غیرمعکوس باشد. در مدهای غیر PWM بیت های COMnx1:0 مشخص میکند که خروجی در زمان تطابق مقایسه باید یک، صفر یا معکوس شود.
مد نرمال
ساده ترین مد کاری، مد نرمال هست (WGMn3:0 = 0) در این مد جهت شمارش همیشه افزایشی است و شمارنده پاک نمیشود. زمانی که شمارنده (16 بیتی) از مقدار ماکزیمم (0xFFFF) بیشتر شود شمارنده ری استارت میشود و از صفر میشمارد. در مد نرمال پرچم سرریز تایمر / کانتر در زمان صفر شدن TCNTn یک میشود.
استفاده از واحد کپچر ورودی در مد نرمال ساده هست با این حال، توجه داشته باشید که حداکثر فاصله بین رویدادهای خارجی نباید از وضوح شمارنده بیشتر باشد. اگر فاصله بین رویدادها خیلی طولانی باشد، باید از وقفه سرریز تایمر یا پیش مقیاس کننده برای افزایش رزولوشن برای واحد کپچر استفاده شود.
واحدهای مقایسه خروجی را می توان برای ایجاد وقفه در زمان مشخص استفاده کرد. استفاده از Output Compare برای تولید شکل موج در حالت عادی توصیه نمی شود، زیرا CPU را به شدت اشغال می کند.
محاسبه زمان ایجاد شده تایمر در مد نرمال
همانطور که در توضیحات بالا (دیتاشیت) مشخص شد تایمر دارای یک واحد شمارنده است که با هر کلاک ورودی یک واحد به رجیستر شمارنده (TCNTn) افزوده میشود(n شماره تایمر است). مدت زمان بین هر شمارش به فرکانس کلاک ورودی به تایمر بستگی دارد هر قدر فرکانس بیشتر باشد مدت زمان کمتر و سرعت شمارش بیشتر است و بر عکس هر قدر فرکانس پایین تر باشد مدت زمان بیشتر و سرعت شمارش کمتر است.
برای مثال اگر کلاک ورودی به واحد شمارنده تایمر 1 مگاهرتز باشد فاصله بین هر یک واحد شمارش، به اندازه مدت یک سیکل کلاک میباشد یعنی
1 / 1000000 = 0.000001 [S]
و مدت زمان کل برای شمارش کامل تایمر 16 بیتی میشود
(2^16) * 0.000001 = 0.065536 [s] == 65.536 [ms]
برای تایمر 16 بیتی تعداد کل شمارش معادل 2 به توان 16 معادل 65536 میباشد.
مثال بالا با این فرض است که تایمر از 0 شروع به شمارش میکند. اما اگر مقداری غیر از صفر در شمارنده تایمر (TCNT) باشد. باید تعداد شمارش های باقیمانده رجیستر در زمان یک سیکل کلاک ضرب شود. به طور مثال اگر شمارنده دارای مقدار 700 باشد و کلاک تایمر 1MHZ باشد مدت زمان بدست آمده میشود:
((2^16)-700) * 0.000001 = 0.064836 [S] == 64.836[ms]
فرمول محاسبه زمان شمارش تایمر:
در اینجا:
T: زمان ایجاد شده توسط تایمر (به ثانیه)
Fcpu: فرکانس میکروکنترلر (به هر هرتز)
Prescaler: مقدار پیش مقیاس کننده (تقسیم کننده فرکانس)
n: تعداد بیتهای تایمر (16 بیت برای تایمر 1)
TCNT: مقدار فعلی رجیستر شمارنده تایمر
نکته: با توجه به اینکه پرچم سرریز تایمر در زمان صفر شدن تایمر یک میشود باید به مقدار 16^2 یک واحد افزوده شود تا محاسبه دقیق باشد.
مثال : محاسبه مقدار اولیه تایمر برای بدست آمدن زمان یک ثانیه بعد از سرریز شدن تایمر در صورتی که فرکانس میکروکنترلر 8MHZ و Prescler = 256 باشد.
با جایگذاری مقادیر در فرمول بالا مقدار اولیه تایمر 34287 بدست میآید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <avr/io.h> #define F_CPU 8000000UL #include <util/delay.h> #define LED_TGL (PORTB ^= 1<<PORTB4) int main(void) { TCNT1 = 34287; //مقدار دهی اولیه به تایمر TCCR1A = 0; // تنظیم تایمر در مد نرمال TCCR1B = 1<<CS12; //تنظیم پیش مقیاس کننده در حالت 256 DDRB = 1<<PORTB4; while (1) { if (TIFR1 & (1<<TOV1)) { TIFR1 = 1<<TOV1; //پاک کردن پرچم سرریز تایمر TCCR1B = 0; //خاموش کردن تایمر LED_TGL; // کدی که هر یک ثانیه تکرار میشود TCNT1 = 34287; //مقدار دهی به تایمر TCCR1B = 1<<CS12; //تنظیم پیش مقیاس کننده در حالت 256 } } } |
در کد بالا ابتدا تایمر مقداردهی شده سپس در حلقه بینهایت پرچم سرریز تایمر چک میشود در صورتی که تایمر سرریز شود پرچم سرریز تایمر توسط برنامه پاک میشود.
کد بالا با استفاده از وقفه سرریز تایمر:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <avr/io.h> #define F_CPU 8000000UL #include <util/delay.h> #include <avr/interrupt.h> #define LED_TGL (PORTB ^= 1<<PORTB4) int main(void) { TCNT1 = 34287; //مقدار دهی اولیه به تایمر TCCR1A = 0; // تنظیم تایمر در مد نرمال TCCR1B = 1<<CS12; //تنظیم پیش مقیاس کننده در حالت 256 TIMSK1 = 1<<TOIE1; // فعال سازی وقفه سرریز تایمر DDRB = 1<<PORTB4; sei(); while (1) { _delay_ms(1); } } ISR(TIMER1_OVF_vect) { TCCR1B = 0; //خاموش کردن تایمر LED_TGL; // کدی که هر یک ثانیه تکرار میشود TCNT1 = 34287; //مقدار دهی به تایمر TCCR1B = 1<<CS12; //تنظیم پیش مقیاس کننده در حالت 256 } |
همانطور که در برنامه بالا مشخص میباشد بعد از سرریز شدن شمارنده، باید مقدار اولیه مجددا در تایمر بارگذاری شود تا زمان سنجی به درستی انجام شود.
مد پاک شدن تایمر در تطابق مقایسه یا CTC
دو حالت CTC برای تایمر AVR میتوان تعریف کرد یک حالت WGMn3:0 = 4، در این حالت حداکثر شمارنده برابر OCR1A میباشد و حالت دوم هم WGMn3:0 = 12، در این حالت حداکثر شمارنده برابر ICR1 میباشد. در مد CTC (WGMn3:0 = 4 OR 12) رجیستر OCRnA یا ICRn برای تغیر رزولوشن شمارنده استفاده میشوند. در مد CTC زمانی که مقدار شمارنده TCNTn با مقدار OCRnA (WGMn3:0 = 4) یا با ICRn (WGMn3:0 = 12) برابر شود، شمارنده صفر میشود. OCRnA یا ICRn مقدار حداکثر شمارنده را تعیین میکنند.
این حالت امکان کنترل بیشتر فرکانس خروجی تطابق مقایسه را فراهم میکند. شکل زیر دیاگرام زمانی مد CTC را نمایش میدهد. مقدار شمارنده TCNTn افزایش پیدا میکند تا زمانی که تطابق مقایسه با OCRnA یا ICRn اتفاق بیافتد و سپس شمارنده TCNTn صفر میشود.
با استفاده از پرچم OCFnA یا ICFn با توجه به رجیستر مورد استفاده برای تعریف مقدار TOP، میتوان در هر زمانی که مقدار شمارنده به مقدار TOP رسید، یک وقفه ایجاد کرد. اگر وقفه فعال باشد، از زیربرنامه کنترل وقفه می توان برای به روز رسانی مقدار TOP استفاده کرد. اگر مقدار جدید نوشته شده در OCRnA یا ICRn کمتر از مقدار فعلی TCNTn باشد، شمارنده تطابق مقایسه (Compare Match) را از دست خواهد داد. سپس شمارنده تا حداکثر مقدار خود (0xFFFF) شمارش میکند و قبل از اینکه تطبیق مقایسه رخ دهد، از 0x0000 شروع میشود. این مسئله در بسیاری از موارد مطلوب نیست. یک جایگزین در این حالت استفاده از مد FAST PWM برای تعریف مقدار TOP (WGMn3:0 = 15) است.
برای تولید شکل موج خروجی در حالت CTC، خروجی OCnA میتواند به حالت Toggle تنظیم شود و جهت داده پایه OCnA باید به صورت خروجی تعریف شود.
در صورتی که OCRnA روی صفر تنظیم شده باشد شکل موج تولید شده دارای حداکثر فرکانس fOCnA = fclk_I/O/2 خواهد بود. فرکانس شکل موج با رابطه زیر تعریف می شود:
N نشان دهنده مقدار پیش مقیاس کننده است (1، 8، 64، 256، یا 1024).
در مد نرمال پرچم TOVn تایمر هم زمان با صفر شدن شمارنده (from MAX TO 0x0000)، یک میشود.
مثال: ایجاد زمان 1 ثانیه با استفاده از مد CTC و فرکانس 8MHZ با استفاده از وقفه تطابق مقایسه تایمر1.
در این حالت بر خلاف مد نرمال نیازی به مقداردهی اولیه به TCNTn نمیباشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 8000000UL // فرکانس میکروکنترلر #include <util/delay.h> #define LED_TGL (PORTB ^= 1<<PORTB0) ISR(TIMER1_COMPA_vect) { // کدی که هر ثانیه اجرا میشود LED_TGL; } int main() { // تنظیم پین به عنوان خروجی برای ال ای دی DDRB |= (1 << PORTB0); // تنظیم تایمر 1 OCR1A = 31250; // تنظیم مقدار حداکثر شمارنده برای ایجاد زمان 1 ثانیه TIMSK1 |= (1 << OCIE1A); // فعال کردن وقفه CTC TCCR1B |= (1 << WGM12) | (1<<CS12); // Prescaler = 256 - CTC mod sei(); // فعال کردن وقفه سراسری // حلقه اصلی while (1) { _delay_ms(1); } return 0; } |
مثال: تولید فرکانس 50 هرتز با استفاده از تایمر 1 در حالت CTC و استفاده از واحد مقایسه خروجی.
فرکانس میکروکنترلر 8 مگاهرتز میباشد. پیش مقیاس کننده تایمر در حالت 1/64 تنظیم شده و فرکانس روی پایه OC1A تولید میشود. همانطور که در برنامه مشخص میباشد بدون مشغول کردن CPU فرکانس تولید میشود. برای بدست آوردن فرکانس از رابطه بالا استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <avr/io.h> #define F_CPU 8000000UL // فرکانس میکروکنترلر #include <util/delay.h> int main() { // تنظیم پین به عنوان خروجی DDRB |= (1 << PORTB1); // تنظیم تایمر 1 TCCR1A = 1<<COM1A0; //در لحظه تطابق مقایسه OC1A معمکوس کردن پایه OCR1A = 1249; TCCR1B |= (1 << WGM12) | (1<<CS10) | (1<<CS11); // Prescaler = 64 - CTC mod // حلقه اصلی while (1) { _delay_ms(1); } return 0; } |
مد FAST PWM
مد FAST PWM (WGMn3:0 = 5, 6, 7, 14 or 15) امکان تولید شکل موج PWM فرکانس بالا را فراهم میکند. PWM سریع با سایر گزینه های PWM به دلیل عملکرد تک شیب آن متفاوت است.
شمارنده از صفر تا مقدار حداکثر میشمارد و سپس ریست شده و از صفر مجددا میشمارد.
در مد غیر معکوس، خروجی مقایسه (OCnx) در زمان تطابق مقایسه بین TCNTn و OCRnx پاک میشود (صفر میشود) و در مقدار صفر یک میشود.
در مد معکوس، خروجی مقایسه (OCnx) در زمان تطابق مقایسه بین TCNTn و OCRnx یک میشود و در مقدار صفر شمارنده، ریست میشود (صفر میشود).
با توجه به عملکرد تک شیب، فرکانس عملکرد حالت PWM سریع می تواند دو برابر حالت PWM phase correct
و حالت PWM phase and frequency correct باشد که از عملکرد دو شیب استفاده می کنند.
این فرکانس بالا، مد PWM سریع را برای کاربردهای تنظیم توان، یکسو سازی و مبدل دیجیتال به آنالوگ مناسب میسازد.
فرکانس بالا امکان استفاده از قطعات خارجی با ابعاد کوچک را فراهم میکنم که باعث کاهش هزینه ها میشود.
رزولوشن PWM برای مد PWM سریع میتواند به صورت 8، 9 یا 10 بیتی به صورت ثابت تنظیم شود یا با رجیستر های ICRn یا OCRnA تعریف شود.
حداقل رزولوشن (تفکیک پذیری) 2 بیتی تعریف میشود (ICRn or OCRnA set to 0x0003) و حداکثر رزولوشن 16 بیت است (ICRn or OCRnA set to MAX). رزولوشن PWM رامیتوان با استفاده از معادله زیر محاسبه کرد:
در مد PWM سریع شمارنده افزایش پیدا میکند تا زمانی که مقدار شمارنده با یکی از مقادیر ثابت 0x00FF, 0x01FF, 0x03FF برای مدهای 8، 9 یا 10 بیتی (WGMn3:0 = 5, 6 or 7) یا مقدار رجیستر ICRn (WGMn3:0 = 14) یا مقدار رجیستر OCRnA (WGMn3:0 = 15) برابر شود سپس شمارنده در کلاک بعدی پاک میشود. دیاگرام زمانی مد PWM سریع در شکل زیر نشان داده شده است. شکل زیر؛ مد PWM سریع را برای حالتی که OCRnA یا ICRn برای تعریف مقدار حداکثر استفاده میشوند نشان میدهد. دیاگرام حالت های غیرمعکوس و معکوس را نشان میدهد. علائم خط افقی کوچک در شیب های TCNTn نشان دهنده مقایسه بین OCRnx و TCNTn است.
هر بار که شمارنده به حداکثر شمارش می رسد، پرچم سرریز تایمر (TOVn) یک می شود. زمانی که OCRnA یا ICRn برای تعریف مقدار ماکزیمم (TOP) استفاده می شود. علاوه بر این، پرچم OCFnA یا ICFn در همان کلاک تایمر که TOVn یک می شود، یک می شود. اگر یکی از وقفه ها فعال شده باشد زیربرنامه وقفه میتواند برای بروز رسانی مقدار TOP یا مقدار مقایسه استفاده شود.
زمان تغییر مقدار ماکزیمم (TOP) در برنامه باید مطمئن بود که مقدار ماکزیمم جدید از مقدار رجیستر مقایسه بیشتر یا مساوی باشد. اگر مقدار ماکزیمم (TOP) از مقدار مقایسه کمتر باشد تطابق مقایسه بین TCNTn و OCRnx هیچگاه اتفاق نمیافتد.
زمانی که از ICRn به عنوان مقدار ماکزیمم استفاده میشود روش بروز رسانی آن با روش بروز رسانی OCRnA متفاوت است. رجیستر ICRn مکانیزم بافر دوتایی (double buffer) را ندارد. این بدان معنی است که زمانی که شمارنده با مقدار پیش مقیاسکننده پایین کار میکند اگر ICRn به مقدار کم تغییر کند، این خطر وجود دارد که مقدار ICRn جدید نوشته شده کمتر از مقدار فعلی TCNTn باشد. نتیجه این خواهد بود که شمارنده تطابق مقایسه را در مقدار TOP از دست خواهد داد. سپس شمارنده باید تا مقدار MAX (0xFFFF) بشمارد و از 0x0000 شروع شود قبل از اینکه تطابق مقایسه انجام شود. با این حال، رجیستر OCRnA دو بافر است. این ویژگی اجازه می دهد تا OCRnA در هر زمانی نوشته شود.
هنگامی که در رجیستر OCRnA نوشته می شود، مقدار نوشته شده در بافر رجیستر OCRnA قرار می گیرد. سپس رجیستر مقایسه OCRnA با مقدار موجود در رجیستر بافر در کلاک بعدی تایمر که TCNTn با TOP مطابقت دارد به روز می شود. به روز رسانی در همان کلاک تایمر که TCNTn پاک می شود و پرچم TOVn یک می شود، انجام می شود.
استفاده از رجیستر ICRn برای تعریف مقدار حداکثر، در صورتی که مقدار TOP نیاز به تغییر نداشته باشد (ثابت باشد) به خوبی کار میکند، با استفاده از ICRn، رجیستر OCRnA برای تولید خروجی PWM در OCnA آزاد است. با این حال، اگر فرکانس پایه PWM نیاز به تغییر داشته باشد (با تغییر مقدار TOP)، استفاده از OCRnA به عنوان TOP به دلیل ویژگی بافر دوگانه آن به وضوح انتخاب بهتری است.
در حالت PWM سریع، واحدهای مقایسه اجازه میدهند شکل موج PWM روی پینهای OCnx ایجاد شود. تنظیم بیت های COMnx1:0 روی 2 یک PWM غیر معکوس تولید می کند و یک خروجی PWM معکوس را می توان با تنظیم COMnx1:0 به 3 تولید کرد. مقدار واقعی OCnx فقط در صورتی روی پین پورت قابل مشاهده خواهد بود که جهت داده برای پین پورت به عنوان خروجی تنظیم شود (DDR_OCnx).
شکل موج PWM با یک شدن (یا صفر شدن) پایه OCnx در تطابق مقایسه بین OCRnx و TCNTn و صفر شدن (یا یک شدن) پایه OCnx در کلاکی از تایمر که شمارنده (TCNTn) پاک میشود (از TOP به BOTTOM تغییر میکند) تولید میشود.
فرکانس PWM برای خروجی را می توان با معادله زیر محاسبه کرد:
N نشان دهنده مقدار پیش مقیاس کننده (1، 8، 64، 256، یا 1024) است.
اگر مقدار OCRnx صفر باشد خروجی در لحظه کلاک TOP + 1 یک پالس کوتاه تولید میکند.
اگر مقدار OCRnx حداکثر باشد خروجی به صورت دائم یک یا صفر خواهد بود (بسته به تنظیم مقدار بیتهای COMnx1:0)
با تنظیم OCnA در حالت TOGGLE (معکوس شدن) در لحظه تطابق مقایسه (توسط بیتهای COMnx1:0 = 1) میتوان به فرکانس خروجی با چرخه کار (دیوتی سایکل) 50 درصد رسید. زمانی که OCRnA روی صفر تنظیم شود شکل موج تولید شده دارای حداکثر فرکانس fOCnA = fclk_I/O/2 میباشد. این حالت مشابه TOGGLE شدن OCnA در مد CTC میباشد بجز اینکه حالت بافر دوگانه در واحد مقایسه خروجی برای مد FAST PWM فعال است.
مثال: تولید فرکانس در مد FAST PWM با فرکانس ثابت 30.5 هرتز در حالت غیرمعکوس روی پایه OC1A – مقدار دیوتی سایکل را با تغییر مقدار OCR1A میتوان تغییر داد. فرکانس میکروکنترلر 8 مگاهرتز میباشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | include <avr/io.h> #define F_CPU 8000000UL // فرکانس میکروکنترلر #include <util/delay.h> int main() { // تنظیم پین به عنوان خروجی DDRB |= (1 << PORTB1); // تنظیم تایمر 1 OCR1A = 127; TCCR1A = 1<<COM1A1 | 1<<WGM10; // non-inverting mode - FAST PWM mod 8 bit - top value = 255 TCCR1B |= (1 << WGM12) | (1<<CS10) | (1<<CS12); // Prescaler = 1024 - FAST PWM mod 8 bit - top value = 255 //فرکانس خروجی = 30/5 هرتز // حلقه اصلی while (1) { _delay_ms(1); } return 0; } |
با تغییر مد FAST PWM در حالت 8، 9 و 10 بیتی و همچنین تغییر مقدار پیش مقیاس کننده میتوان به فرکانس های مختلفی دست پیدا کرد.
مثال: تولید فرکانس در مد FAST PWM با امکان تغییر فرکانس از طریق تغییر مقدار OCRnA و حالت TOGGLE برای خروجی OCnA، در این حالت مقدار دیوتی سایکل همیشه 50 درصد است و فرکانس خروجی، نصف فرکانس محاسبه شده از طریق فرمول بالا میباشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <avr/io.h> #define F_CPU 8000000UL // فرکانس میکروکنترلر #include <util/delay.h> int main() { DDRB |= (1 << PORTB1); //تنظیم پین به عنوان خروجی // تنظیم تایمر 1 OCR1A = 400; TCCR1A = 1<<COM1A0 | 1<<WGM10 | 1<<WGM11; // TOGGLE mode - top value = OCR1A TCCR1B |= 1<<WGM12 | 1<<WGM13 | 1<<CS10 | 1<<CS12; // Prescaler = 1024 // حلقه اصلی while (1) { _delay_ms(1); } return 0; } |
مثال: تولید فرکانس در مد FAST PWM با امکان تغییر فرکانس از طریق تغییر مقدار ICRn در حالت غیر معکوس برای خروجی OCnA، در این حالت میتوان مقدار چرخه کار (دیوتی سایکل) را با تغییر مقدار OCRnA کنترل کرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <avr/io.h> #define F_CPU 8000000UL // فرکانس میکروکنترلر #include <util/delay.h> int main() { DDRB |= (1 << PORTB1); //تنظیم پین به عنوان خروجی // تنظیم تایمر 1 ICR1 = 400; OCR1A = 50; TCCR1A = 1<<COM1A1 | 1<<WGM11; // non-inverting mode - top value = ICR1 TCCR1B |= 1<<WGM12 | 1<<WGM13 | 1<<CS10 | 1<<CS12; // Prescaler = 1024 // حلقه اصلی while (1) { _delay_ms(1); } return 0; } |
مد Phase Correct PWM
مدولاسیون عرض پالس صحیح یا حالت PWM صحیح (WGMn3:0 = 1، 2، 3، 10، or 11) امکان تولید شکل موج PWM با وضوح (دقت) بالا و فاز صحیح را فراهم میکند. شمارنده به طور مکرر از مقدار پایین (صفر) به مقدار حداکثر و سپس از حداکثر به صفر شمارش می کند. در مد مقایسه با حالت خروجی غیر معکوس، خروجی مقایسه (OCnX) در حین شمارش افزایشی و لحظه تطابق بین TCNTn و OCRnx صفر (0V) میشود و در حین شمارش کاهشی و لحظه تطابق بین TCNTn و OCRnx یک (Vcc) میشود. در مد مقایسه با حالت خروجی معکوس؛ عملکرد معکوس میباشد. عملکرد دو_شیب دارای فرکانس پایین تری نسبت به عملکرد تک_شیب میباشد. با این حال، به دلیل ویژگی متقارن حالتهای PWM دو شیب، این حالتها برای کاربردهای کنترل موتور ترجیح داده میشوند.
رزولوشن PWM برای حالت PWM فاز صحیح میتواند روی 8، 9 یا 10 بیت ثابت شود یا توسط ICRn یا OCRnA تعریف شود. حداقل وضوح مجاز 2 بیت است (ICRn یا OCRnA روی 0x0003 تنظیم شده است) و حداکثر وضوح 16 بیت است (ICRn یا OCRnA روی MAX تنظیم شده است).
وضوح PWM بر حسب بیت را می توان با استفاده از معادله زیر محاسبه کرد:
در حالت PWM فاز صحیح، شمارنده تا زمانی افزایش مییابد که مقدار شمارنده با یکی از مقادیر ثابت 0x00FF، 0x01FF، یا 0x03FF (WGMn3:0 = 1، 2، یا 3)، مقدار ICRn (WGMn3:0 = 10) ، یا مقدار OCRnA (WGMn3:0 = 11) مطابقت داشته باشد. سپس شمارنده به مقدار حداکثر (TOP) رسیده و جهت شمارش تغییر می کند. مقدار TCNTn برای یک کلاک تایمر با مقدار TOP برابر خواهد بود. نمودار زمان بندی حالت PWM فاز صحیح در شکل زیر نشان داده شده است.
تصویر حالت PWM صحیح فازی را نشان میدهد زمانی که از OCRnA یا ICRn برای تعیین مقدار بالایی (TOP) استفاده میشود. مقدار TCNTn در نمودار زمانی نمایش داده شده است تا عملکرد دوگانه را توضیح دهد. نمودار شامل خروجیهای PWM غیرمعکوس و معکوس است. خطوط افقی کوچک بر روی شیبهای TCNTn نمایانگر تطابق های مقایسه بین OCRnx و TCNTn هستند. زمینه پرچم Interrupt OCnx فعال خواهد شد زمانی که یک همخوانی مقایسه رخ دهد. پرچم وقفه OCnx زمانی که تطابق مقایسه اتفاق بیافتد یک میشود.
پرچم سرریز تایمر (TOVn) زمانی که شمارنده به مقدار پایین (صفر) برسد یک میشود. زمانی که هر کدام از رجیسترهای ICRn یا OCRna برای تعریف مقدار حداکثر (TOP) استفاده شوند، پرچم OCnA یا ICFn در همان کلاک تایمر که رجیستر OCRnx با مقدار بافر دوگانه آپدیت میشود (at TOP)، یک میشوند. پرچم وقفه ها میتواند برای تولید یک وقفه در زمان رسیدن شمارنده به مقدار TOP یا BOTTOM استفاده شود.
زمانی که مقدار حداکثر تغییر داده میشود در برنامه باید مطمئن بود که مقدار حداکثر (TOP) جدید، بیشتر یا برابر با مقدار رجیسترهای مقایسه ای باشد. اگر مقدار حداکثر، کمتر از مقدار رجیستر مقایسه باشد تطابق مقایسه بین TCNTn و OCRnx هیچگاه اتفاق نمیافتد.
همانطور که در پریود سوم شکل بالا نمایش داده شده، تغییر مقدار TOP زمانی که تایمر در مد Phase Correct میباشد میتواند باعث ایجاد خروجی نامتقارن شود. دلیل این اتفاق را میتواند در زمان آپدیت رجیستر OCRnx پیدا کرد. از آنجایی که به روز رسانی OCRnx در TOP رخ می دهد، شروع دوره PWM و پایان آن در TOP انجام میشود. این بدان معناست که طول شیب در حال سقوط با مقدار TOP قبلی تعیین می شود، در حالی که طول شیب بالارونده با مقدار TOP جدید تعیین می شود. وقتی این دو مقدار متفاوت باشند، دو شیب دوره از نظر طول متفاوت خواهند بود. اختلاف طول نتیجه نامتقارن در خروجی می دهد.
توصیه می شود هنگام تغییر مقدار TOP در حالی که تایمر در حال کار است، از حالت Phase and Frequency Correct به جای حالت Phase Correct استفاده کنید. هنگام استفاده از مقدار TOP استاتیک (ثابت) عملاً هیچ تفاوتی بین دو حالت کار وجود ندارد.
در حالت PWM صحیح فاز، واحدهای مقایسه اجازه میدهند شکل موج PWM روی پینهای OCnx تولید کنند. تنظیم بیت های COMnx1:0 روی 2 یک PWM غیر معکوس تولید می کند و یک خروجی PWM معکوس را می توان با تنظیم COMnx1:0 به 3 تولید کرد. شکل موج PWM با یک شدن (یا صفر شدن) پایه OCnx در تطابق مقایسه بین OCRnx و TCNTn زمانی که شمارنده افزایش می یابد، و صفر شدن (یا یک شدن) پایه OCnx در تطابق مقایسه بین OCRnx و TCNTn زمانی که شمارنده کاهش می یابد، ایجاد می شود.
فرکانس PWM برای خروجی هنگام استفاده از PWM فاز صحیح را می توان با معادله زیر محاسبه کرد:
متغیر N نشان دهنده مقدار پیش مقیاس (1، 8، 64، 256، یا 1024) است.
مقادیر صفر یا حداکثر برای ثبت OCRnx موارد خاصی را هنگام تولید یک خروجی شکل موج PWM در حالت PWM فاز صحیح تولید میکند. اگر OCRnx برابر با صفر تنظیم شود، خروجی به طور مداوم صفر خواهد بود و اگر برابر با TOP تنظیم شود، خروجی برای حالت PWM غیر معکوس به طور مداوم یک خواهد بود. برای PWM معکوس خروجی مقادیر منطقی مخالف خواهد داشت. اگر از OCRnA برای تعریف مقدار TOP (WGMn3:0 = 11) و COMnA1:0 = 1 استفاده شود، خروجی OCnA با چرخه وظیفه (دیوتی سایکل) 50% تولید می کند.