test4
Dependencies: mbed BufferedSerial LS7366LIB2 FastPWM
limit.h
- Committer:
- lsh3146
- Date:
- 2020-12-08
- Revision:
- 4:bf278ddb8504
- Parent:
- 1:7b5469bf5994
File content as of revision 4:bf278ddb8504:
#ifndef _LIMIT_H_ #define _LIMIT_H_ #define limit_debug_print false #define start_duty 200 #define limit_max_power 500 bool limit_find[6]={false,false,false,false,false,false}; DigitalIn limit_sw1(LIMIT_SW1); DigitalIn limit_sw2(LIMIT_SW2); DigitalIn limit_sw3(LIMIT_SW3); DigitalIn limit_sw4(LIMIT_SW4); DigitalIn limit_sw5(LIMIT_SW5); DigitalIn limit_sw6(LIMIT_SW6); #define limit_time 10000 void limit_init() { limit_sw1.mode(PullUp); limit_sw2.mode(PullUp); limit_sw3.mode(PullUp); limit_sw4.mode(PullUp); limit_sw5.mode(PullUp); limit_sw6.mode(PullUp); } double limit_ex_encoder_data[6]={0,}; double diff_encoder_data[6]={0,0,0,0,0,0}; double sum_error[6]={0,0,0,0,0,0}; double motor_duty[6]={-60,0,0,0,0,0}; double limit_taget_speed[6]={0,0,0,0,0,0}; double limit_result[6]={0,0,0,0,0,0}; double limit_output[6]={0,0,0,0,0,0}; double limit_error[6]={0,0,0,0,0,0}; double axis123_taget_speed=30; double axis4_taget_speed=-56; double axis56_taget_speed=30; int ccnt=0; int limit_count1=0; int limit_count2=0; int limit_count3=0; int limit_count4=0; int limit_count5=0; int limit_count6=0; int limit_result1=1; int limit_result2=1; int limit_result3=1; int limit_result4=1; int limit_result5=1; int limit_result6=1; void limit_1() { wait_us(30); if(limit_sw1==0) limit_count1++; else limit_count1--; if(limit_count1>50) limit_count1=50; if(limit_count1<-50) limit_count1=-50; if(limit_count1>15) limit_result1=0; if(limit_count1<-15) limit_count1=1; } void limit_2() { wait_us(30); if(limit_sw2==0) limit_count2++; else limit_count2--; if(limit_count2>50) limit_count2=50; if(limit_count2<-50) limit_count2=-50; if(limit_count2>15) limit_result2=0; if(limit_count2<-15) limit_count2=1; } void limit_3() { wait_us(30); if(limit_sw3==0) limit_count3++; else limit_count3--; if(limit_count3>50) limit_count3=50; if(limit_count3<-50) limit_count3=-50; if(limit_count3>15) limit_result3=0; if(limit_count3<-15) limit_count3=1; } void limit_4() { wait_us(30); if(limit_sw4==0) limit_count4++; else limit_count4--; if(limit_count4>50) limit_count4=50; if(limit_count4<-50) limit_count4=-50; if(limit_count4>15) limit_result4=0; if(limit_count4<-15) limit_count4=1; } void limit_5() { wait_us(30); if(limit_sw5==0) limit_count5++; else limit_count5--; if(limit_count5>50) limit_count5=50; if(limit_count5<-50) limit_count5=-50; if(limit_count5>15) limit_result5=0; if(limit_count5<-15) limit_count5=1; } void limit_6() { wait_us(30); if(limit_sw6==0) limit_count6++; else limit_count6--; if(limit_count6>50) limit_count6=50; if(limit_count6<-50) limit_count6=-50; if(limit_count6>15) limit_result6=0; if(limit_count6<-15) limit_count6=1; } bool limit_check() { limit_1(); limit_2(); limit_3(); limit_4(); limit_5(); limit_6(); int sw1 = limit_result1; int sw2 = limit_result2; int sw3 = limit_result3; int sw4 = limit_result4; int sw5 = limit_result5; int sw6 = limit_result6; encoder_read_raw(); if(limit_find[0]==false) { if(limit_taget_speed[0]<axis123_taget_speed) limit_taget_speed[0]+=0.3; motor_power(0,limit_output[0]); }else { if(limit_taget_speed[0]>0) limit_taget_speed[0]-=1; if(limit_taget_speed[0]<0) { limit_taget_speed[0]=0; } motor_power(0,limit_output[0]); } if(limit_find[1]==false) { if(limit_taget_speed[1]<axis123_taget_speed) limit_taget_speed[1]+=0.3; motor_power(1,limit_output[1]); }else { if(limit_taget_speed[1]>0) limit_taget_speed[1]-=1; if(limit_taget_speed[1]<0) { limit_taget_speed[1]=0; } motor_power(1,limit_output[1]); } if(limit_find[2]==false) { if(limit_taget_speed[2]<axis123_taget_speed) limit_taget_speed[2]+=0.3; motor_power(2,limit_output[2]); }else { if(limit_taget_speed[2]>0) limit_taget_speed[2]-=1; if(limit_taget_speed[2]<0) { limit_taget_speed[2]=0; } motor_power(2,limit_output[2]); } if(limit_find[3]==false) { if(limit_taget_speed[3]>axis4_taget_speed) limit_taget_speed[3]-=0.3; motor_power(3,limit_output[3]); }else { if(limit_taget_speed[3]<0) limit_taget_speed[3]+=1; if(limit_taget_speed[3]>0) { limit_taget_speed[3]=0; } motor_power(3,limit_output[3]); } if(ccnt<450) { ccnt++; limit_taget_speed[0]=0; limit_taget_speed[1]=0; limit_taget_speed[2]=0; limit_taget_speed[3]=0; limit_taget_speed[4]-=0.4; limit_taget_speed[5]-=0.4; } if(limit_find[4]==false) { if(limit_taget_speed[4]<axis56_taget_speed) limit_taget_speed[4]+=0.3; motor_power(4,-limit_output[4]); }else { if(limit_taget_speed[4]>0) limit_taget_speed[4]-=1; if(limit_taget_speed[4]<0) { limit_taget_speed[4]=0; } motor_power(4,-limit_output[4]); } if(limit_find[5]==false) { if(limit_taget_speed[5]<axis56_taget_speed) limit_taget_speed[5]+=0.3; motor_power(5,-limit_output[5]); }else { if(limit_taget_speed[5]>0) limit_taget_speed[5]-=1; if(limit_taget_speed[5]<0) { limit_taget_speed[5]=0; } motor_power(5,-limit_output[5]); } for(int i=0;i<3;i++) { diff_encoder_data[i]=encoder_data[i]-limit_ex_encoder_data[i]; limit_ex_encoder_data[i]=encoder_data[i]; limit_error[i]=(diff_encoder_data[i]-limit_taget_speed[i]); sum_error[i]+=limit_error[i]*0.2; limit_result[i]=limit_error[i]*2+sum_error[i]*1; if(limit_result[i]>limit_max_power) limit_result[i]=limit_max_power; if(limit_result[i]<-limit_max_power) limit_result[i]=-limit_max_power; limit_output[i]=motor_duty[i]+limit_result[i]; if(limit_debug_print) pc.printf("%8.0f(%4.0f)(%8d) ",diff_encoder_data[i],limit_output[i],encoder_data[i]); } for(int i=3;i<4;i++) { diff_encoder_data[i]=encoder_data[i]-limit_ex_encoder_data[i]; limit_ex_encoder_data[i]=encoder_data[i]; limit_error[i]=-(diff_encoder_data[i]-limit_taget_speed[i]); sum_error[i]+=limit_error[i]*0.2; limit_result[i]=limit_error[i]*2+sum_error[i]*1; if(limit_result[i]>limit_max_power) limit_result[i]=limit_max_power; if(limit_result[i]<-limit_max_power) limit_result[i]=-limit_max_power; limit_output[i]=motor_duty[i]+limit_result[i]; if(limit_debug_print) pc.printf("%8.0f(%4.0f)(%8d) ",diff_encoder_data[i],limit_output[i],encoder_data[i]); } for(int i=4;i<6;i++) { diff_encoder_data[i]=encoder_data[i]-limit_ex_encoder_data[i]; limit_ex_encoder_data[i]=encoder_data[i]; limit_error[i]=(diff_encoder_data[i]-limit_taget_speed[i]); sum_error[i]+=limit_error[i]*0.2; limit_result[i]=limit_error[i]*2+sum_error[i]*1; if(limit_result[i]>limit_max_power) limit_result[i]=limit_max_power; if(limit_result[i]<-limit_max_power) limit_result[i]=-limit_max_power; limit_output[i]=motor_duty[i]+limit_result[i]; if(limit_debug_print) pc.printf("%8.0f(%4.0f)(%8d) ",diff_encoder_data[i],limit_output[i],encoder_data[i]); } if(limit_debug_print) pc.printf("\n\r"); if(sw1==0 && !limit_find[0]) { limit_find[0]=true; encoder1.LS7366_reset_counter(); limit_ex_encoder_data[0]=0; } if(sw2==0 && !limit_find[1]) { limit_find[1]=true; encoder2.LS7366_reset_counter(); limit_ex_encoder_data[1]=0; } if(sw3==0 && !limit_find[2]) { limit_find[2]=true; encoder3.LS7366_reset_counter(); limit_ex_encoder_data[2]=0; } if(sw4==0 && !limit_find[3]) { limit_find[3]=true; encoder4.LS7366_reset_counter(); limit_ex_encoder_data[3]=0; } if(sw5==0 && !limit_find[4]) { limit_find[4]=true; encoder5.LS7366_reset_counter(); limit_ex_encoder_data[4]=0; } if(sw6==0 && !limit_find[5]) { limit_find[5]=true; encoder6.LS7366_reset_counter(); limit_ex_encoder_data[5]=0; } return (limit_find[0] || !motor_onoff[0]) && (limit_find[1] || !motor_onoff[1]) && (limit_find[2] || !motor_onoff[2]) && (limit_find[3] || !motor_onoff[3]) && (limit_find[4] || !motor_onoff[4]) && (limit_find[5] || !motor_onoff[5]); } bool limit_check_done=false; int limit_check_done_cnt=0; void find_limit() { bool limit_sucess=false; wait_ms(0); encoder_reset_cnt(); for(int i=0;i<limit_time;i++) { if(limit_check()) { limit_sucess=true; break; } if(encoder_data[0]==-1 && encoder_data[1]==-1 && encoder_data[2]==-1 && encoder_data[3]==-1 && encoder_data[4]==1 && encoder_data[5]==1) { while(1) { motor_power(0,0); motor_power(1,0); motor_power(2,0); motor_power(3,0); motor_power(4,0); motor_power(5,0); pc.printf("encoder_data[0]==-1 && encoder_data[1]==-1 && encoder_data[2]==-1 && encoder_data[3]==-1 && encoder_data[4]==1 && encoder_data[5]==1\r\n"); //encoder_data[0] = encoder1.read(); //if(encoder_data[0]!=-1) //{ //NVIC_SystemReset(); //} wait_us(2500); } } wait_ms(1); } encoder_read_raw(); motor_power(0,0); motor_power(1,0); motor_power(2,0); motor_power(3,0); motor_power(4,0); motor_power(5,0); while(!limit_sucess) { pc.printf("Limit-faild\r\n"); } } #endif