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

   

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 06-10-2014, 11:43 AM المشاركة 97   
افتراضي دائره التحكم بمحركين ستيبر (( المشروع تحت التجربه ولم يكتمل بعد))



السلام عليكم
كل عام وانتم بالف خير
هذا المشروع دائره التحكم بمحركين ستيبر (( المشروع تحت التجربه ولم يكتمل بعد))
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;
     
     }


}

اعلانات

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


أخي الكريم حسن هل يمكن جعل البك تأخذ نبضة سالبة عوضاً عن الموجبة كما بالصورة التالية:

لانني اريد صناعة دارة إنترفيس شاملة لهذه الدارة ودارات أخرى ومعظم دارات قيادة المحرك الخطوي تعتمد على نبضة سالبة.
أعتقد أنها ستعمل ولكنها ستخسر نبضة واحدة بكل عملية تشغيل اليس كذلك؟؟؟؟
مقصدي أنه مثلاً إذا كان الكمبيوتر سوف يرسل 50نبضة للدارة سوف تخسر نبضة واحدة وسوف تصبح 49 نبضة,بصراحة لاأعرف كيف أشرح لماذا ولكن أعتقد أنك سوف تعرف مقصدي.
أفتهمت مقصدك
مشكله ليست بأن نخسر نبضه وانما زمن نبضه وزمن بين نبضه وأخرى
حيث انتربت يعمل على نبضه موجبه
لكن ممكن المحاوله ان اردتم ذلك كأن نعدل على اي كود ونشوف نتيجه عملي
سحاول ارفاق ذلك وانتم جربو وأعطونه النتيجه

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

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


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

حيث يتم التحكم بالنبضه عن طريق التحكم بزمن النبضه فزمن التحكم يتراوح بين
from 5ms to 500ms

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

كود:
//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  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 calcaule_data_and_send();
void calaculate_time();
//*******************************************************************//
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('%');
}

//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 250 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= 4*((TMR1L +  (256  * TMR1H))-3036);
                     time +=(250000*run_time) ;
                    }
  return;
}
//******************************************************************//
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();
 InitTimer1();
 display_start();
 delay_ms(100);
 while(1)
      {
        if(sw_inc  && active==1)
                    {
                     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=999;
                               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++;
                               if(speed==100)speed=0;
                               if(speed<10){w3Lcd0_GotoYX(1,14);w3Lcd0_WriteChar(' ');}
                                w3Lcd0_GotoYX(1,13);
                                w3Lcd0_Dec2out_J(speed,0);
                             }
                       delay_ms(250);
                    }
                    
        if(sw_dec && active==1)
                    {

                      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;
                                 if(step<10){w3Lcd0_GotoYX(0,12);w3Lcd0_WriteChar(' ');}
                                 else if(step<100){w3Lcd0_GotoYX(0,13);w3Lcd0_WriteChar(' ');}
                                 if(step<1000){w3Lcd0_GotoYX(0,14);w3Lcd0_WriteChar(' ');}
                                 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--;
                                    if(speed==0)speed=99;
                                    if(speed<10){w3Lcd0_GotoYX(1,14);w3Lcd0_WriteChar(' ');}

                                    w3Lcd0_GotoYX(1,13);
                                    w3Lcd0_Dec2out_J(speed,0);
                               }
                       delay_ms(250);
                    }
                    
        if(sw_choice )
                    {

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

                     delay_ms(250);
                    }
         if(sw_cancel && active==1)
                    {
                     active=0;
                     system_set=0;
                     w3Lcd0_Command(_LCD_CURSOR_OFF);
                     w3Lcd0_Command(1);
                     display_start();
                     delay_ms(250);
                    }
                    
        if(sw_send  && system_set==0x07)
                    {
                         system_set=0;
                         active=0;
                          w3Lcd0_Command(_LCD_CURSOR_OFF);
                          calcaule_data_and_send();

                          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()
{
 speed1= 100-speed; // from 5ms to 500ms
 speed1 *= 5000;
  w3Lcd0_GotoYX(0,11);
  w3Lcd0_WriteChar(' ');
  w3Lcd0_WriteChar(' ');
  w3Lcd0_WriteChar(' ');
  w3Lcd0_WriteChar(' ');

 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;
                        w3Lcd0_GotoYX(0,11);
                        w3Lcd0_Dec4out_J(x+1,0);
                        calaculate_time();
                        puls1=0;
                       calaculate_time();
                      }
               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;
                        w3Lcd0_GotoYX(0,11);
                        w3Lcd0_Dec4out_J(x+1,0);
                        calaculate_time();
                        puls2=0;
                        calaculate_time();

                       }
               break;
       default : break;
     
     }
   speed=0;
  motor=0;
  step=0;

}
أتمنى تجربه المشروع وفي حاله نجاحه سنقوم بتطويره وذلك بأضافه كيباده لغرض اضافه الارقام بشكل اسرع وأضافه البيك 16f877a او 18f45k22
طبعا انا افضل العائله 18f افضل من 16f
تحياتي


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


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

حيث يتم التحكم بالنبضه عن طريق التحكم بزمن النبضه فزمن التحكم يتراوح بين
from 5ms to 500ms

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

كود:
//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  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 calcaule_data_and_send();
void calaculate_time();
//*******************************************************************//
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('%');
}

//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 250 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= 4*((TMR1L +  (256  * TMR1H))-3036);
                     time +=(250000*run_time) ;
                    }
  return;
}
//******************************************************************//
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();
 InitTimer1();
 display_start();
 delay_ms(100);
 while(1)
      {
        if(sw_inc  && active==1)
                    {
                     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=999;
                               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++;
                               if(speed==100)speed=0;
                               if(speed<10){w3Lcd0_GotoYX(1,14);w3Lcd0_WriteChar(' ');}
                                w3Lcd0_GotoYX(1,13);
                                w3Lcd0_Dec2out_J(speed,0);
                             }
                       delay_ms(250);
                    }
                    
        if(sw_dec && active==1)
                    {

                      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;
                                 if(step<10){w3Lcd0_GotoYX(0,12);w3Lcd0_WriteChar(' ');}
                                 else if(step<100){w3Lcd0_GotoYX(0,13);w3Lcd0_WriteChar(' ');}
                                 if(step<1000){w3Lcd0_GotoYX(0,14);w3Lcd0_WriteChar(' ');}
                                 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--;
                                    if(speed==0)speed=99;
                                    if(speed<10){w3Lcd0_GotoYX(1,14);w3Lcd0_WriteChar(' ');}

                                    w3Lcd0_GotoYX(1,13);
                                    w3Lcd0_Dec2out_J(speed,0);
                               }
                       delay_ms(250);
                    }
                    
        if(sw_choice )
                    {

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

                     delay_ms(250);
                    }
         if(sw_cancel && active==1)
                    {
                     active=0;
                     system_set=0;
                     w3Lcd0_Command(_LCD_CURSOR_OFF);
                     w3Lcd0_Command(1);
                     display_start();
                     delay_ms(250);
                    }
                    
        if(sw_send  && system_set==0x07)
                    {
                         system_set=0;
                         active=0;
                          w3Lcd0_Command(_LCD_CURSOR_OFF);
                          calcaule_data_and_send();

                          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()
{
 speed1= 100-speed; // from 5ms to 500ms
 speed1 *= 5000;
  w3Lcd0_GotoYX(0,11);
  w3Lcd0_WriteChar(' ');
  w3Lcd0_WriteChar(' ');
  w3Lcd0_WriteChar(' ');
  w3Lcd0_WriteChar(' ');

 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;
                        w3Lcd0_GotoYX(0,11);
                        w3Lcd0_Dec4out_J(x+1,0);
                        calaculate_time();
                        puls1=0;
                       calaculate_time();
                      }
               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;
                        w3Lcd0_GotoYX(0,11);
                        w3Lcd0_Dec4out_J(x+1,0);
                        calaculate_time();
                        puls2=0;
                        calaculate_time();

                       }
               break;
       default : break;
     
     }
   speed=0;
  motor=0;
  step=0;

}
أتمنى تجربه المشروع وفي حاله نجاحه سنقوم بتطويره وذلك بأضافه كيباده لغرض اضافه الارقام بشكل اسرع وأضافه البيك 16f877a او 18f45k22
طبعا انا افضل العائله 18f افضل من 16f
تحياتي
السلام عليكم ورحمة الله.
ماشاء الله عليك أخ حسن,أنا سأقوم بتجربته على بروتوس حالياً ولكن قم بوضع صورة للتوصيلات لأني لم افهم كيف أوصل التوصيلات وبالنسبة للأيسية فالأيسية 18f أفضل من 16f ولكن الأيسية 16f877 متوجدة بكثرة وسهل التعامل معها وللأسف لايوجد عندنا عائلة 18f نهائياً لذلك إن أمكن إستكمال المشروع بالأيسية 16f وشكراً جزيلاً وبإنتظار صورة التوصيلات والسويتشات وشاشة lcd.


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


السلام عليكم ورحمة الله.
ماشاء الله عليك أخ حسن,أنا سأقوم بتجربته على بروتوس حالياً ولكن قم بوضع صورة للتوصيلات لأني لم افهم كيف أوصل التوصيلات وبالنسبة للأيسية فالأيسية 18f أفضل من 16f ولكن الأيسية 16f877 متوجدة بكثرة وسهل التعامل معها وللأسف لايوجد عندنا عائلة 18f نهائياً لذلك إن أمكن إستكمال المشروع بالأيسية 16f وشكراً جزيلاً وبإنتظار صورة التوصيلات والسويتشات وشاشة lcd.
السلام عليكم
أخي الكريم التوصيلات واضحه جدا
فمثلا الخط الازرق هذا في بروتيس يستخدم لربط النقاط بعضها الى البعض مثلا
تجد الخط مكتوب عليه puls1 في ايسي 16f628a في بن RB4 ورمزه U4 تجده موصول الى ايسي 16f628a في بن RB4 ورمزه U1

وهكذا للبقيه


سوف أرفق ان شالله مشروع أخر لاربع محركات يتم ارسال النبضات عبر 16f877a وبأستخدام كيباده وشاشه
أستخدام كيباده يسهل لك كتابه الارقام بشكل أسرع
الان وقت الصلاه بعد ذلك سوف ارفق لكم مشروع علما يحتاج الى التجربه لكونه مشروع اولي
تحياتي


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


السلام عليكم
أخي الكريم التوصيلات واضحه جدا
فمثلا الخط الازرق هذا في بروتيس يستخدم لربط النقاط بعضها الى البعض مثلا
تجد الخط مكتوب عليه puls1 في ايسي 16f628a في بن RB4 ورمزه U4 تجده موصول الى ايسي 16f628a في بن RB4 ورمزه U1

وهكذا للبقيه


سوف أرفق ان شالله مشروع أخر لاربع محركات يتم ارسال النبضات عبر 16f877a وبأستخدام كيباده وشاشه
أستخدام كيباده يسهل لك كتابه الارقام بشكل أسرع
الان وقت الصلاه بعد ذلك سوف ارفق لكم مشروع علما يحتاج الى التجربه لكونه مشروع اولي
تحياتي
أعتذر منك أخي حسن ولكني أستخدم بروتوس 8.1 لذلك لم أرى ملف DSN الخاص بالمشروع داخل الملف ولكن الأن قد رأيته والحمد لله ونصبت بروتوس 7.1 من أجل الملفات الأخرى وبعد أن رأيت المشروع لايسعني أن أقول سوى.
ماشاء الله مشروع في غاية الروعة والجمال وهوَ يعمل بشكل رائع على بروتوس ولكن تعليقي على شيء بسيط وهو عدد النبضات المرسلة,يعني كل نبضة يجب أن نضغط ضغطة وهذا سيأخذ الكثير من الوقت لأن معظم المحركات يحتاج إلى 150نبضة وأكثر لكي يتم لفة واحدة,أنا أعلم أن هذا مشروع أولي وأعلم أنك لديك حل لهذا ولكن للتنويه فقط.
تحياتي لك وتقبل الله.


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


السلام عليكم
في هذا المشروع يتم التحكم بأربعه محركات
http://up.top4top.net/downloadf-top4...99691-rar.html

https://www.youtube.com/watch?v=ipGg...ature=youtu.be

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


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

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


أعتذر منك أخي حسن ولكني أستخدم بروتوس 8.1 لذلك لم أرى ملف DSN الخاص بالمشروع داخل الملف ولكن الأن قد رأيته والحمد لله ونصبت بروتوس 7.1 من أجل الملفات الأخرى وبعد أن رأيت المشروع لايسعني أن أقول سوى.
ماشاء الله مشروع في غاية الروعة والجمال وهوَ يعمل بشكل رائع على بروتوس ولكن تعليقي على شيء بسيط وهو عدد النبضات المرسلة,يعني كل نبضة يجب أن نضغط ضغطة وهذا سيأخذ الكثير من الوقت لأن معظم المحركات يحتاج إلى 150نبضة وأكثر لكي يتم لفة واحدة,أنا أعلم أن هذا مشروع أولي وأعلم أنك لديك حل لهذا ولكن للتنويه فقط.
تحياتي لك وتقبل الله.
في مشاركه السابقه أستخدمت كيباده من خلالها تكتب اي رقم تريده يعني اريد كتابه 350 خطوه فمجرد الضغط على الارقام من كيباده

عفوا لم أفهم هذه نقطه
لأن معظم المحركات يحتاج إلى 150نبضة وأكثر لكي يتم لفة واحدة
بالصراحه قولي عن مشروع لايزال اولي لاني بعد لاأفهم طريقه الضبط السرعه فهل طريقه الي أستخدمتها صحيحه ام وهي كتالي
كود:
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



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