مدولاسیون عرض پالس (PWM) یکی از تکنیکهای اساسی و بسیار پرکاربرد در دنیای میکروکنترلرها، از جمله آردوینو، است. این تکنیک به ما امکان میدهد تا با استفاده از یک سیگنال دیجیتال، رفتاری شبیه به سیگنال آنالوگ را شبیهسازی کرده و به این ترتیب، توان متوسط اعمال شده به یک دستگاه الکترونیکی را کنترل کنیم. این قابلیت برای کاربردهایی مانند کم و زیاد کردن نور LED، کنترل سرعت موتورهای DC، تولید سیگنالهای صوتی و بسیاری موارد دیگر حیاتی است.
PWM چیست و چگونه کار میکند؟
PWM در واقع یک روش برای تولید یک سیگنال شبه آنالوگ از یک منبع دیجیتال است. در این روش، یک سیگنال دیجیتال با فرکانس ثابت به صورت متناوب بین حالت "روشن" (HIGH) و "خاموش" (LOW) تغییر میکند. آنچه که کنترل میشود، "عرض پالس" یا مدت زمانی است که سیگنال در حالت HIGH قرار دارد.
دو پارامتر اصلی در PWM وجود دارد:
1. چرخه کاری (Duty Cycle): این پارامتر نسبت زمان "روشن" بودن سیگنال (HIGH) به کل دوره تناوب سیگنال را نشان میدهد و معمولاً به صورت درصدی بیان میشود.
* اگر چرخه کاری 0% باشد، سیگنال همیشه LOW است (دستگاه خاموش).
* اگر چرخه کاری 100% باشد، سیگنال همیشه HIGH است (دستگاه با حداکثر توان روشن).
* اگر چرخه کاری 50% باشد، سیگنال نیمی از زمان HIGH و نیمی از زمان LOW است (دستگاه با نصف توان روشن).
2. فرکانس (Frequency): این پارامتر تعداد دفعاتی است که چرخه PWM در یک ثانیه تکرار میشود. فرکانس PWM در آردوینو معمولاً ثابت است (برای اکثر پینها حدود 490 هرتز و برای پینهای 5 و 6 حدود 980 هرتز در بردهای Uno و Nano). بالا بودن فرکانس باعث میشود که چشم انسان یا موتور نتواند تغییرات سریع روشن و خاموش شدن را تشخیص دهد و یک اثر پیوسته ایجاد شود.
پینهای PWM در آردوینو
همه پینهای دیجیتال آردوینو قابلیت PWM را ندارند. پینهایی که از PWM پشتیبانی میکنند، معمولاً با علامت " ~ " در کنار شماره پین مشخص شدهاند. در برد آردوینو Uno و Nano، این پینها عبارتند از: 3، 5، 6، 9، 10 و 11.
استفاده از تابع
در محیط برنامهنویسی آردوینو، برای تولید سیگنال PWM از تابع
*
* مقادیر میانی (مثلاً 127) چرخه کاری متناسب را ایجاد میکنند (127/255 تقریباً 50%).
این تابع از رزولوشن 8 بیتی استفاده میکند، به این معنی که 256 سطح مختلف از توان (از 0 تا 255) را میتوان کنترل کرد.
مثال کاربردی: کم و زیاد کردن نور LED
یکی از سادهترین و رایجترین کاربردهای PWM، کنترل روشنایی یک LED است. با تغییر مقدار
در این کد، یک LED به پین 9 آردوینو متصل شده است (به همراه یک مقاومت سری برای محافظت از LED). حلقه اول
کاربردهای دیگر PWM:
محدودیتها و نکات:
با درک و استفاده صحیح از PWM، میتوانید کنترل بسیار دقیقتری بر روی اجزای الکترونیکی پروژههای آردوینو خود داشته باشید و قابلیتهای جدیدی را به آنها اضافه کنید.
PWM چیست و چگونه کار میکند؟
PWM در واقع یک روش برای تولید یک سیگنال شبه آنالوگ از یک منبع دیجیتال است. در این روش، یک سیگنال دیجیتال با فرکانس ثابت به صورت متناوب بین حالت "روشن" (HIGH) و "خاموش" (LOW) تغییر میکند. آنچه که کنترل میشود، "عرض پالس" یا مدت زمانی است که سیگنال در حالت HIGH قرار دارد.
دو پارامتر اصلی در PWM وجود دارد:
1. چرخه کاری (Duty Cycle): این پارامتر نسبت زمان "روشن" بودن سیگنال (HIGH) به کل دوره تناوب سیگنال را نشان میدهد و معمولاً به صورت درصدی بیان میشود.
* اگر چرخه کاری 0% باشد، سیگنال همیشه LOW است (دستگاه خاموش).
* اگر چرخه کاری 100% باشد، سیگنال همیشه HIGH است (دستگاه با حداکثر توان روشن).
* اگر چرخه کاری 50% باشد، سیگنال نیمی از زمان HIGH و نیمی از زمان LOW است (دستگاه با نصف توان روشن).
2. فرکانس (Frequency): این پارامتر تعداد دفعاتی است که چرخه PWM در یک ثانیه تکرار میشود. فرکانس PWM در آردوینو معمولاً ثابت است (برای اکثر پینها حدود 490 هرتز و برای پینهای 5 و 6 حدود 980 هرتز در بردهای Uno و Nano). بالا بودن فرکانس باعث میشود که چشم انسان یا موتور نتواند تغییرات سریع روشن و خاموش شدن را تشخیص دهد و یک اثر پیوسته ایجاد شود.
پینهای PWM در آردوینو
همه پینهای دیجیتال آردوینو قابلیت PWM را ندارند. پینهایی که از PWM پشتیبانی میکنند، معمولاً با علامت " ~ " در کنار شماره پین مشخص شدهاند. در برد آردوینو Uno و Nano، این پینها عبارتند از: 3، 5، 6، 9، 10 و 11.
استفاده از تابع
analogWrite()در محیط برنامهنویسی آردوینو، برای تولید سیگنال PWM از تابع
analogWrite() استفاده میشود. این تابع بسیار ساده است:
C++:
محتوای بلوک کدها در دسترس شما نیست. برای مشاهده بلوک کدها، وارد انجمن شوید یاثبت نام کنید
pin: شماره پین دیجیتالی که میخواهید سیگنال PWM را از آن خارج کنید (باید یکی از پینهای PWM باشد).value: یک عدد صحیح بین 0 تا 255. این مقدار چرخه کاری را تعیین میکند.
0 به معنای 0% چرخه کاری (همیشه LOW) است.*
255 به معنای 100% چرخه کاری (همیشه HIGH) است.* مقادیر میانی (مثلاً 127) چرخه کاری متناسب را ایجاد میکنند (127/255 تقریباً 50%).
این تابع از رزولوشن 8 بیتی استفاده میکند، به این معنی که 256 سطح مختلف از توان (از 0 تا 255) را میتوان کنترل کرد.
مثال کاربردی: کم و زیاد کردن نور LED
یکی از سادهترین و رایجترین کاربردهای PWM، کنترل روشنایی یک LED است. با تغییر مقدار
value در تابع analogWrite()، میتوانیم نور LED را به آرامی کم یا زیاد کنیم.
C++:
محتوای بلوک کدها در دسترس شما نیست. برای مشاهده بلوک کدها، وارد انجمن شوید یاثبت نام کنید
در این کد، یک LED به پین 9 آردوینو متصل شده است (به همراه یک مقاومت سری برای محافظت از LED). حلقه اول
for مقدار brightness را از 0 به 255 افزایش میدهد و نور LED را به تدریج زیاد میکند. حلقه دوم for همین کار را برعکس انجام داده و نور LED را کم میکند. تابع delay() برای ایجاد یک مکث کوتاه بین هر تغییر روشنایی استفاده شده تا تغییرات قابل مشاهده باشند.کاربردهای دیگر PWM:
- کنترل سرعت موتور DC: با تغییر چرخه کاری PWM، میتوان ولتاژ متوسط اعمال شده به موتور را تغییر داد و در نتیجه سرعت چرخش آن را کنترل کرد.
- سروو موتورها: سروو موتورها از سیگنال PWM خاصی برای تعیین موقعیت خود استفاده میکنند.
- تولید سیگنال صوتی: با تغییر سریع چرخه کاری PWM، میتوان سیگنالهای صوتی با فرکانسهای مختلف تولید کرد.
- کنترل هیترها یا المنتهای گرمایشی: برای تنظیم دمای خروجی.
محدودیتها و نکات:
- رزولوشن: رزولوشن 8 بیتی (256 سطح) برای اکثر کاربردها کافی است، اما در صورت نیاز به دقت بالاتر، باید از میکروکنترلرهای پیشرفتهتر یا روشهای دیگر استفاده کرد.
- فرکانس: فرکانس ثابت PWM در آردوینو Uno/Nano برای برخی کاربردها (مانند کنترل موتورهای خاص) ممکن است ایدهآل نباشد. تغییر فرکانس PWM امکانپذیر است اما نیاز به دستکاری رجیسترهای تایمر میکروکنترلر دارد که پیچیدهتر است.
- تفاوت با
analogRead(): توجه داشته باشید کهanalogWrite()برای خروجی سیگنال شبه آنالوگ است، در حالی کهanalogRead()برای خواندن ورودیهای آنالوگ از پینهای آنالوگ (A0-A5) استفاده میشود.
با درک و استفاده صحیح از PWM، میتوانید کنترل بسیار دقیقتری بر روی اجزای الکترونیکی پروژههای آردوینو خود داشته باشید و قابلیتهای جدیدی را به آنها اضافه کنید.