ايران ويج

نسخه‌ی کامل: موتور dc در بسکام
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2 3 4
خروجی این مدار در نقطه A فقط ولتاژ منفیه و مثبتی نداره برای همین اومدم با یه مقاومت 4/7 کیلو پول آپ کردم که بشه به اینتراپت یا هر پایه ای از میکرو وصل کرد
اون 7407 یه بافر که داخلش 6عدد گیت داره ولی شما یکی شو استفاده میکنید

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

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

پروژه همین بود . اولا چپگرد و راستگرد موتور . دوما نمایش دور موتور روی ال سی دی .

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

از اینکه باهام مدارا میکنید واقعا ممنونم .
مدارا...؟ داریم کمکت میکنیم !

پس متوجه شدیم که شما باید از اینها استفاده کنید
تایمر 0 و کریستال خارجی 32.768 کیلو هرتز
pwm برای تغییر دور موتور
ال سی دی کاراکتری برای نمایش اجزای برنامه
واحتمالا یه ای سی درایور که بتونه یه موتور dc رو درایو کنه که همونl298 خودتونه
انکودر ها و مداراتش کا راجع لهش بحث شد نمیدونم تا الان ساختینش یا نه اما اینن قسمت رو بالا برین پایین بیاین باید درست کنید تا بشه باهاش دور رو تشخیص داد

اینم یه مدار تو پروتوس
اساتید چک کنید ببینید چیا کم داره و کجاهاش مشکل داره
اطلاعاتی که از سایت ها در آوردم خیلی میتونه کمک کنه مثل اینها

بهترین روش برای اندازه گیری فرکانس های پائین اینه که از تایمر 2 بعنوان RTC استفاده کنی! یعنی زمان یک ثانیه دقیق باهاش ایجاد کنی و در مدت این یک ثانیه توسط تایمر صفر یا یک ، تعداد پالس های ورودی رو بشمری!

یه روش دیگه هم این هست که زمان تناوب پالس رو اندازه بگیری
وقتی که پایه ورودی پالس یک میشه ، تایمر شروع به شمرده کنه ، وقتی که پایه دوباره یک شد تایمر متوقف بشه .
از تقسیم کردن عدد 1(بستگی به انکودر داره ) به زمان شمرده شده توسط تایمر تعداد دور بدست میاد .
----------------
راستی نگفتین انکودرتون توی هر دور چند بار 0و یک میشه؟

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

روی مدار فرستنده گیرنده ، نوشته اید to micro یعنی به میکرو وصل شه . اما کدوم پروت ؟ فرقی نداره؟ هر پورتی وصل کردم فقط کافیه توی برنامه نویسی اونو output معرفی کنم . درسته؟

کریستالی که روی پایه های c6 و c7 هستش برای ایجاد پالس خارجیه؟اگر آره که هیچی . اگر نه برای قسمت کانتر احتیاج بهش داریم ؟

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

راستش رو بخواین تونستم برنامه چپ گرد و راستگرد رو خودم بنویسیم . اما هنوز قسمت تایمر و کانتر و شمارش دور رو درک نکردم . یه کم گنگه.
[تصویر:  Encoder.jpg]
این یه نمونه از انکودر های دو رنگ یه نمونه سوراحدار هم که اون بالا گذاشتم

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

نقل قول: هر پورتی وصل کردم فقط کافیه توی برنامه نویسی اونو output معرفی کنم . درسته؟
نه دیگه !شما میخواین با میکرو وارد کنید پس باید input تعریف بشه

برای اینه که بتونیم یه ثانیه رو دقیق بدست بیاریم با اون کریستال اصلی میکرو فرق داره
----------------
برای برنامه چپ گرد راست گرد هم من میگم یه جوری باشه که بشه با کلید تغییرش داد
و همین طور pwm رو بشه کم و زیاد کرد

برای دور موتور هم اینجوریه که وقتی شما یه تعداد دور بهش معرفی کردین موتور اگه زیر بار هم بره باید با زیاد کردنpwm سعی کنه به همون دور قبلی خودش برسه
الان مدارم این شکلیه:
http://www.up.98ia.com/images/abt9ky2b6g7d2wp478d3.zip

اما میخوام کانتر رو هم اضافه کنم که میشه این:
http://www.up.98ia.com/images/lawg64ktbtk3bj2nj4s.zip


نمیدونم اشکالش کجاست . لطفا یه نگاه بندازید .
برنامه ي اولي كه ظاهرا درسته .
برنامه ي دومي هم دوبارهه 2 تا END دارهه !!

در مورد ايده ي درست كردن زمان 1 ثانيه با استفاده از كريستال خارجي و تايمر2 بايد بگم ايده ي جالبيه ...
امابنظرم فعلا اگر به صورت نرم افزاري زمان 1 ثانيه رو با كد زني درست كني بهتر باشه ( از نظر يادگيريش ! )
نقل قول: Config Timer0 = Counter , Edge = Rising
Config Int0 = Falling
Config Int1 = Falling
بنظرم بهتره از تايمر 1 براي شمارش استفاده كنيد ، چون بدون اينكه بخواهيد وقفه اش رو راه بندازيد قادر هست تا 65536 تا بشمارهه ... ( براي تعداد دورهايي كه موتور در 1 ثانيه مي زنه مناسبه چون مطمئنن بيش از اين مقدار رو نياز نداريد )

نقل قول: Enable Interrupts
Enable Int0
Enable Int1
خط Enable Interrupt رو بهترهه بعد از تمام كانفيگ هايي كه مربوط به فعال سازي وقفه هاي بخش هاي مختلف هست بذاريد.

نقل قول: Dim B As Byte
On Int0 Left_1
On Int1 Right_1
On Timer0 M
از تايمر 1 براي شمارش استفاده كنيد و وقفه هم فعلا نيازي نيست ، از تايمر 0 ( همراه با وقفه اش ) مي تونيد براي ساختن زمان 1 ثانيه استفاده كنيد.
نقل قول: Do
Locate 2 , 2
Lcd Counter0
Waitms 200
Loop
End
قبل از دستورات LCD معمولا اكثر اوقات از Cls استفاده مي كنيم تا صفحه پاك بشه و از نو نوشته بشه. اينطوري بدون پاك شدن صفحه مقادير روي هم ديگه نوشته مي شه و بخشي كه مقدار رو نشون مي دهه بعد از يه مدتي مقادير عجيب نشون مي دهه كه طبيعي هم هست.

از همينجا كه END برنامه خورد ، حالا از اينجا به بعد بايد Label هاي وقفه و يا سابروتين ها و يا تابع ها رو بنويسيد.
در مورد شما ( label وقفه ها رو بايستي بنويسيد. )

نقل قول: M:
Incr B
Locate 2 , 3
Lcd " tedade dor motor "
Lcd B
Return
بنظرتون اين Label رو درست نوشتيد ؟! ( چون براي شمارش بوده ، طبق توضيحات بالا كه دادم نيازي نيست براي شمارش وقفه بذاريد. ) مي دونيد چه اتفاقي بايد بيفته تا روال وقفه اتفاق بيفته ؟!
ريجستر شمارنده اش ( براي تايمر0 كه يه ريجستر 8 بيتيه ) بايد 256 بار شمارش كنه كه به سبب سرريزي كه در آخرين شمارش بودهه وقفه رخ بده و بعد از اون دوباره از 0 شروع مي كنه به شمارش.
در واقع اينجا شما به ازاء هر 256 تا شمارش ، 1 واحد به شمارش تعداد دورها اضافه مي كنيد !!!!

نكته ي ديگه اينكه LCD كاراكتري 2*16 كه احتمالا شما هم از همون استفاده مي كنيد در هر سطر قادر به نمايش 16 كاراكتر هست ، بشماريد شما چند كاراكتر گذاشتيد ...
از Cls و Locate هم حتما در جاي مناسب استفاده كنيد تا اطلاعات درست نشون داده بشه ...
براي خلاصه تر شدن بجاي عبارت tedade dor motor مي تونيد بنويسيدRPS =

نقل قول: Do


Loop
End
اين DO_Loop و END اينجا چيكار مي كنه ؟!!!
اين عبارت ها رو پاك كنيد. شما قبلا END برنامه رو گذاشتيد. اينها اينجا هيچ معنيي نمي دن ...

نقل قول: Left_1:
Portd.0 = 1
Portd.1 = 0
Locate 1 , 1
Lcd " rast gard "

Return


Right_1:
Portd.0 = 0
Portd.1 = 1
Locate 1 , 1
Lcd " chap gard "
Return
اين ها هم كه احتمالا درست هستن.
فقط بجاي chap gard و rast gard بهتره از ساعتگرد و پاد ساعتگرد استفاده كنيد كه به ترتيب مي شه CW و CCW

برنامه رو اصلاح كنيد و تصميم بگيريد زمان 1 ثانيه رو مي خواهيد با كريستال و تايمر2 بسازيد يا با تايمر2/تايمر0 و وقفه ، به صورت كد ؟؟
مشكلي بود بگيد.

موفق باشيد.
ممنون .

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

تایمر 1 کذاشتم .
enable interrupts رو که آخر نوشتم چرا میگید غلزه؟ درست کار میکنه که؟

کارایی که گفتید رو انجام دادم الان موتور روشن نمیشه اما rpm رو نمایش میده ولی خیلی کند میشمره . چرا؟ چون موتور نمیچرخه اینجوریه یا کلا کند میشمره؟

http://www.up.98ia.com/images/d350et3meyf3ahtpwvck.zip
مشکل داره هم تو برنامه هم تو مدارتون شما باید تو محیط شبیه سازی به جای اون سیم که از انکودر ها به میکرو وصل شده یه مولد موج مربعی بزارین و بهش فرکانس بدین
گفته هاي abbasalifix
+
مورد هايي رو كه گفتم كه كامل انجام نداديد ... !
مثلا شما با پايه هاي D0 و D1 بايستي CW يا CCW بودن چرخش رو به واسطه ي درايور مشخص كنيد. خوب ؟!
اصلا اين 2 پايه رو خروجي تعريف نكرديد !!
براي تايمر 1 گفتم نيازي به وقفه نيست. ( يعني label با نام M رو نيازي نداريد ! )
در حلقه ي DO_Loop داريد مقدار Counter0 رو نشون مي ديد !! ( از اون كه ديگه استفاده نمي كنيد !! )
همون محتويات M رو در DO_Loop بذاريد.
وقتي Timer1 رو براي شمارش انتخاب مي كنيد ، يعني سر و كارتون با پايه ي PB.1 هست. در سخت افزار اين مورد رو دقت كنيد.
در نرم افزار هم حتما اين پايه بايد ورودي تعريف بشه ...
Timer1 رو به عنوان شمارنده استفاده مي كنيد درسته ؟ پس Prescale گذاشتن براش چه معنيي مي دهه ؟!
در LAbel به نام M اون B رو چرا +1 مي كنيد ؟
چرا مقدار B رو روي LCD نمايش مي ديد ؟
بايد مقدار Timer1 رو نشون بديد ! ( البته گفتم M رو كلا بر داريد ... و در DO_Loop قبلي ازش استفاده كنيد. )
صفحه‌ها: 1 2 3 4