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

أدوات الموضوع

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 16-10-2014, 12:29 PM المشاركة 1   
x4 مشروع التحكم بمحركات stepper Twitter FaceBook Google+



السلام عليكم
هذا موضوع مكمل للموضوع اخ النمرالفولاذي في الرابط التالي
http://www.qariya.info/vb/showthread.php?t=153252

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

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


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 16-10-2014 الساعة 01:02 PM
احصائية الشكر والاعجاب - 4 شكراً, 0 عدم اعجاب, 4 اعجاب
شكراً hamadalla31, hussien1995, assed, سعيد قادر ( شكر العضو على هذه المشاركة )
اعجاب hamadalla31, hussien1995, assed, سعيد قادر ( أعجبته المشاركة )
اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 16-10-2014, 12:58 PM المشاركة 2   
افتراضي شرح الكود الجزء الاول driver stepper motor


السلام عليكم
بسم تعالى:
ملف مرفق في مشاركه السابقه تجدون مشروعين الاول لتحكم بمحركات الستيبر ومشروع اخر مرسل النبضات يعني بدون الحاجه للكمبيوتر
كود:
sbit sw_dir1 at         RD4_bit;
sbit sw_dir1_dir at     TRISD4_bit;
sbit sw_puls1 at         RB4_bit;
sbit sw_puls1_dir at     TRISB4_bit;

sbit sw_dir2 at         RD5_bit;
sbit sw_dir2_dir at     TRISD5_bit;
sbit sw_puls2 at         RB5_bit;
sbit sw_puls2_dir at     TRISB5_bit;

sbit sw_dir3 at         RD6_bit;
sbit sw_dir3_dir at     TRISD6_bit;
sbit sw_puls3 at         RB6_bit;
sbit sw_puls3_dir at     TRISB6_bit;

sbit sw_dir4 at         RD7_bit;
sbit sw_dir4_dir at     TRISD7_bit;
sbit sw_puls4 at         RB7_bit;
sbit sw_puls4_dir at     TRISB7_bit;

sbit led at RC4_bit;
sbit led_eeprom at RE0_bit;
sbit sw_reset_eeprom at RE1_bit;
sbit full_half_mode at RE2_bit;

bit kk1 , kk2 , kk3 , kk4 ;
char x,state1=0 , state2=0 , state3=0 , state4=0 ;
unsigned int time_stop1 , time_stop2 , time_stop3 , time_stop4 , time_reset_eprom;
short value1=0 , value2=0 , value3=0 , value4=0 ,puls1=0 , puls2=0 ,puls3=0 , puls4=0, flag_reset_eeprom=0 ;
char *motor_stepper;

void stepper_motor(char *motor_stepper,char no_motor );

//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 100 ms

//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON         = 0x31;
  TMR1IF_bit         = 0;
  TMR1H         = 0x0B;
  TMR1L         = 0xDC;
  TMR1IE_bit         = 1;
  INTCON         = 0xC0;
}


void interrupt()
{
  if(RBIF_bit==1)
     {
      RBIF_bit=0;
      if(sw_puls1==1)kk1=1;
      if(sw_puls2==1)kk2=1;
      if(sw_puls3==1)kk3=1;
      if(sw_puls4==1)kk4=1;
     }
   if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H         = 0x0B;
    TMR1L         = 0xDC;
    //Enter your code here
    time_stop1++;
    time_stop2++;
    time_stop3++;
    time_stop4++;
   if(flag_reset_eeprom==1)time_reset_eprom++;
  }

}
void main()
{
  adcon1=6;
  cmcon=7;
  trisc.f0=0; // output
  trisc.f1=0; // output
  trisc.f2=0;// output
  trisc.f3=0; // output
  trisc.f4=0; // output
  portc &=0xE0;// off motor3 and off led,

  TRISD=0xF0;
  portd &=0xF0;// off motor 4
  trisa.f0=0;// output
  trisa.f1=0;// output
  trisa.f2=0;// output
  trisa.f3=0;// output
  porta &=0xF0; // off motor 1

 trisb=0xF0;
 portb &=0xF0;// off motor2

 TRISE0_bit=0;// output
 TRISE1_bit=1;// input
 TRISE2_bit=1;// input
 led_eeprom=0; //off led_eeprom,
 
  InitTimer1();
  INTCON    = 0xC8;
  // read data from eeprom
  if(EEPROM_Read(0)!=0xff)puls1=EEPROM_Read(0);
  if(EEPROM_Read(1)!=0xff)puls2=EEPROM_Read(1);
  if(EEPROM_Read(2)!=0xff)puls3=EEPROM_Read(2);
  if(EEPROM_Read(3)!=0xff)puls4=EEPROM_Read(3);

  for(x=0;x<4;x++ )if(EEPROM_Read(x)!= 0xFF)led_eeprom=1;

for(x=0;x<10;x++){
                    led=0;
                    delay_ms(250);
                    led=1;
                    delay_ms(250);
                   }
  while(1)
         {
            if(sw_dir1==0)value1=1;  // for direction motor1
            else value1=-1;

            if(sw_dir2==0)value2=1;  // for direction motor2
            else value2=-1;

            if(sw_dir3==0)value3=1;  // for direction motor3
            else value3=-1;

            if(sw_dir4==0)value4=1;  // for direction motor4
            else value4=-1;

            if(sw_reset_eeprom==1)flag_reset_eeprom=1;// reset eeprom
            else { time_reset_eprom=0; flag_reset_eeprom=0;}
            
            if(flag_reset_eeprom ==1 && time_reset_eprom >100 ) // 10sec =10000ms/100=100
                   {
                    for(x=0;x<4;x++)
                            {
                             led_eeprom=1;// flashing led_eeprom to check the eeprom start reset
                             delay_ms(100);
                             EEPROM_Write(x,0xFF);
                             led_eeprom=0;
                             delay_ms(100);
                            }

                   }

          if(  kk1==1 )  // kk1 mean find puls for motor 1
                         {
                            kk1=0;
                            GIE_bit=0; // disable interrupt
                            time_stop1=0; // reset timer for off stepper motor
                            if(puls1%2 !=0 && puls1!=0 && state1==0 && full_half_mode==1)
                                {
                                 if(value1== 1 )puls1--;
                                 else if(value2== -1 )puls1++;
                                }
                            state1=1;
                            if(value1==1) // rotate to right
                                         {
                                          if(full_half_mode==0) {puls1++;  if(puls1>=8)puls1=0;}
                                          else if(full_half_mode==1){ puls1 +=2; if(puls1>=7)puls1=0;}
                                         }
                            else if(value1==-1)// rotate to lift
                                         {
                                          if(full_half_mode==0) { puls1--; if(puls1<= -1)puls1=7;}
                                          else if(full_half_mode==1){ puls1 -=2;if(puls1<= -1)puls1=6;}

                                         }
                              EEPROM_Write(0,puls1);
                              led_eeprom=1;
                               GIE_bit=1;

                           }

          if(  kk2==1 )
                         {
                            kk2=0;
                            GIE_bit=0;
                            time_stop2=0;
                            if(puls2%2 !=0 && puls2!=0 && state2==0 && full_half_mode==1)
                                {
                                 if(value2== 1 )puls2--;
                                 else if(value2== -1 )puls2++;
                                }
                            state2=1;
                            if(value2==1) // rotate to right
                                         {
                                          if(full_half_mode==0) {puls2++;  if(puls2>=8)puls2=0;}
                                          else if(full_half_mode==1){ puls2 +=2; if(puls2>=7)puls2=0;}
                                         }
                            else if(value2==-1)// rotate to lift
                                         {
                                          if(full_half_mode==0) { puls2--; if(puls2<= -1)puls2=7;}
                                          else if(full_half_mode==1){ puls2 -=2;if(puls2<= -1)puls2=6;}

                                         }
                            EEPROM_Write(1,puls2);
                            led_eeprom=1;
                            GIE_bit=1;

                           }

          if(  kk3==1 )
                         {
                            kk3=0;
                            GIE_bit=0;
                            time_stop3=0;
                            if(puls3%2 !=0 && puls3!=0 && state3==0 && full_half_mode==1)
                                {
                                 if(value3== 1 )puls3--;
                                 else if(value3== -1 )puls3++;
                                }
                            state3=1;
                            if(value3==1) // rotate to right
                                         {
                                          if(full_half_mode==0) {puls3++;  if(puls3>=8)puls3=0;}
                                          else if(full_half_mode==1){ puls3 +=2; if(puls3>=7)puls3=0;}
                                         }
                            else if(value3==-1)// rotate to lift
                                         {
                                          if(full_half_mode==0) { puls3--; if(puls3<= -1)puls3=7;}
                                          else if(full_half_mode==1){ puls3 -=2;if(puls3<= -1)puls3=6;}

                                         }
                              EEPROM_Write(2,puls3);
                              led_eeprom=1;
                               GIE_bit=1;
                           }

           if(  kk4==1 )
                         {
                            kk4=0;
                            GIE_bit=0;
                            time_stop4=0;
                            if(puls4%2 !=0 && puls4!=0 && state4==0 && full_half_mode==1)
                                {
                                 if(value4== 1 )puls4--;
                                 else if(value4== -1 )puls4++;
                                }
                            state4=1;
                            if(value4==1) // rotate to right
                                         {
                                          if(full_half_mode==0) {puls4++;  if(puls4>=8)puls4=0;}
                                          else if(full_half_mode==1){ puls4 +=2; if(puls4>=7)puls4=0;}
                                         }
                            else if(value4==-1)// rotate to lift
                                         {
                                          if(full_half_mode==0) { puls4--; if(puls4<= -1)puls4=7;}
                                          else if(full_half_mode==1){ puls4 -=2;if(puls4<= -1)puls4=6;}

                                         }
                              EEPROM_Write(3,puls4);
                              led_eeprom=1;
                               GIE_bit=1;
                           }

          if( state1==1)
               {
                 state1=0;
                 stepper_motor(&porta,1);
               }

           if( state2==1)
               {
                state2=0;
                stepper_motor(&portb,2);
               }

           if( state3==1)
               {
                state3=0;
                stepper_motor(&portc,3);
               }
           if( state4==1)
               {
                state4=0;
                stepper_motor(&portd,4);
               }

          if(time_stop1> 10) // 1 sec = 1000ms   ==> 1000/100=10
                 {
                  porta &=0xF0 ;// OFF motor1
                 }

            if(time_stop2> 10 )
                 {
                   portb &=0xF0 ;// OFF motor2
                 }
            if(time_stop3> 10 )
                 {
                  portc &=0xF0 ;// OFF motor3
                 }

            if(time_stop4> 10 )
                 {
                   portd &=0xF0 ;// OFF motor4
                 }
         }
}

//*******************************************//
void stepper_motor(char *motor_stepper,char no_motor)
{
 char pluses1=0;
  *motor_stepper &=0xF0;
 if(no_motor==1) pluses1=puls1;
 else if(no_motor==2)pluses1=puls2;
 else if(no_motor==3)pluses1=puls3;
 else if(no_motor==4)pluses1=puls4;
 switch(pluses1)
             {
              case 0  :*motor_stepper |=9; break;//1001    0
              case 1  :*motor_stepper |=1;break; // 0001   45
              case 2  :*motor_stepper |=3;break; //0011    90
              case 3  :*motor_stepper |=2;break;  //0010   135
              case 4  :*motor_stepper |=6;break; //0110    180
              case 5  :*motor_stepper |=4;break; //0100    225
              case 6  :*motor_stepper |=12;break;//1100    270
              case 7  :*motor_stepper |=8;break;//1000    315

              default:break;
             }

}
============================================
تعريف مداخل أتجاهات والنبضات لاربع محركات
كود:
sbit sw_dir1 at         RD4_bit;
sbit sw_dir1_dir at     TRISD4_bit;
sbit sw_puls1 at         RB4_bit;
sbit sw_puls1_dir at     TRISB4_bit;

sbit sw_dir2 at         RD5_bit;
sbit sw_dir2_dir at     TRISD5_bit;
sbit sw_puls2 at         RB5_bit;
sbit sw_puls2_dir at     TRISB5_bit;

sbit sw_dir3 at         RD6_bit;
sbit sw_dir3_dir at     TRISD6_bit;
sbit sw_puls3 at         RB6_bit;
sbit sw_puls3_dir at     TRISB6_bit;

sbit sw_dir4 at         RD7_bit;
sbit sw_dir4_dir at     TRISD7_bit;
sbit sw_puls4 at         RB7_bit;
sbit sw_puls4_dir at     TRISB7_bit;
======================================
تعريف مدخل ليد دلاله على ان مايكرو يعمل بشكل سليم
كود:
sbit led at RC4_bit;
======================================
تعريف مدخل ليد ايبروم في حاله وجود بيانات مخزونه في ايبروم وكذلك تعريف مدخل سويج ريسيت داتا موجوده في ايبروم
كود:
sbit led_eeprom at RE0_bit;
sbit sw_reset_eeprom at RE1_bit;
=====================================
تعريف مدخل أختيار نوع التحكم هل فول ستيب او هاف ستيب
كود:
sbit full_half_mode at RE2_bit;
======================================


تعريف بتات لمعرفه حاله pulse طبعا لها قيمتين فقط اما 1 او 0 لانها من نوع bit
كود:
bit kk1 , kk2 , kk3 , kk4 ;
==========================================
تعريف متغيرات لغرض تبين حاله اي محرك نريد تشغيله طبعا كل متغير يخص محرك
كود:
state1=0 , state2=0 , state3=0 , state4=0
==========================================
تعريف متغيرات من نوع int لغرض أحتساب الزمن من اخر نبضه تم أستلامها لغرض بعد هذا الزمن يتم أطفاء محرك وعدم بقاء فولتيه على احدى ملفات المحرك
لانه اخر نبضه سوف تبقى أحدى ملفات شغاله ولهذا يجب جعل البورت المخصص لتشغيل محرك =0
كود:
time_stop1 , time_stop2 , time_stop3 , time_stop4
===========================================
تعريف متغيرات لغرض تشغيل محرك وفق ترتيب الصحيح لتسلسل الخطوات
كود:
puls1=0 , puls2=0 ,puls3=0 , puls4=0
=========================================
تعريف المتغيرات لمعرفه حاله الاتجاه
كود:
value1=0 , value2=0 , value3=0 , value4=0
========================================
تعريف مؤشر لغرض أختيار اي بورت نريد وبتالي نضع كود واحد ومن ثم نضع مؤشر يشير الى بورت الي نريد اخراج نبضات عليه
كود:
char *motor_stepper;
=============================================

تعريف تايمر1 ليعمل انتربت كل 100ms
كود:
//Timer1 
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 100 ms

//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON         = 0x31;
  TMR1IF_bit         = 0;
  TMR1H         = 0x0B;
  TMR1L         = 0xDC;
  TMR1IE_bit         = 1;
  INTCON         = 0xC0;
}
=========================================
في داله الانتربت يوجد حالتين تسببان أنتربت
اولى عن طريق البورت وبتالي خصصت للنبضات فعندما يتغير حاله على بورت B من 0 الى 1 يحدث أنتربت طبعا في هذه الحاله ان بنات مخصصه لحدوث أنتربت هي فقط RB4 , RB5 , RB6, RB7
وبتالي لما يحدث انتربت عن طريق بورت B وفق البنات pins الي تبدء من 4 الى 7 يجب علينا أختبار اي بت أصبح =1 وفق هذا سنعرف اي محرك نريد تشغيله عن طريق جعل البت مقابل للمحرك=1
ملاحظه مهمه كل متغير امامه 1 فهو يخص محرك رقم 1 و 2 يخص محرك 2 و3 يخص محرك 3 و4 يخص محرك 4 لذا بالكود ستجدوني أكتفي بشرح عن محرك واحد والبقيه سيكون نفس مبدأ او الكود

كود:
if(RBIF_bit==1)
     {
      RBIF_bit=0;
      if(sw_puls1==1)kk1=1;
      if(sw_puls2==1)kk2=1;
      if(sw_puls3==1)kk3=1;
      if(sw_puls4==1)kk4=1;
     }
اما الانتربت الثاني يكون عن طريق تايمر1 وطبعا مهمه كل متغير أطفاء محرك مخصص له
كود:
if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H         = 0x0B;
    TMR1L         = 0xDC;
    //Enter your code here
    time_stop1++;
    time_stop2++;
    time_stop3++;
    time_stop4++;
   if(flag_reset_eeprom==1)time_reset_eprom++;
  }

احصائية الشكر والاعجاب - 3 شكراً, 0 عدم اعجاب, 3 اعجاب
شكراً hamadalla31, سعيد قادر, النمرالفولاذي ( شكر العضو على هذه المشاركة )
اعجاب hamadalla31, سعيد قادر, النمرالفولاذي ( أعجبته المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

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


ندخل الان في الداله الرئيسيه
لغرض جعل البورتات على انها ديجيتل والالغاء خاصيه انلوك
كود:
 adcon1=6;
=================================
نعرف ايهما مداخل وايهما مخارج على ان نقوم بجعل مخارج =0 لان ممن محتمل ان يكون اي خرج =1 ولهذا يجب أطفاء كل مخارج هذه امور اساسيه عند تشغيل البرنامج
كود:
trisc.f0=0; // output
  trisc.f1=0; // output
  trisc.f2=0;// output
  trisc.f3=0; // output
  trisc.f4=0; // output
  portc &=0xE0;// off motor3 and off led,

  TRISD=0xF0;
  portd &=0xF0;// off motor 4
  trisa.f0=0;// output
  trisa.f1=0;// output
  trisa.f2=0;// output
  trisa.f3=0;// output
  porta &=0xF0; // off motor 1

 trisb=0xF0;
 portb &=0xF0;// off motor2

 TRISE0_bit=0;// output
 TRISE1_bit=1;// input
 TRISE2_bit=1;// input
 led_eeprom=0; //off led_eeprom,
==================================
أستدعاء داله تعريف او تهيئه تايمر 1
كود:
InitTimer1();
===================================
تهيئه انتربت عن طريق بورتB وتايمر 1 بتفعيل البتات مخصصه لذلك في ريجيستر intcon
كود:
INTCON    = 0xC8;
====================================
بعد ذلك أقوم بقراءه موقع كل محرك وهذه طبعا مخزونه في ايبروم وهذا مهم لان عند ما يقف محرك عند نقطه معينه ثم يتم أطفاء كهرباء عن مايكرو ومن ثم أعاده ارسال النبضات الى هذا محرك المفروض يبدأ من أخر نقطه وصل لها محرك واذا أعطينا نبضات من نقطه البدايه فأن محرك سوف يعود الى وراء اي يدور بعكس الاتجاه مطلوب ثم يدور بأتجاه الصحيح
على سبيل مثال نقو ل أعطينا محرك رقم 1 250 نبضه كل نبضه تحرك محرك 1 درجه اي محرك بنظام هاف ستيب سوف يتوقف عند عند درجه 250 اي تحرك 250 خطوه وبتالي سوف يتوقف عند الخطوه رقم 3 وبتالي لو أطفأ الكهرباء وتمت أعادتها
محرك الان متوقف عند 250 درجه وأعطينا الان 50 خطوه ولم يتم حفظ البدايه عندها سوف يرجع 3 خطوات الى وراء اي يصبح عند موقع 247 ومن ثم يبدأ بخطوات الصحيحه ليصل الى 297 ولكن اذا حفظنا نقطه البدايه فأنه سوف ينطلق من موقع 250 ليصل الى 300
طبعا هذه حاله تحدث فقط عند تشغيل محرك لاول مره لانه عندها يكون متغير puls1=0 او puls2=0 او puls3=0 او puls4=0 وبعد ذلك كل متغير سوف يكون له قيمه معينه يبدء منها تشغيل الصحيح لتسلسل الخطوات يعني تشغيل الصحيح لملفات المحرك
====================================
لغرض تشغيل ليدايبروم نختبر موقع كل ايبروم المخزونه فيها داتا فأذا توجد بيانات فأكيد قيمتها لاتساوي 255 او 0xFF لان اقصى شيئ هو 7 عندها شغل ليد واذا لاتوجد بيانات مخزونه ليد يكون طافئ
كود:
for(x=0;x<4;x++ )if(EEPROM_Read(x)!= 0xFF)led_eeprom=1;
=====================================
بعد أنتهاء من هذه عمليات سيبدء ليد بعمليه فلاشنك لدلاله على ان مايكرو قام بتهيئه بنجاح وهو سوف يكون مستعد لتشغيل محركات في حاله أستلام النبضات
كود:
for(x=0;x<10;x++){
                    led=0;
                    delay_ms(250);
                    led=1;
                    delay_ms(250);
                   }
ومن ثم ندخل في لوب مستمر
سوف نكمل ذلك في مشاركه القادمه بمشيئه الله

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً hamadalla31 ( شكر العضو على هذه المشاركة )
اعجاب hamadalla31 ( أعجبته المشاركة )

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 16-10-2014, 03:31 PM المشاركة 4   
افتراضي


بسم تعالى:
الان ندخل في لوب
سيتم شرح لمحرك رقم 1 والمحركات 2و3و4 سيكون نفس كلام
====================================
هنا يتم أختبار مستمر لمدخل الاتجاه فأذا كان =1 اي 5 فولت سنجعل متغير الاتجاه والذي سميته value1=-1 واذا كان مدخل الاتجاه محرك رقم 1 =0 اذن متغير value1=1
كود:
if(sw_dir1==0)value1=1;  // for direction motor1
            else value1=-1;
========================================
لمسح البيانات في ايبروم يجب ان يتم الضغط على سويج sw_reset_eeprom عندها سوف يصبح flag_reset_eeprom=1 وهنا سوف يتم تحقق الشرط داخل داله انتربت ليتم أحتساب زمن كل 100ms ولكن بمجرد ان ترفع يدك سوف يتم جعل flag_reset_eeprom=0 وتصفير زمن time_reset_eprom=0 الغايه من ذلك هو انك مجبر على ان تضغط على سويج لغايه زمن مطلوب حتى يتم تصفير او مسح البيانات
كود:
if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H         = 0x0B;
    TMR1L         = 0xDC;
    //Enter your code here
    time_stop1++;
    time_stop2++;
    time_stop3++;
    time_stop4++;
   if(flag_reset_eeprom==1)time_reset_eprom++;
  }_eprom++;[/COLOR]
  }
كود:
if(sw_reset_eeprom==1)flag_reset_eeprom=1;// reset eeprom
            else { time_reset_eprom=0; flag_reset_eeprom=0;}
بعدما يصبح الزمن time_reset_eprom اكثر من 10 ثواني
سيتحقق الكود ادناه وسيتم خزن 0xFF في مواقع ايبروم وهي 0 و1و2و3
وسيتم تشغيل وأطفاء led_eeprom للدلاله على ان عمليه مسح ايبروم بدءت بالفعل وبعد أنتهاء من المسح يتم أطفاء led_eeprom عندها أنتهت عمليه مسح
كود:
 if(flag_reset_eeprom ==1 && time_reset_eprom >100 ) // 10sec =10000ms/100=100
                   {
                    for(x=0;x<4;x++)
                            {
                             led_eeprom=1;// flashing led_eeprom to check the eeprom start reset
                             delay_ms(100);
                             EEPROM_Write(x,0xFF);
                             led_eeprom=0;
                             delay_ms(100);
                            }

                   }


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 16-10-2014, 04:34 PM المشاركة 5   
افتراضي


الان نأتي الى أهم جزء في الكود وربما هو أكثر تعقيدا لذا يجب قراءه الشرح بتركيز
لان هذا الكود هو مسؤول عن توجيه محرك بشكل صحيح ويتم تنفيذه في كل نبضه
وقلنا البت kk1 اذا كان =1 معناه أستلم نبضه ويتم تنفيذ الكود أدناه واما اذا كان =0 فلايتم التنفيذ

كود:
if(  kk1==1 )  // kk1 mean find puls for motor 1
                         {
                            kk1=0;
                            GIE_bit=0; // disable interrupt
                            time_stop1=0; // reset timer for off stepper motor
                            if(puls1%2 !=0 && puls1!=0 && state1==0 && full_half_mode==1)
                                {
                                 if(value1== 1 )puls1--;
                                 else if(value2== -1 )puls1++;
                                }
                            state1=1;
                            if(value1==1) // rotate to right
                                         {
                                          if(full_half_mode==0) {puls1++;  if(puls1>=8)puls1=0;}
                                          else if(full_half_mode==1){ puls1 +=2; if(puls1>=7)puls1=0;}
                                         }
                            else if(value1==-1)// rotate to lift
                                         {
                                          if(full_half_mode==0) { puls1--; if(puls1<= -1)puls1=7;}
                                          else if(full_half_mode==1){ puls1 -=2;if(puls1<= -1)puls1=6;}

                                         }
                              EEPROM_Write(0,puls1);
                              led_eeprom=1;
                               GIE_bit=1;

                           }
=====================================

في كود أدناه أختبرنه kk1 اذا كان يساوي 1 اذن نجعل kk1=0 ولهذا لكي نهيئه للنبضه التاليه وبعده يجب ايقاف أنتربت
كود:
 GIE_bit=0; // disable interrupt
والا سوف لن يعمل محرك لان انتربت سوف يجعل مايكرو في حاله من عدم أستقرار لذا طالما أستلمت نبضه يجب ان أتوقف عن أستلام اخرى لكي تقوم عمليه بنجاح
بعد ذلك يجب جعل
كود:
time_stop1=0;
لان هذا زمن مهمنه يحسب زمن مثلا نصف ثانيه عندها يطفئ محرك
============================
في هذا الجزء الكود هو عندما يتم وضع على فول ستيب هنا يجب أن أجعل puls1 عدد زوجي لكي يتم تحقق تشغيل كامل للملفات ولهذا أختبر الاتجاه اولا اذا كان اتجاه اليمين وكانت خطوه puls1=3 مثلا اي عدد فردي هنا سوف أطرح منه 1 اي تصبح puls1=2 وبتالي لما يتم جمع عليه فيما بعد ب 2 سوف يصبح 4 وبتالي يعمل تسلسل خطوات بشكل صحيح

اذا كان اتجاه اليسار وكانت خطوه puls1=3 مثلا اي عدد فردي هنا سوف أجمع عليه 1 اي تصبح puls1=4 وبتالي لما يتم طرح منه فيما بعد ب 2 سوف يصبح 2 وبتالي يعمل تسلسل خطوات بشكل صحيح

كود:
if(puls1%2 !=0 && puls1!=0 && state1==0 && full_half_mode==1)
                                {
                                 if(value1== 1 )puls1--;
                                 else if(value2== -1 )puls1++;
                                }
======================================
هنا جعلنا متغير
كود:
 state1=1;
اي سوف يتم أستدعاء داله تشغيل محرك لغرض توجيه محرك وفق الخطوه مطلوبه
=====================================
في كود التالي اذا كان أتجاه الى اليمين
اذا كان مود (mode) على وضع هاف مود اي full_half_mode =0
فأننا سوف نجمع puls1 بمقدار 1 ولان عدد خطوات =8 يتم أحتسابها أبتداءا من 0 الى 7 لذا نضع شرط مهم وهو اذا كان puls1 اكبر او يساوي 8 أجعل puls1=0 لكي يبدء محرك من جديد

اما اذا كان مود على وضع full mode فأنه سوف يتم جمع على puls1 بمقدار 2
اي أنني اريد أجعله يدور خطوتين معا واذا أصبح قيمه puls1 اكبر او يساوي 7 اجعله puls1=0 لكي يبدء من جديد

كود:
if(value1==1) // rotate to right
                                         {
                                          if(full_half_mode==0) {puls1++;  if(puls1>=8)puls1=0;}
                                          else if(full_half_mode==1){ puls1 +=2; if(puls1>=7)puls1=0;}
                                         }
=================================

اما اذا كان محرك نريده يدور بعكس عقارب الساعه
نفس حاله سابقه ولكن سنبدء بالعدد التنازلي
اذا كان مود (mode) على وضع هاف مود اي full_half_mode =0
فأننا سوف نطرح puls1 بمقدار 1 ولان عدد خطوات =8 يتم أحتسابها أبتداءا من 0 الى 7 لذا نضع شرط مهم وهو اذا كان puls1 اصغر او يساوي -1 أجعل puls1=7 لكي يبدء محرك من جديد

اما اذا كان مود على وضع full mode فأنه سوف يتم طرح على puls1 بمقدار 2
اي أنني اريد أجعله يدور خطوتين معا واذا أصبح قيمه puls1 اصغر او يساوي -1 اجعله puls1=6 لكي يبدء من جديد

طبعا هذا الكود له علاقه مع كود داله stepper_motor


كود:
else if(value1==-1)// rotate to lift
                                         {
                                          if(full_half_mode==0) { puls1--; if(puls1<= -1)puls1=7;}
                                          else if(full_half_mode==1){ puls1 -=2;if(puls1<= -1)puls1=6;}

                                         }
========================================
ومن ثم نقوم بخزن قيمه الخطوه او puls1 في أيبروم
كود:
 EEPROM_Write(0,puls1);
ومن أضاءه ليد أيبروم لدلاله على ان هناك بيانات تمت خزنها في ايبروم
كود:
led_eeprom=1;
ومن ثم نعود تفعيل أنتربت
كود:
GIE_bit=1;


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 16-10-2014 الساعة 04:42 PM

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


عندما تمت معالجه النبضه وأحتساب قيمه puls1 جعلنا state1=1 وهنا سوف نصفر state1=0 لكي نجعل كود يتنفذ مره واحده ومن ثم نستدعي داله stepper_motor
طبعا هذه داله تحتاج منا متغيرين الاول البورت مطلوب او مخصص لتشغيل محرك ورقم محرك وفي كود أدناه تلاحظون تم أختيار البورتa وطبعا رقم محرك 1

كود:
if( state1==1)
               {
                 state1=0;
                 stepper_motor(&porta,1);
               }
===========================================
وهذا كود داله stepper_motor
كود:
void stepper_motor(char *motor_stepper,char no_motor)
{
 char pluses1=0;
  *motor_stepper &=0xF0;
 if(no_motor==1) pluses1=puls1;
 else if(no_motor==2)pluses1=puls2;
 else if(no_motor==3)pluses1=puls3;
 else if(no_motor==4)pluses1=puls4;
 switch(pluses1)
             {
              case 0  :*motor_stepper |=9; break;//1001    0
              case 1  :*motor_stepper |=1;break; // 0001   45
              case 2  :*motor_stepper |=3;break; //0011    90
              case 3  :*motor_stepper |=2;break;  //0010   135
              case 4  :*motor_stepper |=6;break; //0110    180
              case 5  :*motor_stepper |=4;break; //0100    225
              case 6  :*motor_stepper |=12;break;//1100    270
              case 7  :*motor_stepper |=8;break;//1000    315

              default:break;
             }
}
عرفنا متغير
كود:
char pluses1=0;
==================================
نقوم بأطفاء البورت من أجعل أعاده تهيئه للكود جديد
كود:
*motor_stepper &=0xF0;
تلاحظون عمله له & مع 0xF0 لاني اريد تصفير اول اربعه بتات اولى دون التأثير على البتات الاربعه أخرى
======================================
هنا نضع قيمه الخطوه في متغير pluses1 وطبعا لازم حسب رقم محرك مطلوب
كود:
 if(no_motor==1) pluses1=puls1;
 else if(no_motor==2)pluses1=puls2;
 else if(no_motor==3)pluses1=puls3;
 else if(no_motor==4)pluses1=puls4;
======================================
هنا الكود الي يشغل محرك وفق الخطوه مطلوبه طبعا تلاحظون تبدأ من 0 الى 7
اذا كان مود هالف ستيب فأن puls1 والي أصبح الان pluses1 سوف يبدء من 0 الى 7 وبتالي يتم تشغيل محركات وفق النسق التالي
1000 1100 0100 0110 0010 0011 0001 1001
لذا انا عبرت عنها بالارقام
9 هي نفسها 1001
1 هي نفسها 0001
3 هي نفسها 0011
2 هي نفسها 0010
6 هي نفسها 0110
4 هي نفسها 0100
12 هي نفسها 1100
8 هي نفسها 1000

اما اذا اريد تشغيل بمود فول ستيب
الخطوات تصبح 6,4,2,0
9 هي نفسها 1001

3 هي نفسها 0011

6 هي نفسها 0110

12 هي نفسها 1100


ولهذا سبب تلاحظون في الكود
كود:
if(  kk1==1 )
اني أجمعت او أطرحت بمقدار 1 وفق نظام هاف ستيب

بينما أجمع او أطرح بمقدار 2 وفق نظام فول ستيب

وعند التحويل من هاف ستيب الى فول ستيب تلاحظون اني كتبت الكود
كود:
 if(puls1%2 !=0 && puls1!=0 && state1==0 && full_half_mode==1)
                                {
                                 if(value1== 1 )puls1--;
                                 else if(value2== -1 )puls1++;
                                }
لان من محتمل ان تكون puls1 عدد فردي وفي هذه حاله زياده بمقدار 2 اي خطوتين معا سوف يجعل ملف واحد شغال فقط بدلا من ملفين وبتالي راح يقلل عزم ولانني أصلا راح أمشي خطوتين ايضا أحول puls1 الى عدد زوجي لكي أشتغل ملفين معا وبتالي أحصل على عزم أقوى من تشغيل ملف واحد


كود:
switch(pluses1)
             {
              case 0  :*motor_stepper |=9; break;//1001    0
              case 1  :*motor_stepper |=1;break; // 0001   45
              case 2  :*motor_stepper |=3;break; //0011    90
              case 3  :*motor_stepper |=2;break;  //0010   135
              case 4  :*motor_stepper |=6;break; //0110    180
              case 5  :*motor_stepper |=4;break; //0100    225
              case 6  :*motor_stepper |=12;break;//1100    270
              case 7  :*motor_stepper |=8;break;//1000    315

              default:break;
             }
=========================================
وأخيرا لاطفاء محرك1 عند توقف ارسال النبضات سوف يصبح تحقق الكود التالي
كود:
if(time_stop1> 10) // 1 sec = 1000ms   ==> 1000/100=10
                 {
                  porta &=0xF0 ;// OFF motor1
                 }
لان أخر نبضه ستجعل احدى ملفات شغاله على طول وهذا خطأ لهذا يجب أطفاء البورت

الان أنتهيت من الشرح driver stepper motor وهذا هو الجزء الاول من المشروع
أما الجزء الثاني هو مخصص لشرح مشروع الي يقوم بأرسال النبضات الى driver stepper motor طبعا هو يتم أرسال النبضات بواسطه كمبيوتر ولكن هذا الجزء بديل لاستخدام كمبيوتر وطبعا الكود او فكره أجتهاد شخصي قد أكون مخطئ ولكن حسب ماراى ان يمكن ان يعوض عن كمبيوتر لا أعرف ان كنت على صواب ام لا
على عموم موضوع الان متاح للنقاش فيما يخص الجزء الاول وفي مره القادمه بمشيئه الله سوف يتم الشرح الجزء الثاني


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 16-10-2014 الساعة 05:21 PM

hamadalla31
:: مهندس متميز ::
تاريخ التسجيل: Mar 2009
المشاركات: 587
نشاط [ hamadalla31 ]
قوة السمعة:0
قديم 17-10-2014, 12:33 PM المشاركة 7   
x6 بوركت وطاب مسعاك


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

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً حسن هادي محمود ( شكر العضو على هذه المشاركة )
اعجاب حسن هادي محمود ( أعجبته المشاركة )

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


بسم الله ماشاء الله اذا كان للعبقرية معنى فانت معناه الصراحه هذا كورس كامل متكامل حول التحكم في المحركات الخطويه وبالاخص في مايخص ماكينة cnc الله يحفظك ويحفض العراق عامة والبصره الحبيبة خاصه
جزاك الله الف خير وجعله في ميزان حسناتك

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً حسن هادي محمود ( شكر العضو على هذه المشاركة )
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025