الکترونیک، رباتیک و مکانیک

آموزش به زبان بسیار ساده و روان (از صفر تا بینهایت)

الکترونیک، رباتیک و مکانیک

آموزش به زبان بسیار ساده و روان (از صفر تا بینهایت)

الکترونیک، رباتیک و مکانیک

با سلام و عرض ادب خدمت هموطنان عزیز
در این سایت قصد داریم موضوعاتی که در حیطه الکترونیک ،مکانیک و برنامه نویسی ربات ها دارای جذابیت خاصی می باشد رو آموزش بدیم. امیدواریم که با نظرات شما عزیزان شاهد آموزشهای جامعی در این زمینه باشیم.
با تشکر

نویسندگان
پیوندهای روزانه
طبقه بندی موضوعی
آخرین نظرات

پنجشنبه, ۱۷ دی ۱۳۹۴، ۰۹:۵۲ ق.ظ

۰

 

هفتمین قسمت از کارگاه عملی با عنوان "کار با تایمر/کانتر صفر در مد PWM" در ادامه مطلب قابل مشاهده است.

 

پس با ما در ادامه مطلب همراه باشید ...

 

سلام

 

در قسمت قبلی با مد PWM آشنا شدین.

 

الان وقتشه که برنامه نویسیشو هم یاد بگیرین.

اما اول از همه بریم ببینیم که اصلا اوضاع مد PWM در میکروکنترلرهای AVR چطور هست.

انتخاب تایمر/کانتر در میکروکنترلر AVR :

گفتیم که میکروکنترلر AVR دارای سه تایمر/کانتر هست:

  • Timer/Counter 0
  • Timer/Counter 1
  • Timer/Counter 2

هر سه تای این تایمر/کانترها از PWM پشتیبانی میکنند.

تایمر/کانتر 0 و 2 هشت بیتی هستند و تایمر/کانتر 1 شونزده بیتی !

 

مِن باب یادآوری : هشت بیتی از 0 میشماره تا 255 و شونزده بیتی از 0 میشماره تا 65536 .

 

طبق معمول یه مسئله تعریف میکنیم و اقدام به حل کردنش میکنیم.

 

تعریف مسئله :
 

در نظر داریم با استفاده از تایمر/کانتر صفر، یک موج PWM با فرکانس 50 هرتز و دیوتی سایکل 30 درصد بسازیم.

 

اول یه کم محاسبات انجام میدم تا متوجه بشید که اصلا معنای فرکانس و دیوتی سایکل در اینجا چی هست ؟!

 

 

F= 50 Hz

T = 1/50 Hz = 0.02 s = 20 ms

 

 

 

T = Ton + Toff = 20 ms

 

 

Duty Cycle = 30 %

 

Ton = 6 ms

Toff = 14 ms

 

اینا هم خداییش توضیحی لازم نداره !

یه دو دوتا چهارتای ساده ست !

 

از کلیه این محاسبات نتیجه گرفتیم که مدت زمانی که در یک دوره موج خروجی باید سطح یک (5+ ولت) داشته باشه 6 میلی ثانیه است !

و همچنین مدت زمانی که موج خروجی باید سطح صفر (0 ولت) داشته باشه نیز 14 میلی ثانیه است.

 

داریم راجع به موج مربعیه صحبت میکنیمااااا !!!

 

کلیه اینکار ها انجام میشه تا دیوتی سایکل 30 درصد و فرکانس 50 هرتز ساخته بشه.

 

از اینجا به بعد باید رجیسترهای مربوط به تایمر/کانترمونو برنامه ریزی اولیه کنیم.

لازم بذکره که با استفاده از مد PWM کلیه محاسبات و فرایند تولید موج PWM توسط پردازنده میکروکنترلر انجام میشه و نیازی به برنامه نویسی برای این کار نیست.

 

از تایمر/کانتر شماره صفر استفاده میکنیم.

 

یه سری بزنیم ببینیم رجیسترهاش چیا بودن ؛

 

بررسی رجیستر TCCR0 :

 


قبل ترها در مورد تایمر/کانتر صفر به تفصیل توضیح داده شد.

 

اما بحث ما سر دو تا بیت با عنوان های WGM00 و WGM01 هست.

 

بیت های 3 و 6 ؛ WGM01:0 – Waveform Generation Mode :
 

 

میبیند که انتخاب مد PWM با انتخاب WGM01:00 بصورت 01 یا 11 قابل انجامه !

 

بیت های 4 و 5 ؛ COM01:00 – Compare Match Output Mode :

 

 

جدول بالا مربوط به مد Fast PWM تایمر/کانتر صفر میباشد.

یادآوری : یه پایه ای داریم به نام OC0 که به پایه مقایسه ای خروجی تایمر/کانتر صفر معروفه !

برای این کاری که ما میخوایم انجام بدیم از جدول بالا سطرهای سوم یا چهارم رو انتخاب کنیم.(همون Inverting و Non-Inverting)

 

گفتیم که کلیه فعالیت های مربوط به محاسبات مد PWM توسط CPU و بصورت کاملا سخت افزاری انجام میشه،یعنی مثل مدهای کاری دیگه تایمر/کانتر یعنی Normal و CTC لازم نیست که زیاد درگیر برنامه نویسی بشیم و با تنظیم رجیسترها به خواسته مون میرسیم !

 

برای ساخت موج با دیوتی سایکل و فرکانس مورد نیاز تنها کاری که باید انجام بدیم اینه که مشخص کنیم که چه بلایی سر پایه OC0 مون بیاد!تا در خروجی یه شکل موج با مشخصات دلخواه داشته باشیم.

اگه حالت 10 انتخاب بشه،پایه OC0 پس از تطبیق با مقدار مقایسه ای مون،صفر بشه و در نقطه BOTTOM یک بشه.

اگه حالت 11 انتخاب بشه،پایه OC0 پس از تطبیق با مقدار مقایسه ای مون،یک میشه و در نقطه BOTTOM صفر بشه.

 

جدول بالا برای مد Fast PWM بود.

اگه خواستیم از مد Phase Correct PWM استفاده کنیم،جدول مربوط به بیت های COM01:00 به قرار زیر میشود :

 

 

در ضمن یادتون نره که بیت های CS00 و CS01 رو هم برنامه ریزی کنید.

 

تا اینجا فقط،تایمر/کانتر صفرمونو در مد PWM تنظیم کردیم و بهش گفتیم میخوایم ازش برای ساخت موج PWM استفاده کنیم.

اما بهش نگفتیم که چه دیوتی سایکلی داشته باشه !

خودش هم که علم غیب نداره! باید بهش بگیم !!! laugh

 

نکته جالبی که وجود داره اینه که هر عددی که در رجیستر OCR0 ما ذخیره بشه نقش دیوتی سایکلو بازی میکنه !

یعنی چی ؟

ببینید :

 

OCR0 = DutyCycle = 30 % = 30 % of 255 = 76.5 ==> تقریبا 76

 

خب ...

بریم سراغ برنامه نویسی ...

 

#include <mega32.h>

توضیح نمی‌دم cheeky

 

void timer0_configuration (void){
TCCR0 = (1<<WGM00) | (1<<WGM01) | (1<<COM01) | (1<<CS00); //Fast PWM Mode,Non-Inverting,No Presacling
DDRB = (1<<PB3); //OC0 Pin Set As Output
}

یه تابع تعریف کردیم به نام timer0_configuration که کلیه تنظیمات مربوط به تایمر/کانتر صفر در اون انجام میشه.

همه چی واضحه(البته برای اونایی که مطالب وبلاگو از اول دنبال کردند !)،ضمن اینکه روبروی هر خط توضیحاتشو هم نوشتم !

 

پین B3 رو هم بعنوان خروجی تنظیم کردیم.

 

void main(void){

timer0_configuration();

while(1){  //Loop For Ever

OCR0 = 76; // Dutycycle

}

} 

این هم تابع main ماست.

اول داخلش تنظیمات تایمر/کانتر صفر فراخوانی شد.

بعد از اون یه حلقه بی نهایت گذاشتیم و داخلش رجیستر OCR0 رو طبق اون نکته ای که گفتم با مقدار دیوتی سایکل برابر قرار میدیم.

 

والسلام ...

با این برنامه یه موج مربعی در حالت Non-Inverting ساختیم که دیوتی سایکل 30 درصد و فرکانس 50 هرتز داره.

 

یه مثال دیگه میزنم؛که اینقدر نگید بیشتر مثال بزن !

 

مسئله :

میخوایم یه فلاشر با LED بسازیم.

اما اشتباه نکنید !

منظور ما فلاشری مثل فلاشرهای قبلی نیست.

میخوایم نور LED رو کم و زیاد کنیم.

 

برنامه :

 

#include <mega32.h>
#include <delay.h>

timer0_configuration(void){
TCCR0 = (1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
DDRB = (1<<PB3);
}

unsigned int brightness;

void main(void){

timer0_configuration();

while(1){  //Loop For Ever

for(brightness=0;brightness<255;bightness++){  // Loop For Increasing Brightness

OCR0 = brightness;
delay_ms(10);

}
for(brightness=255;brightness>0;brightness--){  //Loop For Decreasing Brightness

OCR0 = brightness;
delay_ms(10);

}
}

}  

 

برنامه از دو تا حلقه For تشکیل شده که اولی وظیفه‌ی افزایش نور LED رو به عهده داره و دومی وظیفه‌ی کاهش نور LED رو.

یه تاخیر 10 میلی ثانیه ای هم گذاشتیم برای اینکه متوجه این کاهش و افزایش بشیم !

 

خب این هم از بنامه نویسی و کلا مد PWM...

 

یه نکته ای رو هم خدمتتون عرض کنم،اونم اینکه هیچ وقت با خوندن متنای بنده هوا برتون نداره !

تمامی این مطالبی که برای PWM مطرح و آموزش داده شد،جزو مسائل دم دستی و در ساده ترین صورت ممکن بود.

اما اگه کسی بخواد از زیر و بم PWM سر در بیاره،باید بیشتر تحقیق کنه و اگه علاقه مند بود از دیتاشیت هم استفاده کنه.

کلا بحث نکته خیزیه!(البته مخاطب بنده کسانی نیست که برای پاس کردن درس این پستو میخونن ! angry)

اینو گفتم که بدونین قضیه به این سادگی هم نیست.frown


منبع : www.noise.blog.ir

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی