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

   

النمرالفولاذي
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2012
المشاركات: 134
نشاط [ النمرالفولاذي ]
قوة السمعة:
قديم 26-09-2014, 09:04 PM المشاركة 17   
افتراضي



نعم استاذ سعيد بالنسبه للكود عمل معي تمام لاكن وضيفته يقوم بتدوير محرك خطوي ولاتستطيع التحكم في المحرك فقط تستطيع عكس حركته مع استمرار الدوران يعني فقط يسار ويمين

اعلانات

النمرالفولاذي
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2012
المشاركات: 134
نشاط [ النمرالفولاذي ]
قوة السمعة:
قديم 26-09-2014, 09:06 PM المشاركة 18   
افتراضي


السلام عليكم
وضحت الصوره اذن أسأضيف الكود للتحكم بمحرك الخطوه
الله يبشرك بخير اذا عمل الكود فلك فضل كبير علي

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

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


الله يبشرك بخير اذا عمل الكود فلك فضل كبير علي
السلام عليكم
هذا الكود لتحكم في محرك الخطوه بطريقه تتابع نصف الخطوة Half Step Sequence
الغايه من أستخدام تتابع نصف الخطوة Half Step Sequence هو لحصول على دقه اكثر للزاويه
مثلا محرك ذو 4 خطوات اي زاويه التحكم 90 درجه اذا أستخدمنا تتابع الخطوة الكاملة Full Step Sequence فأنه محرك يدور اربع خطوات للوصول الى 360 درجه

اما أستخدام Half Step Sequence لنفس المحرك فأنه درجه التحكم تصبح نصف اي 45 درجه وبتالي ستكون 8 خطوات ليصل المحرك الى 360 درجه

كود:
//Timer0
//Prescaler 1:32; TMR0 Preload = 100; Actual Interrupt Time : 4.992 ms
sbit sw_puls at         RA0_bit;
//sbit sw_puls_dir        TRISA0_bit;
sbit sw_dir at         RA1_bit;
//sbit sw_dir_dir        TRISA1_bit;

unsigned int cont;
char state=0 ,puls1=0 , puls2=0, kk1=0 , kk2=0 , negative=0;
short value=0;
//Place/Copy this part in declaration section
void InitTimer0()
{
  TMR0                 = 100;
}

void Interrupt()
{

  if (TMR0IF_bit)
          {
           TMR0IF_bit         = 0;
           TMR0                 = 100;
           //Enter your code here
           cont++;
          }
}


void main()
{
  //sw_dir_dir=1;
  //sw_puls_dir=1;
  TRISA.f0=1;
  TRISA.f1=1;
  trisb=0;
  portb=0;
  InitTimer0();
  INTCON         = 0xB0;
  OPTION_REG         = 0x84;
  while(1)
         {
         

          if(sw_puls==1 && kk1==0){
                                   if(value==1)
                                         {
                                          if(puls1>0 && negative==2){puls1--;state=2;}
                                          else {puls1++;state=1; negative=1;}

                                         }
                                   else if(value==-1)
                                              {
                                               if(puls1>0 && negative==1){puls1--;state=1;}
                                               else {puls1++;state=2; negative=2;}
                                              }

                                   if(puls1>=8)puls1=0;
                                   kk1=1;
                                  }
          if(kk1==1 && sw_puls==0)kk1=0;
          
          if(sw_dir==1 && kk2==0){
                                  puls2++;
                                  kk2=1;
                                  
                                 }
          if(puls2>=2)value=-1;
          else value=1;
          if(kk2==1 && sw_dir==0)kk2=0;
          if(cont>20 && state==1)
               {
                cont=0;
                puls2=0;
                state=0;
               switch(puls1)
                            {
                             case 0:portb=9;break;
                             case 1:portb=1;break; //-45
                             case 2:portb=3;break; //-90
                             case 3:portb=2;break;  //-135
                             case 4:portb=6;break; //-180
                             case 5:portb=4;break; //-225
                             case 6:portb=12;break;//-270
                             case 7:portb=8;break;//-315

                             default:break;
                            }

               }
            else if( cont>20  && state==2)
               {
                puls2=0;
                cont=0;
                state=0;
                switch(puls1)
                            {
                             case 0:portb=9;break; //0
                             case 1:portb=8;break; //45
                             case 2:portb=12;break; //90
                             case 3:portb=4;break;  //135
                             case 4:portb=6;break; //180
                             case 5:portb=2;break; //225
                             case 6:portb=3;break; //270
                             case 7:portb=1;break;//315

                             default:break;
                            }

               }
         }
}
تلاحظ انه اذا كان محرك عند درجه 135- ولكي يدور بألاتجاه معاكس لازم بالبدايه نجعله يمر بزاويه 90- و من ثم 45- ومن ثم 0

ولكي يتم التحكم بالسرعه لازم نتحكم بزمن النبضه الان مشروع لايتحكم بالسرعه
ولكن يمكن ذلك عن طريق
كود:
if(cont>20 && state==1)
هنا cont>20 يعني زمن 100ms لان الانتربت يحدث كل 5ms ولكي نتحكم بالسرعه خطوه اوله هي تغير رقم 20 الى متغير مثلا نسميه time واستخدام مفاتيح نزيد او ننقص هذا متغير ولكن مشكله انه لا أملك معلومات كافيه حول محركات الخطوه وبتالي لكي أتحكم بزمن بين نبضه واخرى محتاج اعرف اقل زمن مسموح به واكبر زمن مسموح به

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

ملاحظه// لدوران المحرك بأتجاه معاكس أضغط على مفتاح dir اكثر من مره وبعد أضغط على sw puls

http://up.top4top.net/downloadf-top4...62671-rar.html


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


عندي سؤال أخي لماذا تستخدم 16f84a انا أفضل أستخدام 16f628a
لعده الاسباب
1- سعر 16f628a ارخص من 16f84a
2- 16f628a ذاكره اكبر من 16f84a
3- يحتوي 16f628a على كرستاله داخليه على عكس 16f84a بحاجه الى كرستاله خارجيه
وغيرها من الاسباب


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


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

كود:
sbit sw_puls at         Rb1_bit;

sbit sw_dir at         Rb0_bit;

unsigned int cont;
char state=0 ,puls1=0 , puls2=0, kk1=0 , kk2=0 , negative=0;
short value=0;
#define motor_stepper  porta=(porta &0xF0)
//Timer0
//Prescaler 1:32; TMR0 Preload = 100; Actual Interrupt Time : 4.992 ms

//Place/Copy this part in declaration section
void InitTimer0()
{
  TMR0                 = 100;
}

void Interrupt()
{
  if(INTF_bit==1)
        {
         INTF_bit=0;
         puls2++;

        }
  if (TMR0IF_bit)
          {
           TMR0IF_bit         = 0;
           TMR0                 = 100;
           //Enter your code here
           cont++;
          }
}


void main()
{
  //sw_dir_dir=1;
  //sw_puls_dir=1;
  TRISA.f0=0;
  TRISA.f1=0;
  TRISA.f2=0;
  TRISA.f3=0;
  motor_stepper= 0 ;
  trisb.f0=1;
  trisb.f1=1;

  InitTimer0();
  INTCON         = 0xB0;
  OPTION_REG         = 0xC4;
  while(1)
         {
            if(puls2>=2)value=-1;
            else value=1;

          if(sw_puls==1 && kk1==0){
                                   if(value==1)
                                         {
                                          if(puls1>0 && negative==2){puls1--;state=2;}
                                          else {puls1++;state=1; negative=1;}

                                         }
                                   else if(value==-1)
                                              {
                                               if(puls1>0 && negative==1){puls1--;state=1;}
                                               else {puls1++;state=2; negative=2;}
                                              }

                                   if(puls1>=8)puls1=0;
                                   kk1=1;
                                  }
          if(kk1==1 && sw_puls==0)kk1=0;
          


          if(cont>20 && state==1)
               {
                cont=0;
                puls2=0;
                state=0;
               switch(puls1)
                            {
                             case 0:motor_stepper |=9;break;
                             case 1:motor_stepper |=1;break; //-45
                             case 2:motor_stepper |=3;break; //-90
                             case 3:motor_stepper |=2;break;  //-135
                             case 4:motor_stepper |=6;break; //-180
                             case 5:motor_stepper |=4;break; //-225
                             case 6:motor_stepper |=12;break;//-270
                             case 7:motor_stepper |=8;break;//-315

                             default:break;
                            }

               }
            else if( cont>20  && state==2)
               {
                puls2=0;
                cont=0;
                state=0;
                switch(puls1)
                            {
                             case 0:motor_stepper |=9;break; //0
                             case 1:motor_stepper |=8;break; //45
                             case 2:motor_stepper |=12;break; //90
                             case 3:motor_stepper |=4;break;  //135
                             case 4:motor_stepper |=6;break; //180
                             case 5:motor_stepper |=2;break; //225
                             case 6:motor_stepper |=3;break; //270
                             case 7:motor_stepper |=1;break;//315

                             default:break;
                            }

               }
         }
}
http://up.top4top.net/downloadf-top4...37d11-rar.html


الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,892
نشاط [ سعيد قادر ]
قوة السمعة:
قديم 27-09-2014, 08:59 AM المشاركة 22   
x2


ماذا يقصد بهذا السطر ؟؟



كود:
sayac = (sayac+1)%7;


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


ماذا يقصد بهذا السطر ؟؟



كود:
sayac = (sayac+1)%7;
يعني قيمه sayac تساوي القيمه القديمه sayac مضاف اليها 1 والنتيجه sayac+1 يقسمها على 7 ويأخذ بالنهايه باقي القسمه على 7
مثال// sayac=2
اذن sayac+1=2+1=3
ثم يقسم 3 على 7
3/7 =0 والباقي 3
sayac=3

مثال// sayac=8
اذن sayac+1=8+1=9
ثم يقسم 9 على 7
9/7 =1 والباقي 2
sayac=2


ملاحظه هذه علامه % تعني باقي القسمه


الصورة الرمزية سعيد قادر
سعيد قادر
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2009
الدولة: العراق/ كوردستان
المشاركات: 2,892
نشاط [ سعيد قادر ]
قوة السمعة:
قديم 27-09-2014, 09:10 AM المشاركة 24   
افتراضي


شكرا لك اخ حسن ما تاثير ذالك على المحرك ؟؟



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