PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : راه اندازی سروو موتور با pic با دقت بالا



iman7107
05-02-2011, 02:16
با سلام خدمت دوستان عزیز
من می خواستم 2 عدد سروو موتور رو با PIC18F452 راه اندازی کنم. به این صورت که میکرو با کامپیوتر با RS232 ارتباط برقرار می کنه و زاویه این 2 سروو رو از کامپیوتر دریافت می کنه.
موفق به این کار شدم ولی مشکلی که وجود داره اینه که نمیتونم سروو رو خیلی دقیق درایو کنم. البته مجبور شدم از اسیلاتور خارجی 32MHz استفاده کنم با این حال تونستم 180 درجه رو به تقریبا 160 قسمت تقسیم کنم. همونطور که می دونین سروو 180 درجه حرکت می کنه. من میخوام دقت حرکت یک سوم درجه یا بیشتر باشه. یعنی هر درجه رو به سه قسمت یا بیشتر تقسیم کنم. در واقع 180 رو به 540 یا بیشتر قسمت تقسیم کنم. ممنون می شم اگه راهنمایی کنید. آیا اصلا با این میکرو میشه این کارو کرد یا نه؟ در ضمن اگه سوال من واضح نبود بفرمایید تا بیشتر توضیح بدم.

iman7107
06-02-2011, 11:29
باز هم سلام.
از دوستان عزیز کسی پاسخ این سوال رو نمی دونه؟
فکر نمی کردم اینقدر سوال سختی باشه.
ممنون می شم اگه می دونین کمک کنید.

1nafar
06-02-2011, 16:19
سلام
همه چیز بستگی به سرور داره ، مثلا ما قبلا روی یه سرور کار میکردیم ( توی سایت مطالبش هست ) که برای راه اندازیش باید پالسی مطابق شکل زیر ور بهش میدایم :
You can see links before reply
این سرور به ازای هر 270 میکرو ثانیه که به طول پالس اضافه میشد یک درجه حر کت میکرد .
از طرفی تایمر های میکرو زمانی رو که بوجود میارن از روی بیت و پرسیکال تایمر و همچنین کریستال میکرو تعیین میشه . به همین دلیل هم نمیشه یک زمان خطی بوجود آورد .
دقیقا نمیدنم متوجه منظورم میشید یه نه ، اگه بتونید نام یا دیتا شیت سرور و کامپایلری که باهاش کار میکنید رو بزراید میتونم بیشتر توضیح بدم

iman7107
07-02-2011, 01:49
سلام.
ممنون از پاسختون.
من از موتور MG995 و کامپایلر Mikroc استفاده کردم. البته الان یه موتور گرفتم به شماره 9805MG که طریقه راه اندازیش مثل همونه. و اینکه باید بگم می خوام با استفاده از تایمرها این کارو انجام بدم. آخه بعضی ها با Delay کار می کنن. این سروو ها یک پالس 50 تا 55 هرتز می گیرن. یعنی دوره تناوب 20ms . حال اگه پالس مورد نظر تو این 20 ms به اندازه 0.5ms یک باشه، موتور به زاویه صفر درجه میره و اگه به اندازه 2.5ms یک باشه به زاویه 180 درجه میره. یعنی بازه 180 درجه رو با تغییر Pwm از 0.5ms به 2.5ms میزنه. با این نکات مشخصه که مثلا برای 90 درجه باید به اندازه 1.5ms از پالس رو یک کنیم. کلا سختی درایو کردن سروو موتورها اینه که محدوده کنترل اونا خیلی کمه یعنی همون از 0.5 تا 2.5 میلی ثانیه که میشه 2 میلی ثانیه. حالا اگه بتونیم این 2ms رو به قسمتهای کوچکتری تقسیم کنیم دقت ما بیشتر می شه. مثلا اگه اونو به 4 قسمت تقسیم کنیم هر قسمت میشه 0.5ms . این یعنی 0.5ms و 1ms و 1.5ms و 2ms و 2.5ms رو داریم. یعنی فقط می تونیم به زاویه های 0 درجه، 45 درجه، 90 درجه، 135 درجه و 180 درجه دسترسی داشته باشیم. حالا اگه 4 قسمت بشه 8 قسمت ما به زوایای بین زاویه های گفته شده هم دسترسی داریم. یعنی زوایای 0 و 22.5 و 45 و 67.5 و 90 و 112.5 و 135 و 157.5 و 180 . پس هر چقدر تقسیم ما بیشتر باشه کار ما دقیق تره. البته این مقدار تقسیم برای کار من اصلا مناسب نیست. چون میخوام سروو یک چهارم یا یک سوم درجه بزنه. پس باید این 2 میلی ثانیه رو به 540 یا 720 قسمت تقسیم کنم. اون وقت 0.5ms زاویه 0 درجه، 0.5027777ms یک چهارم درجه، 0.5055555ms دو چهارم یا نیم درجه و .... وهمینطور به ازای هر یک چهارم درجه باید مقدار یک بودن پالس ما به اندازه 0.00277777 میلی ثانیه تغییر کنه که این عدد از تقسیم 2 به 720 بدست می آد. 720 هم که از ضرب 180 در 4 بدست می آد. یعنی 2 میلی ثانیه رو به 720 قسمت تقسیم کردیم و باز هم این یعنی 20 میلی ثانیه کل پالس رو باید به 7200 قسمت تقسیم کنیم. حالا اگه بخواهیم به 0 درجه بریم باید از این 7200 قسمت، 180 قسمت رو یک و 7020 قسمت رو صفر کنیم. که مجموع 7020 و 180 میشه همون 7200 . برای دستیابی به زاویه 45 درجه باید 360 قسمت رو یک و 26840 قسمت رو صفر کنیم. برای 90 درجه 540 قسمت و .... همونطور که می بینید برای زوایای 0 تا 45 درجه باید بین 180 تا 360 قسمت تغییر داشته باشیم. که بازش میشه 180 قسمت. یعنی هر زاویه به 4 قسمت تقسیم شد. امیدوارم تونسته باشم منظورم رو کامل بیان کنم. حال من می خوام این پالس رو ایجاد کنم. البته نمی دونم بشه با این PIC ها این کارو کرد یا نه. شاید باید از میکروهای با فرکانس های بالاتر استفاده کرد. با تشکر.

1nafar
07-02-2011, 09:30
سلام
توی آدرس زیر نحوه ی انجام دادن محاسبات مربوط به تایمر توضیح داده شده .
You can see links before reply
همون طور که می بنید با تایمر های 8 و 16 بیتی میکرو کنترلر های pic ، در صورتی که فرکانس میکرو برابر با 32 مگاهرتز ( که در داخل میکرو به 4 تقسیم میشه ) و مقدار prescaler رو هم 2 در نظر بگیریم ، مقدار زمان برابر خواهد بود با:
Ft/c= Fosc/4
1/(8MHz/2/256) = 64us
روش دومی که وجود داره اینه که برای تایمر یه مقدار اولیه در نظر بگیریم ، مثلا در رجستر مقدار تایمر رقم 255 رو قرار بدیم تا تایمر بعد از شمردن یک رقم سرریز بشه ، در این صورت زمان ما میشه :
Ft/c= Fosc/4
1/(8MHz/2/1) =500ns
این زمان حداقل مقداری هست که ما میونیم با pic بوجود بیاریم ، اما این وسط یک مشکل دیگه وجود داره ، میکرو در هر پالس کلاک یک دستور اجرا میکنه ، یعنی با فرکانس 32 مگا هرتز هر دستور در 0.000000125 ثانیه اجرا میشه ، پس ما نمیتونیم هر مقداری رو برای تایمر در نظر بگیریم .
عاقلانه ترین راه این هست که شما زمان پایه ی 2.78 میکرو ثانیه رو ایجاد کنید و بعد با یک دستور شرطی از این زمان برای بدست آوردن زمان های دیگه استفاده کنید .
طبق محاسباتی که من انجام دادم ، در صورتی که میکرو با فرکانس 32 مگا هرتز کار کنه و مقدار prescaler هم برابر با دو باشه ، اگه به تایمر ( تایمر های 8 بیتی ) مقدار اولیه 245 رو بدی میتونی زمان 2.75 میکرو ثانیه رو ایجاد کنی .

( وقتی که به تایمر مقدار می دیم ، دو تا از پریود های اون از بین میرن ، مثلا توی همین مقدار 245 ، مقداری که تایمر میشماره برابره با 9 + 2 یعنی 11 میشه ) .

این برنامه رو باید تست کنی و ببنی میکرو میتونه انجامش بده یا نه ( من خودم با میکرو بیسیک کار نکردم ، وگرنه حتما برات برنامه رو مینوشتم ) .

iman7107
07-02-2011, 21:45
سلام.
با تشکر.
یه سوالی واسم پیش اومده. اینکه چرا Prescale رو 2 گرفتی؟ چرا یک نگرفتی؟
اگه یک می گرفتی که بهتر می شد. اونوقت می شد بجای 245 مقدار 236 رو به عنوان مقدار اولیه داد.
البته باز هم فکر می کنم که میکرو نتونه اجراش کنه. اونوقت باید حجم برنامه اصلی و برنامه داخل Intrupt خیلی خیلی کم باشه و از اونجاییکه من با سریال هم کار می کنم فکر نکنم حجم برنامه کم بشه.
با این وجود یا باید فرکانس رو بالا ببرم که تا 40MHz بیشتر نمیشه بالا بردش یا باید میکروی دیگه ای رو پیدا کنم. تو خانواده PIC میکروای داریم که فرکانس بالاتر رو ساپورت کنه و ترجیحا 2تا پورت سریال داشته باشه؟
و یه چیز دیگه، بنده عرض کردم با MikroC (میکرو سی) کار می کنم نه میکرو بیسیک.:0013:
و این که من خودم این کارو انجام دادم و نتونستم مقدار اولیه تایمر رو از 195 بیشتر بدم. وقتی بیشتر از 195 می دادم، قسمت اصلی برنامه درست اجرا نمی شد. یعنی اختلاف تا سرریز باید حداقل 60 تا می بود تا درست کار میکرد.
ممنون می شم به سوالاتم جواب بدین.

1nafar
08-02-2011, 11:20
سلام
شما برنامه رو به صورت عملی تست کردید ؟

با این وجود یا باید فرکانس رو بالا ببرم که تا 40MHz بیشتر نمیشه بالا بردش یا باید میکروی دیگه ای رو پیدا کنم. تو خانواده PIC میکروای داریم که فرکانس بالاتر رو ساپورت کنه و ترجیحا 2تا پورت سریال داشته باشه؟
فکر کنم PIC24HJ32GP202/204 بدرد شما بخوره ( باید دیتا شیت ها رو ببنید )

و یه چیز دیگه، بنده عرض کردم با MikroC (میکرو سی) کار می کنم نه میکرو بیسیک
من با ccs کار کردم
.................................................. .........................
شما باید با توجه به فرمول های بالا مقادیر رو تغییر بدید تا بتونید زمان رو ایجاد کنید ، اگه امکان مقدار دهی تایمر وجود نداره ، توی میکرو سی ، مقدار دهی مستقیم رجیستر ها رو انجام بدید .
در کل بهتره برنامه ای که نو شتید رو بزارید .

jafar2000
25-05-2011, 19:14
با سلام
منم دوتا از این سرو موتور های مدل 9805mg دارم که میخام اونها رو با avr و زبان بیسیک رواهاندازی کنم البته با دقت یک درجه لطفا منو در این مورد راهنمایی کنید

hamid_reza
20-06-2013, 21:50
سلام
در مورد این موضوع یک سوال دارم؟؟
ببینید اگر فرض کنیم که بشه با تایمرهای یک میکرو حالا چه pic و چه avr یا هر چیز دیگه ای , این زمانهای کوچک را بوجود بیاریم , آیا سروو این زمانهای کوچک را حساب میکنه؟؟ آخه سرووها یه چیزی به نام زمان مرده یا یه همچین چیزی دارند که اگه تغییر عرض پالس از اون حد کوچکتر باشه , اون را به حساب نمیارند و حرکت نمیکنند!!!
در مورد این مسئله هم بد نیست توضیح بدید!!

skiboys
20-06-2013, 23:41
سلام
من زیاد با این نوع سرووها کشتی گرفته ام شما به این زمان های کوچک با این نوع سرووها نخواهید رسید ( نیاز به سرووهای بهتری دارید)وقتی به صورت عملی تست کنید خودتان متوجه می شوید و دلیل اصلی ان این است که این سرووها به صورت خطی عمل نمی کنند تا یک جایی خطی می روند بعدش به صورت غیر خطی
البته اگه فقط یک موتور داشته باشید می توانید تا حد زیادی ناحیه خطی را از غیر خطی مشخص کنید ولی وقتی تعداد موتورهای زیاد شود یا ولتاژ و جریان مدار به هر علتی تغییر کند این نقطه جابجا می شود کاری که من انجام می دادم این بود که با تغییر پالس از طریق استفاده از پورت سریال و نرم افزار vb به صورت چشمی زاویه مورد نظر را حساب می کردم و مقدار مقایسه ای برای تایمر را بدست می اوردم :0013: