در اين بخش مي‌توانيد در مورد تمامي مسائل مرتبط با میکروکنترلرهای AVR به بحث بپردازيد

PWM

مديران انجمن: SAMAN, sinaset, شوراي نظارت


Captain II

Captain II



نماد کاربر
پست ها

522

تشکر کرده: 3 مرتبه
تشکر شده: 71 مرتبه
تاريخ عضويت

سه شنبه 7 فروردین 1386 09:36

محل سکونت

ایران

آرشيو سپاس: 851 مرتبه در 286 پست

PWM

توسط robotic » دوشنبه 1 مهر 1387 21:34

PWM:

اين کلمه مخفف Pulse Width Modulation به معنای مدولاسيون پهنای پالس می باشد. يا به عبارتی ديگر يعنی با تغييراتی در پهنای پالس، توان (قدرت) الکتريکی انتقالی به موتور را کاهش يا افزايش می دهيم.  وقتی مي گوئيم موتور DC با ولتاژ DC دارای دور نامی مشخصی می باشد، يعنی اگر ولتاژی با مقدار معين را در سر موتور قرار دهيم، در اين صورت قدرت انتقالی به موتور ثابت بوده و در نتيجه موتور با دور نامی خود، کار خواهد کرد. ولتاژ DC يعنی ولتاژ ثابت. ميدانيم که يک ولتاژ ثابت همان پالس با پهنا پالس دلخواه است. يعنی به ازای اين مقادير زمانی ولتاژ دو سر بار مقداری مستقيم است. حال اگر ما به هر نحوی اين ولتاژ مستقيم روی دو سر موتور را کاهش دهيم، نتيجتاً قدرت انتقالی به موتور و در نتيجه دور موتور کمتر خواهد بود. با ادامه بحث هر چه بيشتر متوجه منظورم خواهيد شد.
اصل و مبنای PWM تغيير (مدوله کردن) پهنای پالس و در نتيجه تغيير مقدار متوسط ولتاژ موج است.در صورتی که يک موج مربعی را در نظر بگيريم، در اين صورت خواهيم داشت:



می دانيم:



در شکل موج فوق،



که در آن y مقدار ولتاژ يكسو شده ميباشد.

روش های توليد PWM:
1) ساده ترين راه ايجاد PWM استفاده از يک موج اره ای و يک موج سينوسی ايجاد ده توسط اسيلاتور می باشد. حال کافی است تا با استفاده از يک Op-Amp اين دو ولتاژ را با يکديگر مقايسه شوند. در صورتی که ولتاژ سبز رنگ در شکل زير بيشتر از ولتاژ آبی رنگ باشد، سطح ولتاژ بالا و در صورتی که منحنی سبز رنگ از منحنی آبی رنگ پائين تر باشد، سطح ولتاژ پائين خواهد بود.



2) روش DELTA:
در اين روش ولتاژ خروجی با دو سطح ولتاژ معين که يکی از آنها همان مقدار ولتاژ اول با مقداری Offset مي باشد، مقايسه ميشود. در صورتی که ولتاژ خروجی از يکی از اين دو محدوديت افزايش يا کاهش يابد، در اين صورت سطح ولتاژ پالس نيز تغيير خواهد کرد. شکل زير بيان گر اين موضوع می باشد.



روش 3) در اين روش ولتاژ خروجی از يک ولتاژ مرجع کمتر ميشود، در صورتی که مجموع اين ولتاژ خطا ( تفاضل ولتاژ خروجی از ولتاژ مرجع) از مقدار معينی بيشتر شود، سطح ولتاژ خروجی عوض ميشود.

روش 4) بسياری از مدارات ديجيتال می توانند PWM توليد کنند. برای مثال بسياری از ميکروپروسسور ها دارای خروجی PWM می باشند. معمولاً اين ميکروپروسسور ها درای شمارنده ای می باشند که پس از زمان معينی سطح ولتاژ خروجی را تغيير می دهند.

علاوه بر روش های گفته شده برای توليد PWM، سه حالت کلی برای PWM موجود می باشد:
1)   مرکز پالس در روی محور زمانی ثابت باشد و با افزايش يا کاهش کناره های (لبه های کناری) مدولاسيون پالس رو تغيير دهيم.
2)   لبه بالايی را ثابت نگه داريم و لبه پايينی را تغيير دهيم
3)   لبه پايينی را ثابت نگه داريم و لبه بالايی را تغيير دهيم.
از ساير موارد کار برد PWM علاوه بر کنترل دور موتور، می توان کار برد آن در مخابرات و تنظيم ولتاژ و پخش توان اشاره کرد.
هرکه را اسرار حق آموختند
مهر کردند و دهانش دوختند

javad_2010 از این پست سپاسگزاري کرده است

Captain II

Captain II



نماد کاربر
پست ها

522

تشکر کرده: 3 مرتبه
تشکر شده: 71 مرتبه
تاريخ عضويت

سه شنبه 7 فروردین 1386 09:36

محل سکونت

ایران

آرشيو سپاس: 851 مرتبه در 286 پست

توسط robotic » دوشنبه 1 مهر 1387 21:36

همان طور که اشاره شد يکی از راه های توليد PWM استفاده از ميکرو ها يا همان روش های ديجيتالی بود. در اينجا به چگونگی ايجاد PWM با استفاده از AVR ATMEGA 16 می پردازيم.

در راحت ترين حالت برنامه CODE Vision را اجرا کنيد:
حال از منوی File گزينه New را انتخاب کنيد.



گزينه Project  را مطابق شکل زير انتخاب کنيد:



حال گزينه Yes را انتخاب کنيد.
صفحه زير نمايان خواهد شد.



در همين صفحه ( قمست Chip) نوع AVR ATMEGA16 مورد استفاده را معين کنيد. در اينجا قصد توضيح تمامی قسمت های اين پنجره را نداريم  بلکه تنها  در مورد تايمر ها و چگونگی ايجاد PWM بحث خواهيم کرد. نتيجتاً قسمت هايی مورد نياز:
Chip
Timers
External IRQ
می باشد.
بعد از اينکه در پنجره فوق نوع ميکرو و CLOCK آن را مشخص کرديد، به منوی Timers برويد.



همان طور که مشاهده مي کنيد در اين ميکرو 3 تايمر در اختيار شماست. فرضاً TIMER 0 را در نظر بگيريد.
1)   اين تايمر 8 بيتی است.
2)   Clock Source: در اين قسمت منبع کلاک تايمر را انتخاب کنيد. يعنی هر بار که کلاکی از اين منبع به ورودی تايمر اعمال شود، تايمر يک بار خواهد شمرد. به عبارتی ديگر در اين قسمت منظور از Timer، شمارنده است که البته می توان با آن بصورت Timer نيز استفاده کرد. بعداً چگونگی اين کار توضيح داده خواهد شد. در حال حاضر منبع کلاک را انتخاب کنيد.



System Clock: با انتخاب اين گزينه، فرکانس تايمر مطابق با فرکانس مشخص شده برای تايمر در قسمت Chip می باشد. ( در اين قسمت فرض مي کنيم، نيازی به استفاده از منبع خارجی نباشد و از منبع داخلی تايمر استفاده کنيم)
T0 Falling Edge: در بين 40 پايه ی ميکرو، پايه ای با نام T0 برای ورودی تايمر صفر در نظ گرفته شده است. انتخاب اين گزينه موجب خواهد شد تا در صورت عبور پالس پائين گذر از پايه T0، تايمر (شمارنده) يک بار بشمارد.
T0 Rising Edge: مطابق همان قسمت فوق ، با اين تفاوت که تنها در هنگام عبور لبه بالا رونده، تايمر ( شمارنده) خواهد شمرد.

در اينجا برای ايجاد PWM، نياز به System Clock داريم.

Clock Value:
خوب در اين قسمت می توانيد در صورت نياز تنها قسمتی از فرکانس کاری ميکرو را برای تايمر استفاده کنيد.
فقط دقت کنيد که مقداري برای آن انتخاب کنيد! ( برای روی Timer Stopped رها نکنيد.)



Mode: حالت کاری ميکرو را مشخص کنيد. در اين قسمت  است که مشخص مي کنيد از اين تايمر قصد استفاده بصورت مولد  PWMرا داريد.



Normal top=FFh: يعنی بصورت يک شمارنده معمولی با فرکانس تعيين شده در قسمت های قبلی تا عدد 255 خواهد شمرد. ( ياد آور ميشوم اين تايمر 8 بيتی است)

CTC top=0CR0 مخفف ( Clear Timer on Compare Match (CTC) Mode):
در اين حالت زمانی که مقدار تايمر ( مقدار رجيستر TCNT0) به مقدار مشخص شده برای رجيستر OCRO رسيد، تايمر Reset ميشود. در ضمن ميتوانيد با فعال نمودن گزينه Compare Match Interrupt، زمانی که تايمر به مقدار رجيستر OCR0 رسيد، علاوه بر بازنشانی تايمر، سرويس وقفه مربوطه نيز فعال ميگردد که ميتوانيد برنامه مورد نظر را در آن سرويس وقفه وارد کنيد. همچنين مقدار رجيستر OCR0 که بطور اوليه بر روی صفر تنظيم شده است را می توانيد از قمست Compare مشخص کنيد. ( دقت کنيد که عدد را به hex وارد کنيد و بزرگتر از 255 نباشد.)

Fast PWM top=FFh: امکان PWM با فرکانس های بالا را به شما ميدهد. در اين حالت تايمر تا مقدار رجيستر شمرده و سپس بسته به حالت قسمت Output:
1)   قسمت Output



بر روی Non_inverted تنظيم شده باشد. در اين صورت به ازای مقادير بيشتر از مقدار رجيسترOCR0 مقدار خروجی تايمر صفر و به ازای مقادير کوچکتر از رجيستر OCR0 مقدار خروجی تايمر ( پايه ی 4ـ OC0) يک خواهد بود.
2)   قسمت Output بر روی inverted تنظيم شده باشد. در اين صورت به ازای مقادير بيشتر از مقدار رجيسترOCR0 مقدار خروجی تايمر، يک و به ازای مقادير کوچکتر از رجيستر OCR0 مقدار خروجی تايمر ( پايه ی 4ـ OC0)، صفر خواهد بود.

Phase correct PWM top=FFh:
در اين حالت تايمر بطور دائم از مقدار صفر تا 255 خواهد شمرد و سپس از 255 به صفر باز خواد گشت. (255، 254، 253، ...) اگر خروجی در حالت Non-Inverted باشد، زمانی که مقدار خروجی و مقدار رجيستر OCR0 برابر شدند، در حالت بالا شمار خروجی باز نشانی و در حالت پائين شمار خروجی يک ميشود.

پس بدين ترتيب تا اکنون به سادگی می توانيد حدث بزنيد که برای توليد PWM مورد نظر مي توانيد از يکی از حالت های Fast PWM يا Phase correct PWM استفاده کنيد. روش سومی نيز استفاده از سرويی وقفه در زمان برابری مقدار تايمر با رجيستر OCR0 می باشد. به اين ترتيب با تنظيم مقدار رجيستر OCR0 می توانيد PWM خروجی با سيکل کاری مورد نظر را ايجاد کنيد. .( در اين روش سوم، بايد گزينه Compare Match Interrupt را نيز فعال کنيد.)
هرکه را اسرار حق آموختند
مهر کردند و دهانش دوختند


چه کسي حاضر است ؟

کاربران حاضر در اين انجمن: بدون كاربران آنلاين و 2 مهمان