قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 29-05-2014, 05:20 PM المشاركة 9   
افتراضي تم بحمدلله تحديث مشروع حيث تمت معالجه دقه زاويه



السلام عليكم

حيث تمت معالجه دقه زاويه لانه في مشروع السابق اذا وضعنا اكثر من محرك نحصل على نتائج خاطئه بسبب هو زمن تنفيذ الامر تشفيت لانه اساسا زاويه تعتمد على زمن بمايكرو ثانيه فاي اطاله بزمن تنفيذ اوامر يزيد من زمن تشغيل محرك سيرفو لانه من معروف محرك سيرفو له زمن بدايه ولتكن 1ms واقصى زمن نهايه ولتكن 2ms فاذا كان اقصى زاويه للمحرك هي 180 درجه فمعناه اي فمعناه 1ms تعني زوايه=0 و2ms هي زاويه 180 درجه ومابين 1 و2 نحصل على زاويه كما استنتاجها بنسبه وتناسب

لاحظو كود جديد للمكتبه
كود:
static void servo_init(char *port_servo,char *tris_servo,char pin_servo )
{
 *port_servo=*port_servo & ~(1<< pin_servo);// this mean made pin=0 from porta or b or ..
 *tris_servo=*tris_servo  & ~(1<< pin_servo);// made pin from porta or b or ...  is output
 
}
static void work_servo(unsigned int angle_servo , char *port_servo,char pin_servo , unsigned int min_pulse_micro_second_servo,unsigned int max_angle_servo)
{

  char pin_servo_on;char pin_servo_off;
  pin_servo_off=*port_servo;// put value for port to pin_servo_off
  pin_servo_on=*port_servo; //put value for port to pin_servo_on
  pin_servo_on |=(1<< pin_servo);// now set pin in port ex if pin_servo=5 then pin_servo_on.f5=1
  pin_servo_off &= ~(1<< pin_servo);// now clear pin in port ex if pin_servo=5 then pin_servo_on.f5=0
  
  min_pulse_micro_second_servo=min_pulse_micro_second_servo/10;//
  angle_servo=(angle_servo*100)/max_angle_servo;// divide 1000/10 =100 , 1000 mean change to microsecond ,  because Delay_Cyc result time in usec * by 10
  angle_servo=(angle_servo+min_pulse_micro_second_servo);

  *port_servo= pin_servo_on;// ex if pin_servo=2 , *port_servo (( this mean porta or b or ..))*port_servo =0b11110000; then *port_servo= pin_servo_on==>*port_servo= 0b11110010
  delay_cyc(angle_servo);// waitting time (( this time between min_puls and max_puls )) please see data sheet for serveo motor
  *port_servo = pin_servo_off;//// ex if pin_servo=2 , *port_servo (( this mean porta or b or ..))*port_servo =0b11110010; then *port_servo= pin_servo_off==>*port_servo= 0b11110000
 }
حيث قمت بعمليه تشفيت وعمل set للبن مطلوب للمحرك في متغير
ومتغير اخر يمثل ريسيت لنفس البن لانه كما قلنا عمليه تشفيت وعمل & او | تأخذ وقت طويلا يؤثر سلبا على نتيجه زاويه

في مشروع مرفق عليك بأدخال زاويه وعندما تغط على # سوف يطلب منك ادخال رقم محرك ثم اضغط # لينفذ امر

http://www.4shared.com/rar/yJ0Nb5pib...r_16f877a.html

او
http://up.top4top.net/downloadf-top4...702b1-rar.html

تحياتي

اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 30-05-2014, 05:32 AM المشاركة 10   
افتراضي


شرح عن التحكم بسيرفو
http://www.scribd.com/doc/223528733/...AA%D9%88%D8%B1

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

hamzazayyad
:: مهندس متميز ::
تاريخ التسجيل: Aug 2005
الدولة: موزنبيق
المشاركات: 696
نشاط [ hamzazayyad ]
قوة السمعة:
قديم 30-05-2014, 05:13 PM المشاركة 11   
افتراضي


السلام عليكم

حيث تمت معالجه دقه زاويه لانه في مشروع السابق اذا وضعنا اكثر من محرك نحصل على نتائج خاطئه بسبب هو زمن تنفيذ الامر تشفيت لانه اساسا زاويه تعتمد على زمن بمايكرو ثانيه فاي اطاله بزمن تنفيذ اوامر يزيد من زمن تشغيل محرك سيرفو لانه من معروف محرك سيرفو له زمن بدايه ولتكن 1ms واقصى زمن نهايه ولتكن 2ms فاذا كان اقصى زاويه للمحرك هي 180 درجه فمعناه اي فمعناه 1ms تعني زوايه=0 و2ms هي زاويه 180 درجه ومابين 1 و2 نحصل على زاويه كما استنتاجها بنسبه وتناسب

لاحظو كود جديد للمكتبه
كود:
static void servo_init(char *port_servo,char *tris_servo,char pin_servo )
{
 *port_servo=*port_servo & ~(1<< pin_servo);// this mean made pin=0 from porta or b or ..
 *tris_servo=*tris_servo  & ~(1<< pin_servo);// made pin from porta or b or ...  is output
 
}
static void work_servo(unsigned int angle_servo , char *port_servo,char pin_servo , unsigned int min_pulse_micro_second_servo,unsigned int max_angle_servo)
{

  char pin_servo_on;char pin_servo_off;
  pin_servo_off=*port_servo;// put value for port to pin_servo_off
  pin_servo_on=*port_servo; //put value for port to pin_servo_on
  pin_servo_on |=(1<< pin_servo);// now set pin in port ex if pin_servo=5 then pin_servo_on.f5=1
  pin_servo_off &= ~(1<< pin_servo);// now clear pin in port ex if pin_servo=5 then pin_servo_on.f5=0
  
  min_pulse_micro_second_servo=min_pulse_micro_second_servo/10;//
  angle_servo=(angle_servo*100)/max_angle_servo;// divide 1000/10 =100 , 1000 mean change to microsecond ,  because Delay_Cyc result time in usec * by 10
  angle_servo=(angle_servo+min_pulse_micro_second_servo);

  *port_servo= pin_servo_on;// ex if pin_servo=2 , *port_servo (( this mean porta or b or ..))*port_servo =0b11110000; then *port_servo= pin_servo_on==>*port_servo= 0b11110010
  delay_cyc(angle_servo);// waitting time (( this time between min_puls and max_puls )) please see data sheet for serveo motor
  *port_servo = pin_servo_off;//// ex if pin_servo=2 , *port_servo (( this mean porta or b or ..))*port_servo =0b11110010; then *port_servo= pin_servo_off==>*port_servo= 0b11110000
 }
حيث قمت بعمليه تشفيت وعمل set للبن مطلوب للمحرك في متغير
ومتغير اخر يمثل ريسيت لنفس البن لانه كما قلنا عمليه تشفيت وعمل & او | تأخذ وقت طويلا يؤثر سلبا على نتيجه زاويه

في مشروع مرفق عليك بأدخال زاويه وعندما تغط على # سوف يطلب منك ادخال رقم محرك ثم اضغط # لينفذ امر

http://www.4shared.com/rar/yJ0Nb5pib...r_16f877a.html

او
http://up.top4top.net/downloadf-top4...702b1-rar.html

تحياتي
السلام عليكم
اخ حسن برنامجك يعمل بشكل رائع على كرستاله 4 و 8 ميحا
لكن عند ترددات اكبر فان قيمه داخل delay-cyc ستتجاوز القيمه 255
حيت ان برنامجك مصمم على تردد 4 ميجا لدلك عندما كنت اغير قبمه التردد متلا 8 ميجا كنت اضرب القيمه داخل delay _cyc ()بالرقم 2 وكدا
ستجد الملاحظه داخل mikroc help على القيم ل delay cyc

وايضا ما هي قيمه min pulse mikro second servo لاني لم اجد قيمتها الاوليه


بالتوفيق اخي حسن


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 30-05-2014, 05:32 PM المشاركة 12   
افتراضي


السلام عليكم
اخ حسن برنامجك يعمل بشكل رائع على كرستاله 4 و 8 ميحا
لكن عند ترددات اكبر فان قيمه داخل delay-cyc ستتجاوز القيمه 255
حيت ان برنامجك مصمم على تردد 4 ميجا لدلك عندما كنت اغير قبمه التردد متلا 8 ميجا كنت اضرب القيمه داخل delay _cyc ()بالرقم 2 وكدا
ستجد الملاحظه داخل mikroc help على القيم ل delay cyc

وايضا ما هي قيمه min pulse mikro second servo لاني لم اجد قيمتها الاوليه


بالتوفيق اخي حسن
السلام عليكم
اخي كريم بالنسبه min pulse mikro second servo هي اقل نبضه والتي عندها يكون محرك سيرفو عند درجه صغرى
http://cdn.top4top.net/i_d328ef0a421.png


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 30-05-2014, 05:41 PM المشاركة 13   
افتراضي


السلام عليكم
اخ حسن برنامجك يعمل بشكل رائع على كرستاله 4 و 8 ميحا
لكن عند ترددات اكبر فان قيمه داخل delay-cyc ستتجاوز القيمه 255
حيت ان برنامجك مصمم على تردد 4 ميجا لدلك عندما كنت اغير قبمه التردد متلا 8 ميجا كنت اضرب القيمه داخل delay _cyc ()بالرقم 2 وكدا
ستجد الملاحظه داخل mikroc help على القيم ل delay cyc

وايضا ما هي قيمه min pulse mikro second servo لاني لم اجد قيمتها الاوليه


بالتوفيق اخي حسن
شكرا اخي على توضيح معلومه لاني كنت اواجه مشاكل مع تردد غير 4 ميكا
سحاول تعديل مكتبه لتكون ملائمه لعدد كبير من ترددات
تحياتي


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 30-05-2014, 08:11 PM المشاركة 14   
افتراضي


السلام عليكم
اخ حسن برنامجك يعمل بشكل رائع على كرستاله 4 و 8 ميحا
لكن عند ترددات اكبر فان قيمه داخل delay-cyc ستتجاوز القيمه 255
حيت ان برنامجك مصمم على تردد 4 ميجا لدلك عندما كنت اغير قبمه التردد متلا 8 ميجا كنت اضرب القيمه داخل delay _cyc ()بالرقم 2 وكدا
ستجد الملاحظه داخل mikroc help على القيم ل delay cyc

وايضا ما هي قيمه min pulse mikro second servo لاني لم اجد قيمتها الاوليه


بالتوفيق اخي حسن
السلام عليكم
حاولت كثيرا لتعديل ولم احصل على نتيجه مرضيه يعني يوجد اختلاف مثلا 4 درجات ولكن وجدت طريقه أفضل نحصل على دقه افضل وهي
عندما تقوم بأستخدام مكتبه عليك بدخول للمكتبه والتعديل كتالي
تكرر الكود بعدد (تردد كرستاله/4)
كود:
Delay_Cyc(angle_servo);
حيث كتبت الكود بتردد 32MHZ حيث تلاحظ اني كررت كود ديلي 8 مرات

وللعلم ان اقصى نبضه هي 2ms =2000us
وبالطبع المكتبه سوف يتم كتابه زاويه بعد قسمتها على 10 وبتالي اقصى قيمه هي 200 وبهذه طريقه Delay_Cyc يمكن استخدامها ولاتوجد اي مشكله في تردد الساعه

كود:
static void servo_init(char *port_servo,char *tris_servo,char pin_servo  )
{
 *port_servo=*port_servo & ~(1<< pin_servo);// this mean made pin=0 from porta or b or ..
 *tris_servo=*tris_servo  & ~(1<< pin_servo);// made pin from porta or b or ...  is output
}


static void work_servo( unsigned int angle_servo ,  char *port_servo,char pin_servo ,
                        unsigned int min_pulse_micro_second_servo, unsigned int max_angle_servo
                      )
{

  char pin_servo_on;char pin_servo_off;

  pin_servo_off=*port_servo;// put value for port to pin_servo_off
  pin_servo_on=*port_servo; //put value for port to pin_servo_on
  pin_servo_on |=(1<< pin_servo);// now set pin in port ex if pin_servo=5 then pin_servo_on.f5=1
  pin_servo_off &= ~(1<< pin_servo);// now clear pin in port ex if pin_servo=5 then pin_servo_on.f5=0
  
  min_pulse_micro_second_servo=min_pulse_micro_second_servo/10;//
  angle_servo=(angle_servo*100)/max_angle_servo;// divide 1000/10 =100 , 1000 mean change to microsecond ,  because Delay_Cyc result time in usec * by 10
  angle_servo=(angle_servo+min_pulse_micro_second_servo);

  *port_servo= pin_servo_on;// ex if pin_servo=2 , *port_servo (( this mean porta or b or ..))*port_servo =0b11110000; then *port_servo= pin_servo_on==>*port_servo= 0b11110010
                            // waitting time (( this time between min_puls and max_puls )) please see data sheet for serveo motor

  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  *port_servo = pin_servo_off;//// ex if pin_servo=2 , *port_servo (( this mean porta or b or ..))*port_servo =0b11110010; then *port_servo= pin_servo_off==>*port_servo= 0b11110000
 }


hamzazayyad
:: مهندس متميز ::
تاريخ التسجيل: Aug 2005
الدولة: موزنبيق
المشاركات: 696
نشاط [ hamzazayyad ]
قوة السمعة:
قديم 30-05-2014, 09:09 PM المشاركة 15   
افتراضي


السلام عليكم
حاولت كثيرا لتعديل ولم احصل على نتيجه مرضيه يعني يوجد اختلاف مثلا 4 درجات ولكن وجدت طريقه أفضل نحصل على دقه افضل وهي
عندما تقوم بأستخدام مكتبه عليك بدخول للمكتبه والتعديل كتالي
تكرر الكود بعدد (تردد كرستاله/4)
كود:
Delay_Cyc(angle_servo);
حيث كتبت الكود بتردد 32MHZ حيث تلاحظ اني كررت كود ديلي 8 مرات

وللعلم ان اقصى نبضه هي 2ms =2000us
وبالطبع المكتبه سوف يتم كتابه زاويه بعد قسمتها على 10 وبتالي اقصى قيمه هي 200 وبهذه طريقه Delay_Cyc يمكن استخدامها ولاتوجد اي مشكله في تردد الساعه

كود:
static void servo_init(char *port_servo,char *tris_servo,char pin_servo  )
{
 *port_servo=*port_servo & ~(1<< pin_servo);// this mean made pin=0 from porta or b or ..
 *tris_servo=*tris_servo  & ~(1<< pin_servo);// made pin from porta or b or ...  is output
}


static void work_servo( unsigned int angle_servo ,  char *port_servo,char pin_servo ,
                        unsigned int min_pulse_micro_second_servo, unsigned int max_angle_servo
                      )
{

  char pin_servo_on;char pin_servo_off;

  pin_servo_off=*port_servo;// put value for port to pin_servo_off
  pin_servo_on=*port_servo; //put value for port to pin_servo_on
  pin_servo_on |=(1<< pin_servo);// now set pin in port ex if pin_servo=5 then pin_servo_on.f5=1
  pin_servo_off &= ~(1<< pin_servo);// now clear pin in port ex if pin_servo=5 then pin_servo_on.f5=0
  
  min_pulse_micro_second_servo=min_pulse_micro_second_servo/10;//
  angle_servo=(angle_servo*100)/max_angle_servo;// divide 1000/10 =100 , 1000 mean change to microsecond ,  because Delay_Cyc result time in usec * by 10
  angle_servo=(angle_servo+min_pulse_micro_second_servo);

  *port_servo= pin_servo_on;// ex if pin_servo=2 , *port_servo (( this mean porta or b or ..))*port_servo =0b11110000; then *port_servo= pin_servo_on==>*port_servo= 0b11110010
                            // waitting time (( this time between min_puls and max_puls )) please see data sheet for serveo motor

  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  Delay_Cyc(angle_servo);
  *port_servo = pin_servo_off;//// ex if pin_servo=2 , *port_servo (( this mean porta or b or ..))*port_servo =0b11110010; then *port_servo= pin_servo_off==>*port_servo= 0b11110000
 }
حل متوقع اخي حسن لكن المهم ان برنامجك يعمل بشكل ممتاز
لكن ايضا يمكن ان تجد حلولا اخرى متل ان تكتب برنامج تاخير بلغه الاسمبلي...الخ

لدي سؤال هل هدا البرنامج يمكن التحكم فيه industrial servo motor فعلي؟؟؟
لاني تعاملت مع بعض انواع المحركات حيت كان لها servo motor drive للتحكم فيه وكان يوجد برتوكول متل modbus ...الخ من الانواع ولم اجد تحكم متل طريقتك

بالتوفيق احي


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 30-05-2014, 09:24 PM المشاركة 16   
افتراضي


حل متوقع اخي حسن لكن المهم ان برنامجك يعمل بشكل ممتاز
لكن ايضا يمكن ان تجد حلولا اخرى متل ان تكتب برنامج تاخير بلغه الاسمبلي...الخ

لدي سؤال هل هدا البرنامج يمكن التحكم فيه industrial servo motor فعلي؟؟؟
لاني تعاملت مع بعض انواع المحركات حيت كان لها servo motor drive للتحكم فيه وكان يوجد برتوكول متل modbus ...الخ من الانواع ولم اجد تحكم متل طريقتك

بالتوفيق احي
السلام عليكم
لا والله أخي لم جربه ولكني رأيت فيديو يتم تشغيل محرك بأدخال زاويه مطلوبه واسم محرك او رقمه فعجبتني فكره وعلى هذا اساس قمت بعمل مكتبه وبناء مشروع ولكن اخي انا أعتقد ان مشروع سوف يعمل لو تم تجربته عمليا

أخي هل لديك داريفر للسيرفو يستخدم modbus وهل هذا البرتوكول موجود في لغه مايكروسي برو
تحياتي الطيبه لكم



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 07:31 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)