تالار گفتگوی کیش تک/ kishtech forum
مد PWM در تایمرهای AVR (بخش دوم) - نسخه‌ی قابل چاپ

+- تالار گفتگوی کیش تک/ kishtech forum (http://forum.kishtech.ir)
+-- انجمن: پردیس فناوری کیش (http://forum.kishtech.ir/forumdisplay.php?fid=1)
+--- انجمن: مهندسی الکترونیک و الکتروتکنیک (http://forum.kishtech.ir/forumdisplay.php?fid=169)
+--- موضوع: مد PWM در تایمرهای AVR (بخش دوم) (/showthread.php?tid=38360)



مد PWM در تایمرهای AVR (بخش دوم) - saedi1361 - 12-01-2020

[تصویر:  zzcr_new-microsoft-publisher-document.jpg]

یادآوری


این بار می خواهیم یاد بگیریم که چطور تایمرها را برای استفاده در مد PWM برنامه ریزی کنیم. اگر احساس می کنید که نیاز به یادآوری دارید به بخش قبلی مراجعه کنید. در بخش اول مفاهیم پایه ی PWM را بیان نمودیم. به طور خلاصه:

– PWM مخفف عبارت Pulse Width Modulation و به معنای مدولاسیون پهنای پالس می باشد.
– این مد با مقایسه ی یک شکل موج از قبل تعریف شده با یک سطح ولتاژ مرجع قابل تولید می باشد. (البته می توان مدارهای آنالوگ ساده ای نیز برای این کار طراحی نمود ولی نسبت به تولید آن با میکروکنترلر از دقت پایین تری برخوردارند.)
– چرخه ی کار یک شکل موج PWM از رابطه ی زیر محاسبه می شود:
 
[تصویر:  p5kt_d-cycle-formula.jpg]

حالا نوبت این است که با استفاده از میکروکنترلرهای AVR این مد را پیاده سازی نماییم.

تعریف مسئله

برای شروع یک مسأله تعریف می کنیم. فرض کنید که نیاز داریم یک سیگنال PWM با فرکانس ۵۰ هرتز و چرخه ی کار ۴۵ درصد تولید کنیم. با توجه به این که فرکانس ۵۰ هرتز است باید داشته باشیم:

T = T(on) + T(off) = 1/50 = 0.02 s = 20 ms

و همچنین با در نظر گرفتن این که می خواهیم چرخه ی کارمان ۴۵ درصد باشد، با حل رابطه ای که در بالا آمد داریم:

T(on)  = ۹ ms T(off) = ۱۱ ms

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

۱-     استفاده از تایمر در مد CTC

۲-     استفاده از تایمر در مد PWM

استفاده از مد CTC

با توجه به این که قبلا در پست «مد CTC در تایمرهای AVR» به اندازه ی کافی توضیحاتی ارائه شده است، در این جا فقط مفاهیم مربوطه را بیان نموده و کد مورد نظر را بدون توضیحات می آوریم. در ابتدا باید تایمر مناسب را انتخاب کنیم. برای این کار می توان از هریک از سه تایمر موجود در میکروکنترلر ATmega16 استفاده نمود. سپس باید مقسم فرکانس مناسب را انتخاب نمود؛ تایمر را تنظیم و مقدار دهی کرد و دیگر کارهای معمول را انجام داد. نکته ای که باید در اینجا بدان توجه شود به روز رسانی مقدار مقایسه است. یعنی باید هربار مقدار رجیستر OCRx را تنظیم نمود.
در اینجا از تایمر یک استفاده کرده ایم. ابتدا پین OC1A را خروجی کرده و مقدار صفر را در آن می ریزیم. باید مقداری اولیه را درون OCR1A بریزیم که معادل با تاخیر ۱۱ میلی ثانیه باشد، پس از این که تطبیق رخ داد پین OC1A تغییر وضعیت می دهد و یک می شود (از قبل رفتار پین خروجی مقایسه (یا همان OC1A) را در حالت تغییر وضعیت قرار می دهیم) در همین حین زیرروال وقفه اجرا شده و مقدار OCR1A را به گونه ای تغییر می دهیم که معادل با ۹ میلی ثانیه باشد. بنابراین پین OC1A به مدت ۹ میلی ثانیه یک می ماند و باز هم تغییر وضعیت می دهد. این کار را به طور تکراری انجام می دهیم و خروجی پین OC1A یک پالس PWM با چرخه ی کار ۴۵ درصد و فرکانس ۵۰ هرتز خواهد بود.

استفاده از مد PWM

حالا نوبت این است که در مورد مد PWM یاد بگیریم. مد PWM در میکروکنترلر AVR به طور سخت افزاری کنترل می شود. این یعنی این که تمام وظایف (و به معنای واقعی کلمه تمام وظایف) مربوطه توسط CPU میکروکنترلر AVR انجام می گیرد. تنها کاری که ما نیاز است انجام دهیم راه اندازی و استارت کردن تایمر و تنظیم چرخه ی کار است. اما چگونه؟
در این جا برای تشریح حالت PWM از تایمر صفر در میکروکنترلر ATmega16 استفاده می کنیم. شما می توانید هر تایمر دیگر از هرمیکروکنترلری که دوست دارید را انتخاب نمایید. اجازه دهید ابتدا رجیسترهای مربوط به مد PWM برای تایمر صفر را معرفی کنیم:

رجیستر TCCR0

اینجا یاد می گیریم که چگونه بیت های مناسب را برای راه اندازی تایمر صفر در مد PWM تنظیم نماییم. شکل زیر این رجیستر و بیت هایش را نشان می دهد:
 
[تصویر:  st4_10-tccr0-wgm-com-foc-800x132.png]

الان فقط به بیت هایی توجه می کنیم که به مد pwm مربوط می شوند:

بیت های ۳ و ۶ (بیت های WGM00 و WGM01)

کلمه ی WGM مخفف عبارت Waveform Generation Mode و به معنای مد تولید شکل موج می باشد. این بیت ها را می توان به صورت “۰۱” یا “۱۱” تنظیم کرد تا یکی از دو حالت PWM برای تایمر فعال شود.
 
بیت های ۴ و ۵ (COM00 و COM01)

عبارت COM مخفف Compare Match Output Mode و به معنای «مد خروجی تطابق در مقایسه» است. این بیت ها به منظور کنترل رفتار خروجی مقایسه (پین OC0 که پین ۴ در میکروکنترلر ATmega16 می باشد) تنظیم می شوند. به عبارت دیگر این بیت ها تعیین می کنند که هر بار که در عمل مقایسه تطبیقی صورت گرفت رفتار پین OC0 چگونه باشد.  این بیت ها را می توان در هریک از دو مد PWM سریع  و PWM تصحیح فاز تنظیم کرده و رفتار پین OC0 را مشخص کرد.
 
حال  نگاهی به شکل موج های مد PWM سریع بیندازیم
 
[تصویر:  khfi_03-fast-pwm.jpg]

میبینیم که سخت افزار میکروکنترلر تمامی کارها را کنترل می نماید. حتی انجام مقایسه نیز توسط CPU صورت می پذیرد. تنها کاری که ما باید انجام دهیم این است که به CPU بگوییم که به هنگام تطابق در مقایسه چه کاری انجام دهد. اینجاست که نقش بیت های COM00 و COM01 معلوم می شود. اگر این دو بیت به صورت “۱۰” تنظیم شوند پین خروجی OC0 به هنگام تطبیق صفر می شود و پس از این که شمارنده ی تایمر به مقدار حد بالا رسید OC0 یک می شود. اگر این دو بیت به صورت “۱۱” تنظیم شوند یه هنگام تطبیق مقایسه خروجی OC0 یک می شود و پس از آن به محض این که مقدار تایمر به حد بالا رسید OC0 صفر می شود. به بیان دیگر با تنظیم این دو بیت تعیین می کنیم که مد PWM سریع به صورت معکوس یا غیر معکوس عمل کند. تصویر بالا مد غیرمعکوس را نشان می دهد.
 
همچنین شکل موج های زیر PWM تصحیح فاز در مد غیر معکوس را نشان می دهند:
 
[تصویر:  0vzt_05-correct-phase-pwm.jpg]

با انتخاب بیت های COM01:0 (تنظیم COM01:0 به صورت “۱۰” یا “۱۱” ) رفتار OC0 را تعیین می کنیم. همانطور که در شکل موج های بالا نیز مشخص است دو لحظه را داریم: یکی تطبیق مقایسه در حال شمارش رو به بالا و دیگری تطبیق مقایسه در شمارش رو به پایین. رفتار OC0 در این دو لحظه در جدول به خوبی توضیح داده شده است. در صورتی که برای مد PWM سریع و PWM  تصحیح فاز نیاز به یادآوری دارید به بخش اول مراجعه کنید.

توجه کنید که پین OC0 یک پین خروجی است. بنابراین تأثیر تنظیمات بیت های WGM و COM فقط در صورتی اتفاق می افتد که رجیستر DDRx به طور مناسب تنظیم شده باشد. برای اطلاعات بیشتر به «کار با پورت های ورودی و خروجی در AVR» مراجعه کنید.

بیت های ۰ تا ۲ (بیت های تنظیم ساعت) :

رجیستر OCR0

در مورد این رجیستر نیز قبلا در مبحث تایمر صفر صحبت نمودیم. از این رجیستر به منظور ذخیره ی مقدار مقایسه استفاده می شود. اما هنگامی که تایمر صفر در مد PWM کار می کند مقدار ذخیره شده در این رجیستر در نقش چرخه ی کار ظاهر می شود. در مساله ای که در بالا تعریف کردیم چرخه ی کار برابر با ۴۵ درصد بود، در این حالت داریم:

OCR0 = 45% of 255 = 114.75 = 115

یعنی برای داشتن چرخه ی کار برابر با ۴۵ درصد باید مقدار ۱۱۵ را در OCR0 بریزیم. حالا نوبت این است که با استفاده از اطلاعاتی که از رجیسترها یاد گرفتیم، برنامه ای بنویسیم که یک پالس PWM با چرخه ی کار ۴۵ درصد تولید کند. البته در اینجا فرکانس سیگنال پالس تولیدی به فرکانس کلاک و انتخاب مقسم فرکانس ارتباط دارد. برای تنظیم سیگنال پالس تولیدی بر روی یک فرکانس خاص باید مقدار TOP یا حد بالا (که در شکل موج های بالا مشخص شده است)  را تغییر دهیم. این کار با استفاده از رجیستر ICRx انجام می شود (که تایمرهای ۸ بیتی از آن پشتیبانی نکرده و این امکان برایشان فراهم نیست). به عنوان مثال برای تایمر یک در کانال A باید مقدار ICRA را تنظیم کنیم. در مورد این رجیستر در آموزش «کنترل سرو موتور» بحث خواهیم کرد. در اینجا فرکانس کلاک میکروکنترلر را برابر با ۴ مگاهرتز در نظر می گیریم. با استفاده از مقسم فرکانس ۱۰۲۴ می توان محاسبه کرد که پس از ۱۱۵ شمارش در حدود ۳۰ میلی ثانیه زمان می گذرد. پس سیگنال پالس تولیدی ۴۰ میلی ثانیه روشن و ۳۶ میلی ثانیه خاموش خواهد بود (برای اطلاع از چگونگی محاسبات به جلسه ی «تایمرها در AVR» مراجعه کنید).
برای مشاهده ی کد نوشته شده به تب کدنویسی در بالای صفحه مراجعه کرده و «کد شماره ی ۲» را ببینید.

مثال:

این مثال تا حدی یک مثال عملی است تا استفاده از مد PWM را بهتر لمس کنیم. فرض کنیم می خواهیم یک LED چشمک زن طراحی کنیم که ابتدا با حداکثر شدت نور روشن شود و سپس به تدریج نور آن کم شود تا خاموش گردد. سپس به تدریج روشن شده و از نور کم به حداکثر شدت نورش برسد.
برای این کار باید یک سیگنال PWM را به LED اعمال کنیم. سپس چرخه ی کار را از ۲۵۵ به تدریج به سمت صفر کاهش دهیم. و سپس چرخه ی کار را از صفر به سمت ۲۵۵ به تدریج افزایش دهیم. مطابق با چرخه ی کار سیگنال PWM، ولتاژی که به LED اعمال می شود تغییر می کند. رابطه ی زیر ارتباط ولتاژ و چرخه ی کار را بیان می کند:
 
[تصویر:  7hd_06-vout-pwm.jpg]