|
أخي حسن مقصدي أنهُ مثلاً يوجد محركات تتحرك 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()// ÏÇáÉ ÈÑãÌÉ ÇáßíÈÇÏÉ
{
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
تحياتي