تبلیغات

به نام خدا

در جلسه ی گذشته در مورد ساختار ADC یا همان مبدل آنالوگ به دیجیتال توضیحات مفصل داده شد. در این جلسه، نحوه ی استفاده از ADC در برنامه را توضیح خواهیم داد.
در میکرو کنترلر ATMEGA16، 8 پایه ی به ADC اختصاص داده شده، یعنی شما می توانید به صورت همزمان، خروجیِ 8 سنسور یا مدار جانبی را به میکروکنترلر خود وصل کنید و اطلاعات آن ها را به وسیله ی ADC دریافت کنید.

اما این 8 پایه کدام پایه ها هستند؟


این 8 پایه، پایه مربوط به پورت A هستند که با فعال کردن ADC در CodeWizard، این پایه ها در اختیار ADC قرار می گیرند. دقت کنید که برای استفده از ADC حتماً باید قبلاً تنظیمات را در CodeWizard انجام داده باشید.
این 8 پایه طبق شکل زیر از ADC0 تا ADC7 نام گذاری شده اند.



چگونه از ADC در برنامه استفاده کنیم؟


هنگامیکه شما تنظیمات اولیه را برای فعال سازی ADC در CodeWizard انجام می دهید، به شما این امکان داده می شود که در هر قسمت از برنامه، مقدار هر یک از 8 ADC را بخوانید و از آن استفاده کنید. عبارت" (شماره ی ADC )read_adc " در هر قسمت از برنامه، حاوی مقدار ADC مورد نظر شماست. مثلاً اگر بخواهیم مقدار ADC0 را بررسی كنیم كه آیا از 100 بزرگتر است یا خیر، به شكل زیر عمل می‌كنیم:

if(read_adc(0) > 100)

یا مثلاً اگر بخواهیم مقدار ADC1 را در داخل یك متغیر نگه داری كنیم، به شكل زیر عمل می كنیم:

int a;
a= read_adc(1);

مبدل آنالوگ به دیجیتال، یكی از مهمترین قابلیت‌هایست كه اكثر میكروكنترلر‌های خانواده‌ی AVR آن را دارند. در میكروكنترلر‌های قدیمی‌تر، برای این كار، باید یك آی سی به صورت جداگانه بر روی مدار تعبیه می‌شد.

در جلسه‌ی آینده مبحث بسیار مهم PWM را شروع خواهیم كرد. به وسیله‌ی این قابلیت بسیار مهم،‌ما می‌توانیم سرعت موتور‌ها یا هر المان دیگری كه به میكروكنترلر متصل می‌شود را كنترل كنیم. PWM نیز یكی از قابلیت‌های مهم خانواده‌ی AVR است كه در ادامه به آن خواهیم پرداخت.

PWM چیست؟




در بسیاری از موارد، ما نیاز به كنترل ولتاژ بر روی پایه‌های خروجی میكروكنترلر را داریم. مثلاً اگر بخواهیم سرعت موتور را كنترل كنیم، باید ولتاژی كه بر روی موتور اعمال می‌شود را كنترل كرد. در حقیقت سرعت موتور تقریباًً تابع مستقیمی از ولتاژی است كه بر روی آن اعمال می‌شود. یعنی اگر ولتاژ كاریِ موتوری (ولتاژ استاندارد برای فعال سازی موتور كه بر روی بدنه‌ی آن نوشته می‌شود) 12 ولت باشد، با اعمال ولتاژ 6 ولت روی آن، می‌توانید سرعت چرخش آن(rpm) را حدوداً به نصف كاهش دهید.

كنترل سرعت ربات، در همه‌ی سطوح رباتیك اهمیت بسیار زیادی دارد، از ربات‌های مسیریاب ساده گرفته تا ربات‌های فوتبالیست. ما تا كنون یاد گرفته‌ایم كه چگونه می‌توان به موتور دستور حركت یا توقف داد، اما راهی برای كنترل سرعت موتور یاد نگرفته‌ایم.



یادآوری

همانطور كه می‌دانید سطح ولتاژ پایه‌های خروجی میكروكنترلر منطقی است، یعنی یك پایه‌ای كه برای كنترل موتور ربات استفاده می‌شود فقط می‌تواند 0 یا 1 باشد. ما 2 پایه از میكروكنترلر را به حركت ربات اختصاص می‌دهیم، برای صدور دستور حركت، باید یك پایه را 0 و پایه‌ی دیگر را 1 كنیم، در این حالت بین 2 پایه‌ی موتور اختلاف پتانسیل برقرار می‌شود و حركت می‌كند. اگر هم بخواهیم موتور معكوس بچرخد، باید پایه‌ای كه 1 بود 0 ، و پایه‌ای كه 0 بود را 1 كنیم؛ و برای توقف موتور، باید هر دو پایه را 0 یا هر دو پایه را 1 كنیم (تا بین 2 پایه‌ی موتور اختلاف پتانسیل 0 ولت باشد). در نتیجه در حالت عادی ما فقط 2 فرمان "حركت" و "توقف" را می‌توانیم به موتورها بدهیم، و ما هیچ كنترلی بر روی سرعت موتور نداریم.




PWM تكنیكی است كه به كمك آن می‌توانیم ولتاژ پایه‌های خروجی میكروكنترلر، و در نتیجه سرعت موتور یا سایر قطعات جانبی كه به میكروكنترلر متصل می‌شود را كنترل كنیم.



PWM




PWM مخفف واژه‌ی Pulse Width Modulation و به معنای "مدولاسیون پهنای پالس" است. همانطور كه گفتیم PWM تكنیكی برای كنترل ولتاژِ پایه‌ی خروجی است. حال ببینیم چگونه با این تكنیك می‌توان ولتاژ خروجی را كنترل كرد.

می‌دانیم كه ولتاژ در پایه‌های خروجی میكروكنترلر یا 0 است یا 5 ولت، اما برای كنترل سرعت موتور، باید بتوانیم حداقل ولتاژ یكی از پایه‌ها را بین 0 تا 5 تغییر دهیم. PWM روشی است تا ما بتوانیم با استفاده از همین پایه‌ی خروجی معمولی، به نوعی ولتاژ را بین 0 تا 5 ولت تغییر دهیم.

در این روش، ما با سرعت بالایی سطح ولتاژ خروجی را 0 و بلافاصله 1 می‌كنیم(مثلاً هزار بار در ثانیه)، نمودار ولتاژ خروجی بر حسب زمان به شكل زیر می‌شود.



نمودار بالا ولتاژ خروجی این پایه بر حسب زمان است.

در شكل بالا جمع 2 بازه‌ای كه با فلش‌های 2طرفه نشان داده شده است، (به عنوان مثال) 10 میكرو ثانیه است. كه 5میكرو ثانیه خروجی 1 و سپس 5میكرو ثانیه 0 می‌شود. اما همانطور كه گفته شد، این عمل هزاران بار در ثانیه تكرار می‌شود، اما آیا موتور نیز به همین تعداد در ثانیه روشن و خاموش می‌شود؟

جواب منفیست، اتفاقی كه روی می‌دهد این است كه موتور، این موج را در درون خود به نوعی میانگین گیری می‌كند و در حقیقت آنرا به شكل زیر می بیند:




یعنی در واقع موتور این موج را به صورت یك ولتاژ 2.5 ولت معمولی دریافت می‌كند.

به همین ترتیب می‌توان هر ولتاژی بین 0 تا 5 ولت را بر روی خروجی‌ مورد نظر ایجاد كرد. اگر بخواهیم ولتاژی بالاتر از 2.5 ولت داشته باشیم، باید طول بازه‌های زمانی‌ای كه خروجی 1 است را نسبت به بازه‌هایی كه خروجی 0 است بیشتر كنیم. به عنوان مثال برای ایجاد ولتاژ 2.5 ولت، باید 5 میكرو ثانیه سطح ولتاژ خروجی 1 باشد، سپس 5 میكرو ثانیه سطح ولتاژ 0 شود تا موجی به شكل بالا ایجاد شود.

یا به عنوان مثالی دیگر، اگر بخواهیم در خروجی ولتاژ 4 ولت داشته باشیم، باید باید 8 میكرو ثانیه سطح ولتاژ خروجی 1 باشد، سپس 2 میكرو ثانیه سطح ولتاژ 0 شود، تا ولتاژ پایه‌ی خروجی مورد نظر 4 ولت باشد.

در حقیقت ولتاژ خروجی از رابطه‌ی ساده‌ی زیر به دست می‌اید:

(طول كل بازه)  / ( طول بازه‌ای كه خروجی 1 است)

پس طبق رابطه‌ی بالا،برای ایجاد ولتاژ 4 ولت، می‌توان به جای استفاده از بازه‌های 8 و 2 میكرو ثانیه‌ای، از بازه‌های 4 و 1 میكرو‌ ثانیه‌ای استفاده كرد. (یعنی 4میكرو ثانیه 5ولت، 1 میكرو ثانیه 0 ولت) زیرا:   2÷ 8 = 1÷4


نمودار ولتاژ‌های 4 ولت و 1 ولت در زیر نشان داده شده است:

نمودار نحوه‌ی تولید ولتاژ 4 ولت با تكنیك PWM.

نمودار نحوه‌ی تولید ولتاژ 1 ولت با تكنیك PWM.


حال ببینیم چگونه می‌توان برنامه‌ای نوشت تا بر روی پایه‌ای دلخواه از میكروكنترلر PWM ی برای ولتاژ 4 ولت ایجاد كرد.
هر دستوری كه بر روی خروجی‌های میكروكنترلر قرار می‌گیرد، تا زمانی كه دستور بعدی، خروجی را تغییر ندهد، آن خروجی تغییری نخواهد كرد. یعنی مثلاً زمانی كه پایه‌ای را 1 می‌كنیم، تا زمانیكه با دستور دیگری آن پایه را 0 كنیم، مقدار خروجی آن پایه‌ 1 خواهد ماند. به این عمل اصطلاحاً Latch كردن می‌گویند. میكروكنترلر همواره اطلاعاتی كه بر روی خروجی قرار می‌دهد را Latch می‌كند و تا زمانیكه اطلاعات جدید بر روی پایه قرار نگیرد، اطلاعات قبلی را تغییر نمی‌دهد.
در نتیجه، مثلاً اگر می‌خواهیم پایه‌ای را 5 میكروثانیه 1 وسپس 0 كنیم، كافیست پایه‌ی مورد نظر را 1 كنیم و 5میلی ثانیه در برنامه تاخیر ایجاد كنیم و سپس پایه‌ی مورد نظر را 0 كنیم.
پس وقتی می خواهیم مثلاَ بر روی پایه‌ی B.4 ، یك PWM برای ولتاژ 2.5 ولت ایجاد كنیم، باید به شكل زیر عمل كنیم.

while(1)

{

PORTB.4=1;

5 میكرو ثانیه تاخیر

PORTB.4=0;

5 میكرو ثانیه تاخیر

}

در بالا یك حلقه‌ی بی‌نهایت تعریف شده است كه بر روی پایه‌یB.4، یك PWM برای 2.5 ولت ایجاد می‌كند.

در جلسه‌ی آینده با توابعی كه برای ایجاد تاخیر (delay) در برنامه استفاده می‌شوند آشنا خواهید شد. همچنین می‌آموزید كه چگونه می‌توان از PWM میكروكنترلر‌های خانواده‌ی AVR استفاده كنید.

اگر مطالب این جلسه كمی پیچیده به نظر می‌رسند جای نگرانی نیست، زیرا مبحث PWM مبحث گسترده‌ایست و كاربرد‌های زیادی در صنعت دارد و فقط محدود به میكروكنترلر هم نمی‌شود. پس طبیعیست كه سطح مطالب كمی بالا باشد و دوستان نیز گاهاً در درك مفاهیم دچار مشكل شوند. پس دوستان عزیز اگر سوال یا مطلب خاصی در این رابطه دارند حتماً با ما در میان بگذارند.