السلام عليكم
انا طالب مرحله رابعه هندسه اجهزه طبيه اعمل على مشروع تخرج وهو Surgical Robot Arm
قمت بشراء ذراع روبوت Areex Robot Arm Pro
واردت ان اعمل له دائره تحكم عبر Pic16f887 وربطه بالحاسبه عبر Parallel Port
والتحكم به ببرنامج من تصميمي بال Visual Basic
الروبوت يحتوي على 6 ماتورات Servo Motor بزاويه من -90 الى +90
المشكله التي لدي انه اريد ان اولد نبضات PWM متغيره من 500 مايكروثانيه الى 2500 مايكرو ثانيه وهي نفس النبضات التي يعمل عليها الماتورات
حيث ان 1500 مايكروثانيه هي زاويه 0
عملت دائره محاكيه بالبروتيوس وعملت له كود بلغه Micro C ولكن هناك عدة مشاكل بالكود
انا اريد ان يتم التحكم بالماتورات كالتالي
اولا برنامج الفيجوال بيسك عند الضغط على التحرك يمينا يقوم بارسال عنوان الماتور عبر 3 اطراف من Parallel Port مثلا الماتور الاول هو 001
وبنفس الوقت يقوم بارسال نبضه تخبره بالتحرك يمينا عبر طرفين من Parallel Port لليمين مثلا 01 ولليسار 10
يقوم البك بمعرفه اي ماتور واتجاه الحركه يمينا او يسارا ومن ثم يقوم باخراج نبضه PWM على الطرف المرتبط بالماتور المعني
نبضه متزايده او متناقصه حسب اختيارنا يمينا او يسارا الى ان يصل الحدود التي هي 500 و 2500 ويتوقف عن اصدار الاوامر
المشكله التي واجهتني انه لا يمكنني بدء الحركه من زاويه معينه متوقف عليها الماطور الا من الزاويه -90 اي عند الضغط على امر الاتجاه يمينا يقوم الماطور مباشره بالتحرك الى الزاويه -90 ومن ثم التناقص باتجاه اليمين
الكود
كود:
void attention()
{ char x ;
while (x>=0|x<=180){{if(portb.f0==1) break;
porta.f0=1; vdelay_ms(x);
porta.f0=0; vdelay_ms(1);x=x+1;
} } }
////////////////////////////////////////
void a1()
{ char x;
while(x<=180){if(portb.f1==1) break;
porta.f0=1; vdelay_ms(x);
porta.f0=0; vdelay_ms(1);x=x-1;
} }
////////////////////////////////////////
void main()
{ char x;x=90;
trisb.f0=1; trisb.f1=1; trisb.f2=1;trisb.f3=1;
trisb.f5=0; trisb.f6=0; trisb.f7=0;
trisa.f0=0;
while(1){ portb.f5=0;portb.f6=0;portb.f7=0;
if(portb.f0==0) {mm1: portb.f5=1;
if(portb.f2==0) attention();
if(portb.f0==0)goto mm1;
}
if(portb.f1==0) {mm2: portb.f6=1;
if(portb.f2==0) a1();
if(portb.f1==0)goto mm2;
}
if(portb.f3==0) { porta.f0=1;delay_ms(90);
porta.f0=0;delay_ms(90);
}
}
}