test

Dependencies:   mbed BufferedSerial LS7366LIB2 FastPWM

limit.h

Committer:
lsh2205
Date:
2020-04-23
Revision:
0:e12eb40b9fef

File content as of revision 0:e12eb40b9fef:

#ifndef _LIMIT_H_
#define _LIMIT_H_

#define limit_debug_print false
#define start_duty 200

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;
bool limit_check()
{        

    int sw1 = limit_sw1;
    int sw2 = limit_sw2;
    int sw3 = limit_sw3;
    int sw4 = limit_sw4;
    int sw5 = limit_sw5;
    int sw6 = limit_sw6;
    
    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]>200)
            limit_result[i]=200;
        if(limit_result[i]<-200)
            limit_result[i]=-200;
        
        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]>200)
            limit_result[i]=200;
        if(limit_result[i]<-200)
            limit_result[i]=-200;
        
        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]>200)
            limit_result[i]=200;
        if(limit_result[i]<-200)
            limit_result[i]=-200;
        
        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()
{
    wait_ms(0);
    
    encoder_reset_cnt();
    
    for(int i=0;i<limit_time;i++)
    {
        if(limit_check())
        {
            break;
        }
        reset_check();
        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);
}

#endif