مطالب علمی

چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟

PWM یا Pulse Width Modulation یا Pulse Duration Modulation ( مدولاسیون عرض پالس یا مدولاسیون مدت زمان پالس ) نام تکنیکی در الکترونیک است که استفاده گسترده ای در صنایع الکترونیک و مخابرات دارد. از این روش برای کارهایی مانند کدینگ پیام های مخابراتی ، کنترل توان دستگاه های الکتریکی ، شارژ باتری و … استفاده می شود.

در میکروکنترلر ها نیز PWM برای مصارف مختلفی مانند کنترل نور LED ها ( Fade کردن نور LED ) ، کنترل سرعت موتور های DC , انتقال پیام ، مبدل های ولتاژ و …. استفاده می شود.

pwm-wave

در اصل PWM موجی مربعی است که در برخی زمان ها ۰ و برخی زمان ها ۱ است و این ۰ و ۱ شدن ها با فرکانس مرتبی تکرار می شود. همانگونه که در شکل بالا مشاهده می کنید PWM مانند سایر امواج ، دارای دامنه یا Amplitude ، دور تناوب یا Period و فرکانس است. عبارت دیگری که در PWM مورد استفاده قرار می گیرد Duty Cycle است. دیوتی سایکل مدت زمان ۱ بودن به مدت زمان کل پریود در هر سیکل موج است که معمولا بر حسب درصد ( % ) نمایش داده می شود. به فرض مثال اگر Duty Cycle یک موج PWM برابر با ۴۰% باشد بدان معنی است که در هر سیکل ۴۰% ولتاژ برابر VCC و در ۶۰% اوقات ولتاژ برابر ۰ است. همانگونه که می دانید در چنین حالتی ولتاژ موثر یا Vrms برابر با ۴۰% VCC خواهد بود. به فرض مثال شما اگر با یک میکرو با تغذیه ۵V ، موج PWM با دیوتی سایکل ۵۰% ایجاد نمایید ولتاژ RMS شما برابر ۵۰% VCC یا به عبارتی ۲٫۵ ولت خواهد بود. در شکل زیر تعدادی موج PWM با فرکانس ثابت و دیوتی سایکل متفاوت نمایش داده شده است.

من امروز میخوام PWM نرم افزاری رو به شما معرفی کنم
چون خیلی از دوستان دیدم که گذرشون به این کارها میخوره همون طور که میدونید اکثر میکروهای AVR هشت بیتی PWM سخت افزاری محدودی دارند و اگر بخواهیم که آنها را به کار بگیریم باید از همون پایه ای که مشخص شده PWM بگیریم  بنابراین اگر کسی بخواهد که از پایه های دیگه PWM بگیرد باید به صورت نرم افزاری تعریف کند تا پایه دلخواه را PWM کند همانطور که می دانید برای هر PWM نیاز به یک تایمر دارد . البته در بعضی از تایمرها هستند که 3تا PWM تولید میکنند . اما در این برنامه ای که میخواهم برای شما معرفی کنم تنها یک تایمر بکار رفته است . تایمر صفر رو انتخاب کردم که امکاتاتش کمه و به کارمون میاد دلیل اینکه چرا از تایمر های دیگه استفاده نکردم اینه که گفتم شاید کسی از تایمر های دیگه که خیلی امکاناتش بالاتره بخواهد استفاده کند .
با استفاده از تایمر 0 میکروهای 128-64-ATmega16-32 این قابلیت را دارند که انجام مقایسه ای مقدار تایمر را انجام دهد(در بعضی از تایمر0 میکرو ها فقط این قابلیت رو دارند که Overflow کنند مثل ATmega8 ) . پس میتوانیم در این تایمر فرکانس را کم و زیاد کنیم . اگر فرکانس را بالا ببریم (مقدار OCR0 را کم کنیم) پردازش زیادتر میشود و دقت پایین می آید و اگر فرکانس رو کم کنیم دقت زیاد میشود . ما در این پروژه نیازی به این دو داریم ولی تا یک حدی این تایمر در مد CTC تنظیم شده است .
اگر برایتان فرکانس زیاد مهم نیست مقدار OCR0 را زیادتر کنید تا پردازش کمتر شود . دلیل اینکه روی بحث پردازش تاکید میکنم این هست که روی دستورات تاخیری تاثیر میگذارد و این باعث میشود که تاخیرات نرم افزاری دیرتر صورت بگیرد .

یک توضیح مختصر در مورد برنامه :
برنامه طوری طراحی شده که با استفاده از آرایه میتوانیم مقدار تک تک PWM ها را تغییر بدهیم آرایه ای که []pwm نام دارد را میتوانید اندیس آن را برای PWM دلخواهتان تنظیم کنید بازه مقدار آرایه PWM از 0 تا 99 است که نشانگر دیوتی سایکل است این آرایه یه جورایی میشه گفت که مثل رجیستر عمل میکنه . یعنی اینکه تا مقدار به آن بدهیم PWM تنظیم میشود .

برنامه ATmega64-128 :
در این دو میکرو به دلیل اینکه دستور PORTx.y فقط برای پورتهای A,B,C,D کاربرد دارد گفتم چه بهتر که همه رو با استفاده از دستورات کتابخانه ای خود کدویژن به کار بگیرم .
از لحاظ پردازش هم با این فرکانس و این تقسیم کننده فرکانس در تایمر ، در میکروی اتمگا 16 و 32 تقریبا 15.75% و در میکرو های اتمگا 64 و 128 تقریبا 24.67% پردازش میکرو را میگیرد . (البته این محاسبات در بدترین شرایط در نظر گرفته شده است .)
اگر بخواهید از تمام PWM های نرم افزاری استفاده نکنید میتوانید یکسری تنظیمات را تغییر دهید …
البته که اگر PWM های کمتری را به کار بگیرید پردازش کمتری خواهد گرفت .

سورس کد برای میکروهای ATmega16-32 به زبان C در کدویژن

نویسنده:SAMAN.ASADI

مطلب اصلی در انجمن: https://www.eca.ir/forums/thread48596.html

نوشته های مشابه

1 دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا