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