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

   

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



الحرف E الذي يظهر في الشاشه تعني ERROR

على فكره اذا عدلت على محرك الستيبر في البروتيس وغير درجه الخطوه من 90 الى 2 درجتين تصبح دقه ممتازه حيث هو دائما يقسم درجه الخطوه الى النصف اي يصبح دقه 1 درجه فقط
انا أحاول في مشروع في مشاركه السابقه اضافه FULL MODE AND HALF MODE

اي التحكم بدرجه كامله مثلا محرك الخطوه درجه التحكم 90 درجه فستطيع جعله يدور كل 90 درجه ويسمى عندئذ FULL MODE واجعله يدور كل نصف درجه الخطوه اي 45 ويسمى HALF MODE

في حاله وصول الى مشروع مكتمل وفعال سوف أقوم بشرحه على شكل PDF لغرض فهم برمجته لكي يقوم أي شخص بالتعديل عليه
تحياتي

اعلانات

الصورة الرمزية hussien1995
hussien1995
:: عضو فضي ::
تاريخ التسجيل: Nov 2012
الدولة: syria
المشاركات: 764
نشاط [ hussien1995 ]
قوة السمعة:
قديم 08-10-2014, 07:07 PM المشاركة 106   
افتراضي


الحرف E الذي يظهر في الشاشه تعني ERROR

على فكره اذا عدلت على محرك الستيبر في البروتيس وغير درجه الخطوه من 90 الى 2 درجتين تصبح دقه ممتازه حيث هو دائما يقسم درجه الخطوه الى النصف اي يصبح دقه 1 درجه فقط
انا أحاول في مشروع في مشاركه السابقه اضافه FULL MODE AND HALF MODE

اي التحكم بدرجه كامله مثلا محرك الخطوه درجه التحكم 90 درجه فستطيع جعله يدور كل 90 درجه ويسمى عندئذ FULL MODE واجعله يدور كل نصف درجه الخطوه اي 45 ويسمى HALF MODE

في حاله وصول الى مشروع مكتمل وفعال سوف أقوم بشرحه على شكل PDF لغرض فهم برمجته لكي يقوم أي شخص بالتعديل عليه
تحياتي
إبدء على بركة الله ونحن معاك ونساعدك بما نستطيع بإن الله.

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

الصورة الرمزية hussien1995
hussien1995
:: عضو فضي ::
تاريخ التسجيل: Nov 2012
الدولة: syria
المشاركات: 764
نشاط [ hussien1995 ]
قوة السمعة:
قديم 08-10-2014, 07:12 PM المشاركة 107   
افتراضي


في مشاركه السابقه أستخدمت كيباده من خلالها تكتب اي رقم تريده يعني اريد كتابه 350 خطوه فمجرد الضغط على الارقام من كيباده

عفوا لم أفهم هذه نقطه

بالصراحه قولي عن مشروع لايزال اولي لاني بعد لاأفهم طريقه الضبط السرعه فهل طريقه الي أستخدمتها صحيحه ام وهي كتالي
كود:
speed1= 100-speed; // from 5ms to 500ms
 speed1 *= 5000;
طبعا speed انت تقوم بضبطها من كيباده
speed1= 100-speed
هنا قصدي انك اذا كتبت في شاشه speed=10% مفروض محرك يعمل ببطئ لذا اذا لم أعدل عليها يعني أخذ العكس فمحرك يتحرك بسرعه
ولهذا يجب ان تصبح معدل البطئ = 100-10=90%

بعدها قلت
speed1 *= 5000
يعني نضرب قيمه speed1 في 5000
اذا 90%= 90 * 5000= 450000 = 450ms

الرقم 5000 وتعني 5ms يعني كل 1%=5ms
أخي حسن مقصدي أنهُ مثلاً يوجد محركات تتحرك 2 درجة كل نبضة وهناك محركات تتحرك 3 درجة كل نبضة لذلك لإتمام الدورة الكاملة والتي هي 360درجة فأنت بحاجة لأكثر من 150 نبضة كحد وسطي.
بالنسبة للدارة فقد عاينتها زلدي تعليق بسيط وهوَ السرعة فعند وضع سرعة 10% وصولاً لسرعة70% فأنت لاترى فرق جوهري بالسرعة ولكن عندما تضع سرعة 95% فرضاً فأنت ترى أن المحرك يدور بسرعة عالية جداً لدرجة أن 500نبضة تنتهي بظرف 2لى3ثانية,حاولت التعديل على السرعة عن طريق الكود فأصبح من10% إلى 50% بطيئ ولكن المشكلة أنه عند 55%فما فوق يصبح المحرك سريع جداً فما الحل لهذا؟؟؟؟
شكراً لك فعلاً دارة متميزة.


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


أخي حسن مقصدي أنهُ مثلاً يوجد محركات تتحرك 2 درجة كل نبضة وهناك محركات تتحرك 3 درجة كل نبضة لذلك لإتمام الدورة الكاملة والتي هي 360درجة فأنت بحاجة لأكثر من 150 نبضة كحد وسطي.
بالنسبة للدارة فقد عاينتها زلدي تعليق بسيط وهوَ السرعة فعند وضع سرعة 10% وصولاً لسرعة70% فأنت لاترى فرق جوهري بالسرعة ولكن عندما تضع سرعة 95% فرضاً فأنت ترى أن المحرك يدور بسرعة عالية جداً لدرجة أن 500نبضة تنتهي بظرف 2لى3ثانية,حاولت التعديل على السرعة عن طريق الكود فأصبح من10% إلى 50% بطيئ ولكن المشكلة أنه عند 55%فما فوق يصبح المحرك سريع جداً فما الحل لهذا؟؟؟؟
شكراً لك فعلاً دارة متميزة.
السلام عليكم
تم تحديث مشروع حيث
1- تم أختصار الكود بمقارنه مع مشروع السابق
2- اضافه مفتاح أختيار FULL MODE OR HALF MODE
3- تم وضع جميع المحركات على 2 درجه اي كل محرك تم ضبطه أعدادته على 2 درجه
4- بالنسبه للخطوه او النبضات يمكنك ارسال نبضات لغايه 9999 نبضه
5- تم التعديل على السرعه
6- أضافه زر مسح البيانات في ايبروم لان داتا في ايبروم تسجل اخر خطوه وصلها لها محرك لكي من يعمل محرك من جديد يبدأ في تغذيه ملفات التي وصل لها لكي يبدء تسلسل تشغيل صحيح للمحرك وبدون حفظ اي اخر خطوه فأنه اذا كان محرك عند 250 درجه مثلا عند أنقطاع تيار وعودته من جديد فأن اول نبضه سوف تجعل محرك يعمل من درجه 0 وبتالي سوف تسبب بدوران محرك بأتجاه غير مطلوب منه ومن ثم بعد ذلك يستقر ليعمل وفق نسق الصحيح ولتجنب ذلك نقوم بخزن اخر خطوه وصل لها حتى البرنامج يبدأ منها
جربو مشروع وأعطوني اي تعليقكم لغرض التطوير

اما الشرح البرنامج أفضل عند أكتماله بشكل مطلوب لاني البرنامج بحاجه الى التجربه والتطوير

أضافات التي يمكن ان تضاف
1- مفتاح التوقف النبضات بشكل مؤقت
2- مفتاح الخروج يعني مثلا انت ارسلت 100 نبضه ثم تريد التوقف موقتا او تريد خروجا لغرض اعاده البرمجه

الكود محركات
كود:
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;
             }

}
=====================================
كود التحكم او مرسل النبضات
كود:
#define   stepper_motor     portb
#define  is                   ==
// Lcd pinout settings
sbit LCD0_RS at RC4_bit;
sbit LCD0_EN at RC5_bit;
sbit LCD0_D7 at RC3_bit;
sbit LCD0_D6 at RC2_bit;
sbit LCD0_D5 at RC1_bit;
sbit LCD0_D4 at RC0_bit;

// Pin direction
sbit LCD0_RS_Direction at TRISC4_bit;
sbit LCD0_EN_Direction at TRISC5_bit;
sbit LCD0_D7_Direction at TRISC3_bit;
sbit LCD0_D6_Direction at TRISC2_bit;
sbit LCD0_D5_Direction at TRISC1_bit;
sbit LCD0_D4_Direction at TRISC0_bit;
char keypadPort at PORTD;
sbit led at RA0_bit;
sbit led_dir at TRISA0_bit;
//****************************************************************//
char const send_data_message[]="Please Wait...";
char const finish_message[]="Data is send";
char const welcome1_message[]="    Welcome";
char const welcome2_message[]="Please Wait..";
unsigned char kp,num , flag_kp=0 , kk=0;
unsigned char  motor=0,speed=0 ,active=0, state_spped_step=0 , state_dir=0 , system_set=0 ,run_time;
unsigned int  step=0 , x ,y ;
long time,speed1;
//*****************************************************************//
void keypad1();
void calcaule_data_and_send();
void calaculate_time();
//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 (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H         = 0x0B;
    TMR1L         = 0xDC;
    //Enter your code here
    run_time++;
  }
}
//*************************************************************//
void calaculate_time()
{
  time=0;
  run_time=0;
  while(time<speed1){
                     time = (( (TMR1L +  (256  * TMR1H)  )-3036)*16)/10; // 4* 8 /20 = 16 /10
                     time +=(100000*run_time) ;
                    }
  return;
}
//**************************************************************//
void display_start()
{
 Lcd0_GotoYX(0,0);
 Lcd0_RstrNout("Mot:",4);
 Lcd0_GotoYX(0,4);
 Lcd0_WriteChar('0');
 Lcd0_GotoYX(0,6);
 Lcd0_RstrNout("Step:",5);
 Lcd0_GotoYX(0,11);
 Lcd0_WriteChar('0');
 Lcd0_GotoYX(1,0);
 Lcd0_RstrNout("dir:",4);
 Lcd0_GotoYX(1,5);
 Lcd0_WriteChar('x');
 Lcd0_GotoYX(1,7);
 Lcd0_RstrNout("speed:",6);
 Lcd0_GotoYX(1,13);
 Lcd0_WriteChar('0');
 Lcd0_GotoYX(1,15);
 Lcd0_WriteChar('%');
}
//**************************************************************************//
void main()
{
 cmcon=7;
 adcon1=6;
 trisb=0;
 led=0;
 led_dir=0;
 stepper_motor=0;
 Keypad_Init();
 Lcd0_Init();
 Lcd0_Command(1);
 Lcd0_GotoYX(0,0);
 Lcd0_CstrOut(welcome1_message);
  Lcd0_GotoYX(1,0);
 Lcd0_CstrOut(welcome2_message);
 InitTimer1();

 for(x=0;x<10;x++){led=0;delay_ms(250); led=1;delay_ms(250);}
 Lcd0_Command(1);
 display_start();
 while(1)
        {
          keypad1();


          if(state_spped_step==1  && flag_kp==1)
                             {
                               motor=num;
                               system_set.f0=1;
                               Lcd0_GotoYX(0,4);
                               if(motor<=4)Lcd0_WriteChar(motor+48);
                                else { system_set.f0=0;Lcd0_WriteChar('E');}   // E : error
                             }
           else if(state_spped_step==2  && flag_kp==1)
                             {
                               if(kk <4 )
                                  {
                                   if(kk==0)
                                            {
                                             step=num;
                                             Lcd0_GotoYX(0,12);
                                             Lcd0_RstrOut("   ");
                                            }
                                   else if(kk==1)step=(step*10) + num;
                                   else if(kk==2)step=(step*10) + num;
                                   else if(kk==3)step=(step*10) + num;
                                  }
                                  kk++;
                                 if(kk==4)kk=0;
                               system_set.f1=1;
                               Lcd0_GotoYX(0,11);
                               Lcd0_Dec4out_J(step,0);
                             }
          else if(state_spped_step==3 && flag_kp==1)
                             {
                                state_dir=num;
                                system_set.f2=1;
                               Lcd0_GotoYX(1,5);
                               if(state_dir==1)Lcd0_WriteChar('R');
                               else if(state_dir==2)Lcd0_WriteChar('L');
                               else { system_set.f2=0;Lcd0_WriteChar('E');}
                             }
          else  if(state_spped_step==4 && flag_kp==1)
                             {
                                if(kk <2 )
                                  {
                                   if(kk==0)
                                            {
                                             speed=num;
                                             Lcd0_GotoYX(1,14);
                                             Lcd0_WriteChar(' ');
                                            }
                                   else if(kk==1)speed=(speed*10) + num;
                                  }
                                  kk++;
                                 if(kk==2)kk=0;

                               if(speed<10){Lcd0_GotoYX(1,14);Lcd0_WriteChar(' ');}
                                Lcd0_GotoYX(1,13);
                                Lcd0_Dec2out_J(speed,0);
                             }



        if(kp==16 || kp==15 )
                    {

                     active=1;
                     if(kp==16)state_spped_step++;
                     else if(kp==15)if(state_spped_step !=0)state_spped_step--;
                     if(state_spped_step==0)state_spped_step=1;
                     else  if(state_spped_step >=5)state_spped_step=4;
                     kp=0;
                     kk=0;
                     Lcd0_Command(_LCD_BLINK_CURSOR_ON);

                     if(state_spped_step==1)Lcd0_GotoYX(0,4);
                     else if(state_spped_step==2) Lcd0_GotoYX(0,11);
                     else if(state_spped_step==3) Lcd0_GotoYX(1,5);
                     else if(state_spped_step==4) Lcd0_GotoYX(1,13);

                    }
         if( kp==4 && active==1   )
                    {
                     active=0;
                     kp=0;
                     system_set=0;
                     Lcd0_Command(_LCD_CURSOR_OFF);
                     Lcd0_Command(1);
                     display_start();
                    }

        if(kp==12 && system_set==0x07)
                    {
                         system_set=0;
                         active=0;
                         state_spped_step=0;
                         kp=0;
                         kk=0;
                          Lcd0_Command(_LCD_CURSOR_OFF);
                          calcaule_data_and_send();

                          Lcd0_Command(1);
                          Lcd0_GotoYX(0,0);
                          Lcd0_CstrOut(send_data_message);
                          delay_ms(250);
                          Lcd0_Command(1);
                          Lcd0_GotoYX(0,0);
                          Lcd0_CstrOut(finish_message);
                          delay_ms(250);
                          Lcd0_Command(1);
                          display_start();
                    }
        
        }
}

//******************************************************************//
void keypad1()// &#207;&#199;&#225;&#201; &#200;&#209;&#227;&#204;&#201; &#199;&#225;&#223;&#237;&#200;&#199;&#207;&#201;
{
   kp=0;
   flag_kp=0;
   while( kp is 0) kp= Keypad_Key_Click();
   if ( kp is 1) num=7;
   else if(kp is 2) num=4;
   else if(kp is 3) num=1;
   else if(kp is 4) kp=4;
   else if(kp is 5) num=8;
   else if(kp is 6) num=5;
   else if(kp is 7) num=2;
   else if(kp is 8) num=0;
   else if(kp is 9) num=9;
   else if(kp is 10) num=6;
   else if(kp is 11) num=3;
   else if(kp is 12) kp=12;
   else if(kp is 13) kp=13;
   else if(kp is 14) kp=14;
   else if(kp is 15) kp=15;
   else if(kp is 16) kp=16;
   else  {kp=255;flag_kp=0;}
   if( kp !=255){
                  if(kp >=1 && kp <=11 &&  kp !=4)flag_kp=1;
                  else flag_kp=0;
                }

 }
 
 

//**************************************************************************
void calcaule_data_and_send()
{
 speed1= 100-speed; // from 20ms to 1000ms
 speed1 *= 10000; // every speed=1 then time= 10ms

  Lcd0_GotoYX(0,11);
  Lcd0_WriteChar(' ');
  Lcd0_WriteChar(' ');
  Lcd0_WriteChar(' ');
  Lcd0_WriteChar(' ');

 switch(motor)
     {
       case 1: if(state_dir==1)stepper_motor.b1=1;// rotation to right
               else if(state_dir==2)stepper_motor.b1=0;// rotation to lift break;
               for(x=0;x<step;x++)
                       {
                        stepper_motor.b0=1;
                        Lcd0_GotoYX(0,11);
                        Lcd0_Dec4out_J(x+1,0);
                        calaculate_time();
                        stepper_motor.b0=0;
                       calaculate_time();
                      }
               break;
       case 2: if(state_dir==1)stepper_motor.b3=1;// rotation to right
               else if(state_dir==2)stepper_motor.b3=0;// rotation to lift break;
               for(x=0;x<step;x++)
                       {
                        stepper_motor.b2=1;
                        Lcd0_GotoYX(0,11);
                        Lcd0_Dec4out_J(x+1,0);
                        calaculate_time();
                        stepper_motor.b2=0;
                        calaculate_time();

                       }
               break;
               
        case 3: if(state_dir==1)stepper_motor.b5=1;// rotation to right
               else if(state_dir==2)stepper_motor.b5=0;// rotation to lift break;
               for(x=0;x<step;x++)
                       {
                        stepper_motor.b4=1;
                        Lcd0_GotoYX(0,11);
                        Lcd0_Dec4out_J(x+1,0);
                        calaculate_time();
                        stepper_motor.b4=0;
                        calaculate_time();

                       }
               break;
       case 4: if(state_dir==1)stepper_motor.b7=1;// rotation to right
               else if(state_dir==2)stepper_motor.b7=0;// rotation to lift break;
               for(x=0;x<step;x++)
                       {
                        stepper_motor.b6=1;
                        Lcd0_GotoYX(0,11);
                        Lcd0_Dec4out_J(x+1,0);
                        calaculate_time();
                        stepper_motor.b6=0;
                        calaculate_time();

                       }
               break;
       default : break;

     }
  stepper_motor=0;
  speed=0;
  motor=0;
  step=0;

}
وهذا هو البرنامج
https://www.mediafire.com/?d3dsh00a2uy8jsw

تحياتي


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

حمودي الحلو
:: مهندس متواجد ::
تاريخ التسجيل: Sep 2006
الدولة: العراق
المشاركات: 104
نشاط [ حمودي الحلو ]
قوة السمعة:
قديم 08-10-2014, 08:37 PM المشاركة 109   
افتراضي


السلام عليكم
كل عام وانتم بالف خير
هذا المشروع دائره التحكم بمحركين ستيبر (( المشروع تحت التجربه ولم يكتمل بعد))
http://up.top4top.net/downloadf-top4...da921-rar.html

طبعا طريقه التشغيل كتالي
1- تضغط على مفتاح choice وتختار المحرك طبعا راح يومض مؤشر في مكان الي انت تريد ضبطه مثلا أختاريت mot حدد محرك 1 او 2 عن طريق مفاتيح زياده ونقصان ------- --STP++ STP
ومن ثم تختار عدد الخطوات (( طبعا برمجتها من 1 الى 1000 خطوه)) ايضا يتم الضبط عن طريق مفاتيح زياده ونقصان

ومن ثم ننتقل الى dir لتحديد الاتجاه R يعني بأتجاه دوران عقارب الساعه و L يعني عكس أتجاه دوران عقارب الساعه

اما speed فحاليا غير متفعله لعدم معرفتي بزمن محركات الخطوه او أقصد تردد الي يعمل عليه محركات الخطوه
ملاحظه// يجب الضبط جميع القيم لكي يعطيك السماح بأرسال البيانات
ملاحظه// يتم التنقل بين القوائم عن طريق مفتاح choice
مفتاح cancel يلغي العمليه ويعودك الى الشاشه الاصليه

===========================================

ملاحظه مهمه // كود لن يعمل معاك يعني لن تنجح عمليه build الا اذا ضفت مكتبه الشاشه
كتالي
1- من project نضغط add file to project
2- طبعا راح يخبرك اين ملف الي انت تريد أضافته
اختار ملف control for stepper motor وبداخله اختار w3Lcd وأختر p16_w3Lcd-4
============================================
قمت بتجربته على البروتيس وعمل كود بنجاح

نحتاج الى الضبط السرعه ؟؟؟

على عموم هذا ليس كود نهائي وان شالله نصل الى كود عام لتحكم بمحركات الخطوه
كود:
//w3Lcd0 pin definitions:
sbit w3Lcd0_EN    at RB0_bit;
sbit w3Lcd0_DATA  at RB1_bit;
sbit w3Lcd0_CLOCK at RB2_bit;
sbit w3Lcd0_EN_Direction    at TRISB0_bit;
sbit w3Lcd0_DATA_Direction  at TRISB1_bit;
sbit w3Lcd0_CLOCK_Direction at TRISB2_bit;

sbit sw_send     at RA0_bit;
sbit sw_choice at RA1_bit;
sbit sw_cancel at RA2_bit;
sbit sw_inc at RA3_bit;
sbit sw_dec at RA4_bit;



sbit sw_send_dir at TRISA0_bit;
sbit sw_choice_dir at TRISA1_bit;
sbit sw_cancel_dir at TRISA2_bit;
sbit sw_inc_dir at TRISA3_bit;
sbit sw_dec_dir at TRISA4_bit;




sbit puls1 at RB4_bit;
sbit dir1 at RB5_bit;
sbit puls2 at RB6_bit;
sbit dir2 at RB7_bit;

sbit puls1_dir  at TRISB4_bit;
sbit dir1_dir at TRISB5_bit;
sbit puls2_dir at TRISB6_bit;
sbit dir2_dir at TRISB7_bit;

//**************************************************************//
char const send_data_message[]="Please Wait...";
char const finish_message[]="Data is send";
char const error_message[]="data is error";

unsigned char flag_inc=0,flag_dec=0,flag_choice=0 ,flag_send,flag_cancel=0;
unsigned char  motor=0,speed=0 ,active=0, state_spped_step=0 , state_dir=0 , system_set=0;
unsigned int  time_inc=0,time_dec=0,time_choice=0 ,time_send,time_cancel ;
unsigned int  step=0 , x;

void calcaule_data_and_send();
//*****************************************************************//
//Timer0
//Prescaler 1:256; TMR0 Preload = 61; Actual Interrupt Time : 24.96 ms

//Place/Copy this part in declaration section
void InitTimer0(){
  OPTION_REG         = 0x87;
  TMR0                 = 61;
  INTCON         = 0xA0;
}

void Interrupt(){
  if (TMR0IF_bit){
    TMR0IF_bit         = 0;
    TMR0                 = 61;
    //Enter your code here
    if(flag_inc==1)time_inc++;
    if(flag_dec==1)time_dec++;
    if(flag_choice==1)time_choice++;
    if(flag_cancel==1)time_cancel++;
    if(flag_send==1)time_send++;
  }
}
//*******************************************************************//
void display_start()
{
w3Lcd0_GotoYX(0,0);
 w3Lcd0_RstrNout("Mot:",4);
  w3Lcd0_GotoYX(0,4);
 w3Lcd0_WriteChar('0');
 w3Lcd0_GotoYX(0,6);
 w3Lcd0_RstrNout("Step:",5);
  w3Lcd0_GotoYX(0,11);
 w3Lcd0_WriteChar('0');
 w3Lcd0_GotoYX(1,0);
 w3Lcd0_RstrNout("dir:",4);
  w3Lcd0_GotoYX(1,5);
 w3Lcd0_WriteChar('x');
 w3Lcd0_GotoYX(1,7);
 w3Lcd0_RstrNout("speed:",6);
  w3Lcd0_GotoYX(1,13);
 w3Lcd0_WriteChar('0');
 w3Lcd0_GotoYX(1,15);
 w3Lcd0_WriteChar('%');
}
//******************************************************************//
void main()
{
 cmcon=7;
 puls1_dir=0;
 dir1_dir=0;
 puls2_dir=0;
 dir2_dir=0;

 puls1=0;
 dir1=0;
 puls2=0;
 dir2=0;
 
 sw_dec_dir=1;
 sw_inc_dir=1;
 sw_choice_dir=1;
 sw_send_dir=1;
 sw_cancel_dir=1;
 w3Lcd0_Init();
 display_start();
 InitTimer0();
 delay_ms(100);
 while(1)
      {
        if(sw_inc && active==1)flag_inc=1;
        if(sw_dec && active==1)flag_dec=1;
        if(sw_send && system_set==0x0F)flag_send=1;
        if(sw_cancel && active==1)flag_cancel=1;
        if(sw_choice )flag_choice=1;
        
        if(flag_inc && time_inc>10)
                    {
                     time_inc=0;
                     flag_inc=0;
                     if(state_spped_step==1)
                             {
                               motor++;
                               system_set.f0=1;
                               if(motor==3)motor=2;
                               w3Lcd0_GotoYX(0,4);
                               w3Lcd0_WriteChar(motor+48);
                             }
                     else if(state_spped_step==2)
                             {
                               step++;
                               system_set.f1=1;
                               if(step==1000)step=1000;
                               w3Lcd0_GotoYX(0,11);
                               w3Lcd0_Dec4out_J(step,0);
                             }
                     else if(state_spped_step==3)
                             {
                                state_dir=1;
                                system_set.f2=1;
                               w3Lcd0_GotoYX(1,5);
                               w3Lcd0_WriteChar('R');
                             }
                     else  if(state_spped_step==4)
                             {
                                speed++;
                                system_set.f3=1;
                               if(speed==100)speed=99;
                                w3Lcd0_GotoYX(1,13);
                                w3Lcd0_Dec2out_J(speed,0);
                             }

                    }
                    
        if(flag_dec && time_dec>10)
                    {
                     time_dec=0;
                     flag_dec=0;
                     
                      if(state_spped_step==1)
                             {
                               system_set.f0=1;
                               if(motor !=0)motor--;
                               if(motor==0)motor=1;
                               w3Lcd0_GotoYX(0,4);
                               w3Lcd0_WriteChar(motor+48);
                             }
                     else if(state_spped_step==2) // step
                               {
                                 if(step !=0)step--;
                                 system_set.f1=1;
                                 w3Lcd0_GotoYX(0,11);
                                 w3Lcd0_Dec4out_J(step,0);
                               }
                      else if(state_spped_step==3)
                             {
                               state_dir=2;
                               system_set.f2=1;
                               w3Lcd0_GotoYX(1,5);
                              w3Lcd0_WriteChar('L');
                             }
                     else if(state_spped_step==4)  // speed,
                               {
                                    if(speed !=0)speed--;
                                    system_set.f3=1;
                                    w3Lcd0_GotoYX(1,13);
                                    w3Lcd0_Dec2out_J(speed,0);
                               }

                    }
                    
        if(flag_choice && time_choice>10)
                    {
                     time_choice=0;
                     flag_choice=0;
                     active=1;
                     state_spped_step++;
                     if(state_spped_step==1 || state_spped_step==5) 
                                                  {
                                                    state_spped_step=1;
                                                    w3Lcd0_GotoYX(0,4);
                                                    w3Lcd0_Command(_LCD_BLINK_CURSOR_ON);
                                                   }
                     else if(state_spped_step==2) { w3Lcd0_GotoYX(0,11);w3Lcd0_Command(_LCD_BLINK_CURSOR_ON);}
                     else if(state_spped_step==3){ w3Lcd0_GotoYX(1,5);w3Lcd0_Command(_LCD_BLINK_CURSOR_ON);}
                     else if(state_spped_step==4){ w3Lcd0_GotoYX(1,13);w3Lcd0_Command(_LCD_BLINK_CURSOR_ON);}


                    }
         if(flag_cancel && time_cancel>10)
                    {
                     time_cancel=0;
                     flag_cancel=0;
                     active=0;
                     system_set=0;
                     w3Lcd0_Command(_LCD_CURSOR_OFF);
                     w3Lcd0_Command(1);
                     display_start();

                    }
                    
        if(flag_send  && time_send>10)
                    {
                         time_send=0;
                         flag_send=0;
                         system_set=0;
                         active=0;

                          calcaule_data_and_send();
                          w3Lcd0_Command(_LCD_CURSOR_OFF);
                          w3Lcd0_Command(1);
                          w3Lcd0_GotoYX(0,0);
                          w3Lcd0_CstrOut(send_data_message);
                          delay_ms(250);
                          w3Lcd0_Command(1);
                          w3Lcd0_GotoYX(0,0);
                          w3Lcd0_CstrOut(finish_message);
                          delay_ms(250);
                          w3Lcd0_Command(1);
                          display_start();



                    }
      }

}

//**************************************************************************
void calcaule_data_and_send()
{

 switch(motor)
     {
       case 1: if(state_dir==1)dir1=1;// rotation to right
               else if(state_dir==2)dir1=0;// rotation to lift break;
               for(x=0;x<step;x++)
                       {
                        puls1=1;
                        delay_ms(100);
                        puls1=0;
                        delay_ms(100);
                       }
               break;
       case 2: if(state_dir==1)dir2=1;// rotation to right
               else if(state_dir==2)dir2=0;// rotation to lift break;
               for(x=0;x<step;x++)
                       {
                        puls2=1;
                        delay_ms(100);
                        puls2=0;
                        delay_ms(100);
                       }
               break;
       default : break;
     
     }


}
يرجى جعل المشروع في موضوع مستقل للاستفادة منه مستقبلا كون الموضوع الحالي طويل ويتعذر متابعته ...
مع فائق الاحترام
محمد حنون


النمرالفولاذي
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2012
المشاركات: 134
نشاط [ النمرالفولاذي ]
قوة السمعة:
قديم 09-10-2014, 12:27 AM المشاركة 110   
افتراضي


السلام عليكم وكل عام وانتم بالف خير يااخواني واحبابي اعتذر عن الانقطاع بسبب الاشغال وضعف الانترنت
ماشاء الله عليكم والله اكثر من روعة ومجهود من الاستاذ حسن هادي جبار صراحتا وعن قريب سوف اشرع بتصميم الماكينة وسوف استخدم نوعين من السواقات الخاصه بالمحركات الخطويه النوع الاول هو المتكاملات l297 و l298 وبعد التجربه ونجاحها انشاء الله سوف اقوم باستبدال كروت السواقات بكروت تحتوي على بيكات وساستخدم البرنامج الخاص بالاستاذ حسن هادي الذي يتحكم بمحرك واحد ويتحكم باتجاهه وكذالك انقطاع التيار عند عدم اعطاء نبضه لاني اعتبره كود جدا جدا.جدا مهم وغني ولم اجد مساعده في هذا الموضوع الا من اخي وحبيبي حسن هادي بعد فهمي للمايكنة من الاستاذ علاء الدين
اشكركم يا اخوان وبالتوفيق يارب


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


السلام عليكم
تم تحديث مشروع
http://up.top4top.net/downloadf-top4...93381-rar.html
بأضافات التاليه
1- مفتاح التوقف النبضات بشكل مؤقت عن طريق مفتاح X من كيباده مع ليد للدلاله على توقف البرنامج بشكل مؤقت
2- مفتاح الخروج عن طريق مفتاح ON/C
3- اضافه ليد ثنائي لون أحمر - أخضر لغرض بينان حاله نظام اخضر يعني البيك يرسل نبضات و احمر متوقف
4- يمكنك اضافه مفتاح ريسيت لغرض ترسيت وهنا لاتحتاج الى البرمجه لان مدخل ريسيت يكون دائما =1 اذا اصبح ب 0 سوف يعمل على ترسيت البرنامج
في هذه الحاله اربط MCLR لكلا 16f877a لعمل ريسيت لكلاهما او تضع كل منها ريسيت خاصه به
5- جميع ليدات وسويجات توضع في واجهه واحده
تحياتي


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


السلام عليكم وكل عام وانتم بالف خير يااخواني واحبابي اعتذر عن الانقطاع بسبب الاشغال وضعف الانترنت
ماشاء الله عليكم والله اكثر من روعة ومجهود من الاستاذ حسن هادي جبار صراحتا وعن قريب سوف اشرع بتصميم الماكينة وسوف استخدم نوعين من السواقات الخاصه بالمحركات الخطويه النوع الاول هو المتكاملات l297 و l298 وبعد التجربه ونجاحها انشاء الله سوف اقوم باستبدال كروت السواقات بكروت تحتوي على بيكات وساستخدم البرنامج الخاص بالاستاذ حسن هادي الذي يتحكم بمحرك واحد ويتحكم باتجاهه وكذالك انقطاع التيار عند عدم اعطاء نبضه لاني اعتبره كود جدا جدا.جدا مهم وغني ولم اجد مساعده في هذا الموضوع الا من اخي وحبيبي حسن هادي بعد فهمي للمايكنة من الاستاذ علاء الدين
اشكركم يا اخوان وبالتوفيق يارب
السلام عليكم
نتمنى لكم من الله التوفيق
ونتمنى ان تعرضو لنا الصور عن كيفيه تصميم الماكينة
تحياتي



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