رفتن به مطلب

آمورش روباتیک از 0 تا 100(برنامه نویسی)


salamis

ارسال های توصیه شده

با سلام خدمت مهندسین گل

:icon_gol:

با مجموعه تاپیک های آموزش روباتیک از 0 تا 100 در خدمتتون هستم:

 

آموزش روباتیک از 0 تا 100(برق و الکترونیک)

 

آموزش روباتیک از 0 تا 100(برنامه نویسی)

 

آموزش روباتیک از 0 تا 100(سوالات و پیشنهادات)

 

همون طور که می دونید علم روباتیک از سه شاخه زیر تشکیل شده:

1.برق

2.مکانیک

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

که در این تاپیک آموزش های مربوط به برنامه نویسی ارایه می شود.

در زمینه میکرو به برنامه نویسی خانواده ی AVR به زمان C خواهیم پرداخت.پس لازم است برنامه زیر رو تهیه کنید.

 

ydkhnlq2fpl9dhmec834.jpg

 

در ادامه کار هم اگر به برنامه اینترفیس رسیدیم با Visual .Net کار می کنیم.

لطفا سوالات و اشکالات و ... در مورد آموزش ها را در تاپیک آموزش روباتیک از 0 تا 100(سوالات و پیشنهادات) مطرح کنید و تو این تاپیک اسپم ندید.

از تمام دوستانی هم دعوت می کنم اگر امکانش براشون فراهم است برای پیش بردن تاپیک های آموزش همکاری کنن تا ما هم از اطلاعاتشون استفاده کنیم.

کسانی هم قصد همکاری در تاپیک دارن در ارتباط باشن.

با تشکر

  • Like 19
لینک به دیدگاه

خوب همونجور که گفتم اولین پروژه کار روی یک مسیریاب هست.

قبل از این بهتره واسه کامل بودن آموزش چندتا برنامه بنویسیم تا همه بتونن از آموزش استفاده کنن حتی کسانی که با code vision آشنایی ندارن.

خوب تو این پست با code wizard آشنا می شین.

یکی از ویژگی های ممتاز codevision که کار با اون رو ساده کرده قابلیت code wizard هست که به صورت گرافیکی اجازه تنظیم فیوز بیت ها رو به ما میده.

 

 

  1. بعد از باز کردن codevision از منوی Tools گزینه ی Code wizard رو انتخاب کنید تا پنجره زیر باز شود:

ta3gottsxgerdv5ihcdd.png

 

که در این پنچره باید نوع میکرو رو مشخص کنید.ما نوع Atmega را مورد بررسی قرار می دیم پس همون گزینه اول رو ok می کنیم تا صفحه code wizard به صورت زیر باز شود:

 

 

wchxfxudatw4cji6lt5.png

 

در تب chip باید مدل میکروکنترلری رو که باهاش کار می کنید رو انتخاب کنید. در هنگام انتخاب میکرو برای یک پروژه باید این انتخاب را بر اساس نیاز هامون انجام بدیم.مثلا اینکه به چندتا port نیاز داریم؟؟ به چندتا Timer نیاز داریم؟...

بعد از انتخاب نوع تراشه به تب Ports بروید.

یه توضیحاتی راجع به port ها بدم:

هر تراشه از تعدادی پورت تشکیل شده که اون ها رو با حروف بزرگ انگلیسی مشخص می کنند A,B,C,D..

هر پورت متشکل از 8 پایه از تراشه می باشد که به این صورت مشخص می شوند(نمایش پایه های پورت A ی ) PA0,PA1,PA2....

هر پایه ی پورت ها به دو صورت ممکن است مورد استفاده قرار بگیرد:

1.به صورت ورودی / خروجی

2.هر پایه یک کاربری دیگر هم دارند که از دیتاشیت قابل استخراج است.

(بعدا در این زمینه توضیحات تکمیلی داده میشود)

 

فرض کنید می خواهیم از پایه ای به عنوان I/O استفاده کنیم.اگر پایه ای را به عنوان خروجی مشخص کردیم باید شرایط اولیه آن را نیز مشخص کنیم(در ابتدای کار 0 باشد یا 1)

و اگر به صورت ورودی تعریف شد باید مشخص کنیم که درای مقاومت pull-up داخلی می باشد یا نه. این ویژگی به ما کمک می کند که بدون قرار دادن مقاومت خارجی در پایه جریان را محدود کنیم.

شما به پورت A رفته و تمام پایه ها را خروجی کنید.و شرایط اولیه را نیز 0 قرار دهید.

بعد از بالای پنجره دکمه چرخنده را بزنید(generate,save and exit) .

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

و سپس مشاهده می کنید که سورس کد های مربوطه ساخته می شوند.

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

  • Like 18
لینک به دیدگاه

خوب در قسمت قبلی با تب پورت و چیپ در code wizard آشنا شدیم(در قسمت های بعدی بسته به نیاز با بخش های دیگر نیز آن آشنا می شویم).

پس تا اینجا یاد گرفتیم که چطور با استفاده از کد ویزارد پایه های پورت ها رو خروجی با ورودی کنیم.

در ابتدا می خوام شما رو با بخش های مختلف کدی که توسط برنامه ساخته شده آشنا کنم.

comment: کامنت به بخش های از برنامه گفته می شود در توسط برنامه کمپایل نمی شوند و نقش توضیحی برای کاربر و برنامه نویس رو دارند.

که به دو ضورت می توان کامنت گذاشت:

 

1. با قرار دادن // در سمت چپ یک خط آن خط را به کامنت تبدیل کنید.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

2. با قرار دادن */ در ابتدای یک بخش و /* در آخر آن کل نوشته های بین آن ها تبدیل به کامنت می شود.این فرمت برای کامنت کردن بیش از یک خط به کار می رود.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

 

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


بعد از کامنت ها اولین بخشی که به چشم می خورد کد زیر است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

دستور include کتابخانه های مختلف را به کد ما اضافه می کند.

کتابخانه چیست؟؟؟؟

ببینید ساده بخوام بگم برای این که برای کد یه سری چیزا رو تعریف کنیم نیاز به کتابخانه ها داریم .

مثلا اگر از atmega32 استفاده می کنیم باید به برنامه بفهمانیم که در atmega32 پورت D پایه های 14 تا 21 را شامل می شود.یا اینکه پایه های 33 تا 40 برای آنالوگ به دیجیتال استفاده می شوند و ....

ما با دستور بالا تمام این موارد را برای کد مشخص می کنیم در واقع تراشه atmega 32 را به برنامه معرفی می کنیم.

 

حالا می خوام شما رو با یه یک کتابخانه دیگه هم آشنا کنم.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

این کتابخانه برای ایجاد تاخیر های زمانی در برنامه استفاده می شود. یعنی اگر خواستیم تو برنامه تاخیر ایجاد کنیم ابتدا کتابخانه ی تاخیر را اضاف کنیم سپس

در محلی که نیاز به تاخیر داشتیم از دستور زیر استفاده می کنیم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

دستور بالا تاخیری به اندازه 200 میلی ثانیه ایجاد می کند.توجه کنید اگر کتابخانه تاخیر را در ابتدای برنامه اضافه نکرده بود کد بالا را نمی شناخت.

خوب تا اینجا واسه کتابخانه ها کافیه!

 


بریم به ادامه برنامه بپردازیم.

در خط بعدی یک کامنت به صورت زیر مشاهده می کند

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

شما باید قبل از Main در همین قسمت متغیر هایی که می خواهید در کل برنامه استفاده کنید رو تعریف کنید.

 


 

قسمت اصلی برنامه متد Main است. که می بینید برنامه تنظیمات اولیه پایه ها ، تایمر ها و ... رو انجام داده. فعلا کاری به این ها نداریم.بریم به آخر کد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

احتمالا با دستور while آشنا هستید. کد های داخل بلوک while تا زمانی که آرگومان جلوی while از لحاظ منطقی true باشد انحام می دهد.به این ترتیب این یک حلقه ی بی نهایت است. چون آرگومان آن همواره درست است.

 


خوب حالا می خوایم ببینیم چطور می تونیم با پایه های یک پورت در ارتباط باشیم.

تو این قسمت می خواییم یک led رو به پایه ی PA0 وصل کنیم و جوری برنامه ریزیش کنیم که روشن و خاموش بشه.

(PA0 را باید به صورت خروحی تعریف شده باشد)

 

مهم:

اگر پایه ای به صورت خروجی تعریف کنیم برای مقدار دهی به آن از کد زیر استفاده می کنیم.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

این دستور پایه ی صفرم پورت A را یک (set) می کند.

اگر پایه ای به صورت ورودی تعریف کنیم برای خوندن مقدار اون به صورت زیر باید عمل کنیم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

دستور بالا مقدار پایه ی صفرم از پورت A رو می خونه و اون رو تو متغییر i دخیره می کنه.

 

خوب مداری که ما بهش نیاز داریم به شکل زیر است که باید اون رو با پروتئوس ببندید به صورت زیر:

 

12fn3xbzctm36evi858.png

 

 

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

توضیح کد: (کتابخانه تاخیر باید به ابتدای کد اضافه کرده باشیم)اگر مطالب این بخش رو متوجه شده باشید عملکرد کد واضح است. اول led رو روشن میکنه . 30 میلی ثانیه توقف میکنه.بعد خاموش میشه و بعد از

30 میلی ثانیه دوباره روشن میشه و .....

 


 

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

 

آموزش روباتیک از 0 تا 100(برق و الکترونیک)

راجع بهش صحبت شده.

 

ساخت فایل اجرایی از برنامه:

شما در کد ویژن برنامه رو که کامل کردید از منو project کد خودتون رو compile کنید تا خطا هاس احتمالی رو پیدا کنه . بعد از رفع اشکال از منو project دستور build رو بزنید به این ترتیب می تونید فایلی با پسوند COFF به وجود می آید که از آن در پروتوس برای شبیه ساری مدار استفاده می کنیم.

در ادامه فایل های برنامه با شبیه سازی پروتوس ش رو قرار می دم.

 

پایان

 

منتظر نظراتتون برای ادامه بهتر مطالب هستم.

آموزش روباتیک از 0 تا 100(سوالات و پیشنهادات)

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

  • Like 17
لینک به دیدگاه
  • 3 هفته بعد...

خوب تا اینجا فهمیدیم چطوری یه خط خروجی رو راه اندازی کنیم. در این می خواهیم نحوه ورودی خوندن رو ببینیم.

همون مثال قبل رو در نظر بگیرید با یه سری تفاوت های جزئی به صورت زیر طراحی می کنیم.

 

3zqh064uejgpepvmgibq.png

 

 

اون خط آبی رنگ رو تو بخش الکترونیک توضیح دادم.بهش میگن net.

یه کلید هم اضافه شده که مشخصه و از نوع spst می باشد.

حالا بریم سراغ برنامه ...........

اولین کاری که باید انحام بدیم اینه که پایه PC0 را به صورت ورودی و پایه های پورت A را به عنوان خروجی تعریف کنیم. در قسمت های قبل با کدویزارد این کارو می کردیم. اما حالا می خوام با رجیستری ها آشنا بشید.

 

DDRA:

data direction register A

این رجیستر جهت(ورودی و خروجی) پورت A را مشخص می کند و برای تمام پورت ها همچین رجیستری وجود دارد.DDRB , DDRC ,....

برای مقداردهی به این رجیستر از یک عدد باینری استفاده می کنیم.

مهم:

عدد یک در رجیستر DDRA به معنی خروجی

عدد صفر در رجیستر DDRA به معنی ورودی

و هر عدد نشان دهنده جهت پایه ی متناظر است.برای مثال اگر بگوییم

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

یعنی پایه های صفرم تا سوم پورت A به عنوان ورودی و پایه چهارم تا هفتم پورت A به عنوان خروجی تعریف شده اند.

توجه:

مثال بالا را می توانستیم به جای باینری با مبنا 16 نیز مشخص کرد به این ترتیب:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

مهم:

0b یعنی عدد جلوی آن باینری است.

0x عنی عدد جلوی آن مبنا 16 است.

 

پس در مسئله ای که ما قصد انجام آنرا داریم باید داشته باشیم:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

این قسمت ادامه دارد..................

  • Like 10
لینک به دیدگاه

در جلسه قبل با رجیستر های DDRA,DDRB,.... آشنا شدیم که برای مشخص کردن ورودی و خروجی پایه های پورت به کار می رود.

قبلا هم با رجیستر های PORT و PIN آشنا شده ایم.

جمع بندی:

اگر در پایه ای را به صورت خروجی تعریف کردیم با PORT به آن مقدار دهی می کنیم

اگر در پایه ای را به صورت ورودی تعریف کردیم با PIN مقدار آن را می خوانیم.

 

به ادامه کدنویسی برای مدارمون میرسیم.آرایشی که من مد نظرم هست اینه که اگر کلید زده شد LED ها از بالا تا پایین به ترتیب روشن بشن.

(شما می تونید آرایش های متنوع تری رو طراحی کنید)

 

در اینجا ما از دستور if استفاده می کنیم.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

if چک می کنه که ببینه آیا کلید زده شده است؟؟؟؟ اگه زده شده که مقدار پایه 1 می شود و حلقه if انجام می شود و اگر زده نشده باشد حلقه else انجام می شود.

در حلقه if هر 50 میلی ثانیه یکی از چراغ ها روشن میشه و در حلقه else هر 10 میلی ثانیه یکی از چراغ ها خاموش میشه.

چرا زمان خاموش شدن رو همون 50 میلی ثانیه نذاشتم؟؟؟(جواب بدین)

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

  • Like 9
لینک به دیدگاه

وارد یک بحث مهم به نام timmer میشیم.

چند نوع تایمر داریم که فعلا بحث پیرامون تایمر 0 می باشد.

(در بحث تایمر ها همزمان رجیستر ها رو هم برای درک بهتر بررسی می کنیم)

 

تایمر چیست؟

دارای یک رجستر می باشد که مقدار آن با پالس ساعت افزایش می یابد و با رسیدن به مقدار حداکثر به صفر بر می گردد و این روند ادامه دارد.

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

 

تایمر 0 داری یک رجیستر 8 بیتی به نام TCNT0 می باشد که محتویات تایمر را در خود جا می دهد و مقدار این رجیستر است که با هر پالس ساعت از 0 تا 0xFF افزایش می یابد.

 

OCR0 :compare register

این رجیستر یک عدد 8 بیتی را در خود نگه می دارد و در هر لحظه مقدار آن با مقدار TCNT0 مقایسه می شود و در صورت برابری وقفه ی compare match اتفاق می افتد.(البته در صورتی که مجوز این وققه فعال شده باشد).

 

رجیستر TCCR0 مسوول پیکربندی تایمر 0 می باشد:

 

gxcxq1gihd8awsnrssr.png

 

ما می توانیم تعیین کنیم که تایمر با چه پالسی کار کند(بیت های 0 تا 2 رجیستر TCCR0)

طبق جدول زیر:

i97bak08zo84yami0o5i.png

 

در حالت 000 که هیچ پالسی به تایمر اعمال نمی شود و عملا تایمر خاموش است.

در حالت 001 تا 101 پالس ساعت یا تقسیماتی از آن به تایمر اعمال می شود.

حالت 110 و 111 این امکان را می دهد که تایمر را با پالسی جداگونه نسبت به پالس ساعت راه اندازی کنیم. که این پالس را باید به پایه ی T0 (با توجه به دیتاشیت) اعمال کنیم.

 

تایمر 0 دارای 4 مد کاری است که به شرح زیر است:

Normal, fast pwm,pwm pahse correct, ctc

 

در ادامه راجع به عملکرد تک تک مد ها پرداخته می شود.

  • Like 8
لینک به دیدگاه

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

1.تایمر :ws3: : یعنی اجازه می دیم که تایمر با پالس ساعت میکرو کار بکنه و در هر بار overflow ما از وقفه ی سرریز تایمر استفاده می کنیم.به این ترتیب در فاصله های زمانی یکسان وقفه انجام می شود. واسه کارهایی که می خواییم در زمان های خاص تکرار شوند استفاده می شود.(مثل چک کردن صفحه کلید)

و یا اینکه می تونیم از وقفه ی compare match استفاده کرد(در لحظه ای اتفاق می افتد که مقدار تایمر با OCR0 برابر می شود)

پس چی شد؟ 2 تا وقفه داریم اینجا. سرریز یا compare match

 

2.ایجاد شکل موج: می توان با استفاده از تایمر موجی مربعی در پایه ی OC0 میکرو تولید کرد.(بعدا مفضلا راجع به این خاصیت بحث می شود)

3. کانتر: اگر تایمر را در حالتی بگذاریم که با پالس های خارجی تحریک شود می توان با خواندن مقدار تایمر تعداد پالس ها یا لبه های پالس های ورودی رو شمرد.

 

خوب می خوام مد ها رو بگم. در اینجا فرض کنید عملکرد اول مورد بحثمون هست.

 

NORMAL

 

در این مد مقدار تایمر به این صورت تغییر می کند.

wslhms9pbrwrsghf5lvb.png

 

یعنی مقدار تایمر (رجیستر TCNT0) با هز پالس از صفر تا 0xFF افزایش می یابد در 0xFF که سرریز انجام می شود وقفه سرریز اتفاق می افتد.

وقفه coppare match هم که در لحظه برابری انجام می شود.

اگر در حین عملکرد OCR0 تغییر کرد در همان لحظه این تغییرات اعمال می شود.

  • Like 6
لینک به دیدگاه

Fast pwm mode:

 

در این مد مقدار تایمر کاملا شبیه مد نرمال است:

wslhms9pbrwrsghf5lvb.png

یعنی مقدار تایمر (رجیستر TCNT0) با هر پالس از صفر تا 0xFF افزایش می یابد در 0xFF که سرریز انجام می شود وقفه سرریز اتفاق می افتد.

وقفه coppare match هم که در لحظه برابری انجام می شود.

مهم: تفاوت این مد با Normal این است که اگر در عملکرد تایمر OCR0 تغییر کند این تغییر وقتی اعمال می شود که تایمر برای اولین بار به 0 برسد.

 

 

CTC:

 

تایمر در این حالت از صفر افزایش می یابد و حداکثر مقدار تایمر در این حالت مقدار OCR0 است.(در لحظه ی برابری overflow اتفاق می افتد) پس با تغییر مقدار OCR0 می توان حداکثر تایمر را تغییر می کند.

اگر در حین عملکرد OCR0 تغییر کرد در همان لحظه این تغییرات اعمال می شود.

phase correct pwm mode:

 

در این مد رجیستر

(رجیستر TCNT0) از صفر تا 0xFF افزایش می یابد سپس از 0xFF تا صفر کاهش می یابد.

koj4a4mu96h9xrzdhpt.png

در اینجا به شکل مشهود over flow نداریم اما وقفه overflow در نقطه ی 0 تایمر رخ می دهد.

توجه می کنید فاصله بین دو وقفه سرریز 512 پالس است یعنی 2 برابر حالت های قبلی پس می توان با این مد زمان های بزرگتری رو اندازه گیری کرد.

وقفه coppare match هم که در لحظه برابری انجام می شود.

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

در جدول زیر هم خلاصه وار تقاوت های مد ها رو که ذکر کردم مشاهده می کنید.

 

xne2b9cum1qda0t81gx.png

 

در ادامه به کاربرد دوم تایمر ها یعنی ایجاد شکل موج در پایه OC0 است .

  • Like 8
لینک به دیدگاه
  • 2 هفته بعد...

خوب گفتیم کاربرد دوم تایمر ها ایجاد کردن شکل موج در پایه ی OC0 می باشد. دراین اینجا ما روی تایمر 0 بحث می کنیم.

در پست قبل گفتیم که 4 مد کاری داریم. با توجه مد کاری و پیکربندی رجیستر TCCR0 شکل موج تولید شده در پایه OC0 متفاوت خواهد بود.

بیت های com00 , com01 برای این منظور در گرفته شده اند.

 

در حالت های غیر PWM (مدهای normal و ctc):

ابتدا به جدول زیر توجه کنید:

wynb1fsf6esca1anzj.png

فرض کنید ما مقدار اولیه OC0 را 0 قرار داده باشیم و تایمر در مد غیر pwm باشد اگر عدد دوبیتی متشکل از com00 و com01

00 باشد : هیچ شکله موجی در OC0 ایجاد نمی شود و همراه مقدار آن 0 می باشد.

01 باشد: در هر بار برابری تایمر با مقدار OCR0( رخ دادن وقفه ی compare match ) مقداره پایه ی OC0 معکوس می شود.

10 باشد:در هر بار برابری تایمر با مقدار OCR0( رخ دادن وقفه ی compare match ) مقداره پایه ی 0 می شود.

11 باشد:در هر بار برابری تایمر با مقدار OCR0( رخ دادن وقفه ی compare match ) مقداره پایه ی 1 می شود.


 

یکی از کاربردی ترین حالات حالت دوم می باشد که یک شکل موج مربعی برای ما ایجاد می کند.

 

مشخصات موج ایجاد شده در این حالت :

 

در هر دو مد :duty cycle : 50%

 

برای نرمال فرکانس ثابت است اما برای CTC با تغییر مقدار OCR0 می توان مقدار فرکانس را تغییر داد.

 

در مد normal فرکانس موج ایجاد شده 8f81qszdx4r39d8a522.png

 

در مد CTC فرکانس ایجاد شده ynli5umtgtpath154c61.png

  • Like 5
لینک به دیدگاه

مد fast pwm mode

92rr90npyxtvsakhz3uc.png

 

 

 

 

 

فرض کنید ما مقدار اولیه OC0 را 0 قرار داده باشیم و تایمر در مد fast pwm باشد اگر عدد دوبیتی متشکل از com00 و com01

00 باشد : هیچ شکل موجی تولید نمی شود.

01 باشد: در هر بار برابری تایمر با مقدار OCR0( رخ دادن وقفه ی compare match ) مقداره پایه ی OC0 معکوس می شود.

10 باشد:در هر بار برابری تایمر با مقدار OCR0( رخ دادن وقفه ی compare match ) مقداره پایه ی 0 می شود و در لحظه 0 شدن تایمر دوباره مقدار پایه 1 می شود

به این حالت non-invert نام دارد.

11 باشد:در هر بار برابری تایمر با مقدار OCR0( رخ دادن وقفه ی compare match ) مقداره پایه ی 1 می شود و در لحظه 0 شدن تایمر دوباره مقدار پایه 0 می شود

به این حالت invert گفته می شود.

 

ویژگی های موج در این حالت:

duty cycle در این حالت متغییر است. برای محاسبه اش جایی چیزی پیدا نکردم خودم یه فرمول بدست آوردم.

برای 01 : %50

برای 10:

klbepb98sbz5gtl5f82v.png

 

برای 11: rixmzoka5tp2mdzypjr.png

 

 

 

 

فرکانس هم در این حالت ثابت است: xpzk1vr4z2n4lut45pw.png

  • Like 5
لینک به دیدگاه

مد phase correct pwm :

5rmtdqtrdf4z7mxzjlny.png

 

فرض کنید ما مقدار اولیه OC0 را 0 قرار داده باشیم و تایمر در مد fast pwm باشد اگر عدد دوبیتی متشکل از com00 و com01

00 باشد : هیچ شکل موجی تولید نمی شود.

01 باشد: در هر بار برابری تایمر با مقدار OCR0( رخ دادن وقفه ی compare match ) مقداره پایه ی OC0 معکوس می شود.

10 باشد:در هر بار برابری تایمر با OCR0(رخ دادن وقفه ی compare match) در حالت صعودی مقدار پایه OC0 صفر می شود و در هنگام وقفه compare match در حالت نزولی مقدار پایه 1 می شود.

 

11 باشد:در هر بار برابری تایمر با OCR0(رخ دادن وقفه ی compare match) در حالت صعودی مقدار پایه OC0 یک می شود و در هنگام وقفه compare match در حالت نزولی مقدار پایه 0 می شود.

 

ویژگی های موج در این حالت:

duty cycle در این حالت متغییر است. برای محاسبه اش جایی چیزی پیدا نکردم خودم یه فرمول بدست می آرم میزارم همینجا.

 

فرکانس هم ثابت است:

 

ztkmlygdjnxetiap2oab.png

  • Like 6
لینک به دیدگاه

با شناختی که نسبت به مد های تایمر پیدا کردیم باید در هر مورد بسته به نیازی که داریم از مد مورد نظر استفاده کنیم.

خلاصه ویژگی های موج تولید شده در هر مد رو در جدول زیر گذاشتم:

 

 

[TABLE=width: 500]

[TR]

[TD=align: center]فرکانس[/TD]

[TD=align: center]duty cycle[/TD]

[TD=align: center][/TD]

[/TR]

[TR]

[TD=align: center]cte[/TD]

[TD=align: center]cte[/TD]

[TD=align: center]normal[/TD]

[/TR]

[TR]

[TD=align: center]can change[/TD]

[TD=align: center]cte[/TD]

[TD=align: center]CTC[/TD]

[/TR]

[TR]

[TD=align: center]cte[/TD]

[TD=align: center]can change[/TD]

[TD=align: center]fast pwm mode[/TD]

[/TR]

[TR]

[TD=align: center]cte[/TD]

[TD=align: center]can chande[/TD]

[TD=align: center]phase correct pwm[/TD]

[/TR]

[/TABLE]

cte : ثابت

can change: متغیر

 

 

شاید این سوال پیش بیات که fast pwm mode و phase correct pwm چه فرقی دارند؟؟؟

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

 

code wizard کار ما رو راحت کرده و لازم نیست رجیسترها رو حفظ باشیم اما باید از مدها و عملکرد تایمر در هر مد آگاهی داشته باشیم.

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

  • Like 5
لینک به دیدگاه

مداری که در این تمرین قرار دادم به صورت زیر است:

 

qqo6prh1h0hilqslxzi6.png

 

 

 

 

 

در این تمرین چون ما می خواستیم duty cycle متغییر باشد از مد Fast pwm استفاده می کنیم و تنظیمات تایمر باید به صورت زیر باشد:

// Clock source: System Clock

// Clock value: 125.000 kHz

// Mode: Fast PWM top=0xFF

// OC0 output: Inverted PWM

 

بعد از باز کردن codewizard به تب Timmers بروید و به پیکربندی Timmer0 بپردازید و آن را مانند شکل زیر تنظیم کنید:

 

 

rg8lyj4yzvhirkt230ep.png

 

 

Logicstate وصل شده به پین PC0 دو وضعیت را برای مدار فراهم می کند.

اگر 0 باشد مدار در وضعیت دستی فعال می شود به این ترتیب که با زدن کلید وصل شد به PD0 به مقدار رجیستر OCR0 اضافه می شود و به این ترتیب duty cycle موج ایجاد شده در پایه OC0 افزایش می یابد.

 

کد مربوط به این قسمت:

 

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

 

اگر logicstate صفر باشد وضعیت اتوماتیک فعال می شود و مقدار OCR0 به صورت نرم افزاری افزایش می یابد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

نکته: لازم نیست که چک کنیم OCR0 به 256 رسیده است یا نه. با رسیدن به مقدار حداکثر به صورت اتوماتیک خودش overflow میشه.

  • Like 6
لینک به دیدگاه
  • 5 ماه بعد...
  • 10 ماه بعد...

راستي ميشه با اين پردازنده ها يك جوستسك يو اس بي كامپيوتر تر و تميز و با حال ساخت؟

چقدر دانش نياز داره؟

چقدر هزينه داره؟

لینک به دیدگاه
×
×
  • اضافه کردن...