void UserInit(void){
	//setPrintStream(&USBPutArray);
	setPrintLevelInfoPrint();
	println_I("\n\nStarting PIC initialization");
	//DelayMs(1000);
	hardwareInit();
	println_I("Hardware Init done");

	ReleaseAVRReset();



	CheckRev();

	LoadEEstore();

	LoadDefaultValues();

	CartesianControllerInit();

	InitPID();

	UpdateAVRLED();


	lockServos();
	setPrintLevelInfoPrint();

	BOOL brown = getEEBrownOutDetect();
	setCoProcBrownOutMode(brown);
	setBrownOutDetect(brown);


	println_I("###Starting PIC In Debug Mode###\n");// All printfDEBUG functions do not need to be removed from code if debug is disabled
	DelayMs(1000);
	//setPrintLevelErrorPrint();
	println_E("Error level printing");
	println_W("Warning level printing");
	println_I("Info level printing");
}
void UserInit(void) {
    //setPrintStream(&USBPutArray);
    clearPrint();
    setPrintLevelInfoPrint();
    println_I("Start PIC");
    //DelayMs(1000);
    hardwareInit();
    //println_I("Hardware Init done");

    InitializeDyIODataTableManager();

    CheckRev();

    LoadEEstore();


    

    UpdateAVRLED();


    lockServos();
    setPrintLevelInfoPrint();

    boolean brown = getEEBrownOutDetect() ? true:false;
    setBrownOutDetect(brown);

    //Data table needs to be synced before the PID can init properly
    SyncDataTable();
    InitPID();

    
    //println_I("###Starting PIC In Debug Mode###\n"); // All printfDEBUG functions do not need to be removed from code if debug is disabled
    //DelayMs(1000);
    setPrintLevelWarningPrint();
    //println_E("Error level printing");
    //println_W("Warning level printing");
    //println_I("Info level printing");
}
Example #3
0
/****************************************************
* This function manages the control mode state and
* transitions, including necessary PID init, resets..
****************************************************/
void control_mode_manager(void)
{ 
    switch(control_mode.state)
    {
//////////////////////////////////////////////////////////////////////
//  OFF MODE
        case OFF_MODE :     TRAJMotor1_f.enable = 0;
                            TRAJMotor2_f.enable = 0;
                            TRAJMotor3_f.enable = 0;
                            TRAJMotor1_f.active = 0;
                            TRAJMotor2_f.active = 0;
                            TRAJMotor3_f.active = 0;
                            TRAJMotor1_f.exec = 0;
                            TRAJMotor2_f.exec = 0;
                            TRAJMotor3_f.exec = 0;
                            TRAJMotor1_f.busy = 0;
                            TRAJMotor2_f.busy = 0;
                            TRAJMotor3_f.busy = 0;
                            rcurrent1 = 0;
                            rcurrent2 = 0;
                            rcurrent3 = 0;
                            rcurrent1_req = 0;
                            rcurrent2_req = 0;
                            rcurrent3_req = 0;
                            
                            control_flags.current_loop_active = 0;
                            control_flags.pos_loop_active = 0;

							home_f.state = 0;
						//	home_f.done = 0;
                            
                            P1DC1 = FULL_DUTY;
                            P1DC2 = FULL_DUTY;
                            P2DC1 = FULL_DUTY;

						//	x_cart = 0.0;
						//	y_cart = 0.0;
						//	z_cart = 0.0;
                            
                         // STATE TRANSITIONS
                            if(control_mode.ax_pos_mode_req)
                            {   
                                control_mode.state = AX_POS_MODE;
                            }
                            // STATE TRANSITIONS
                            else if(control_mode.torque_mode_req)
                                {
                                    control_mode.state = TORQUE_MODE;    
                                }
                            else if(control_mode.cart_mode_req)
                                {
                                    control_mode.state = CART_MODE;
                                }
                            else if(control_mode.track_mode_req)
                                {
                                    control_mode.state = TRACK_MODE;
                                   
                                    InitNLFilter2Fx(&Joint1NLFOut, &Joint1NLFStatus);
                                    InitNLFilter2Fx(&Joint2NLFOut, &Joint2NLFStatus);
                                    InitNLFilter2Fx(&Joint3NLFOut, &Joint3NLFStatus);
                        
                                    Joint1NLFStatus.qdRcommand = mposition1;
                                    Joint1NLFStatus.qdRprev = mposition1;
                                    Joint1NLFStatus.qdXint = mposition1;
                                    Joint1NLFStatus.MODE = 1;
                        
                                    Joint2NLFStatus.qdRcommand = mposition2;
                                    Joint2NLFStatus.qdRprev = mposition2;
                                    Joint2NLFStatus.qdXint = mposition2;
                                    Joint2NLFStatus.MODE = 1;

                                    Joint3NLFStatus.qdRcommand = mposition3;
                                    Joint3NLFStatus.qdRprev = mposition3;
                                    Joint3NLFStatus.qdXint = mposition3;
                                    Joint3NLFStatus.MODE = 1;
                                }
                            // IF there is ANY transition, RESETS PIDs
                            if(control_mode.trxs)
                            {
                                // RESET MOTOR FAULT FLAGS (first byte)
                                status_flags.dword = status_flags.dword & 0xFFFFFF00;
                                
                                //RESETS PIDs
                                InitPID(&PIDCurrent1, &PIDCurrent1_f,-1);
                                InitPID(&PIDCurrent2, &PIDCurrent2_f,-1);
                                InitPID(&PIDCurrent3, &PIDCurrent3_f,-1);
                                InitPID(&PIDPos1, &PIDPos1_f,0);
                                InitPID(&PIDPos2, &PIDPos2_f,0);
                                InitPID(&PIDPos3, &PIDPos3_f,0);
                                
                                control_mode.trxs = 0;
                            }
                            
                            break;
/////////////////////////////////////////////////////////////////////
//  TORQUE MODE 1
        case TORQUE_MODE : control_flags.current_loop_active = 1;

                        // STATE TRANSITIONS
                            if(control_mode.off_mode_req)
                            {
                                control_mode.state = OFF_MODE;
                                control_mode.trxs = 0;
                            }
                            break;
/////////////////////////////////////////////////////////////////////
//  AXIS POSITION MODE
        case AX_POS_MODE : control_flags.current_loop_active = 1;
                           control_flags.pos_loop_active = 1;
						//abilito i 3 motori
                           TRAJMotor1_f.enable = 1;
                           TRAJMotor2_f.enable = 1;
                           TRAJMotor3_f.enable = 1;
                           
                        // STATE TRANSITIONS
                           if(control_mode.off_mode_req)
                            {
                                control_mode.state = OFF_MODE;
                                control_mode.trxs = 0;
                            }
                                
                            break;
/////////////////////////////////////////////////////////////////////
//  CART MODE
        case CART_MODE : control_flags.current_loop_active = 1;
                         control_flags.pos_loop_active = 1;

                         TRAJMotor1_f.enable = 1;
                         TRAJMotor2_f.enable = 1;
                         TRAJMotor3_f.enable = 1;

                         // STATE TRANSITIONS
                         if(control_mode.off_mode_req)
                         {
                            control_mode.state = OFF_MODE;
                            control_mode.trxs = 0;
                         }
                         break;
/////////////////////////////////////////////////////////////////////
//  TRACK MODE
        case TRACK_MODE : control_flags.current_loop_active = 1;
                         control_flags.track_loop_active = 1;

                         // STATE TRANSITIONS
                         if(control_mode.off_mode_req)
                         {
                            control_mode.state = OFF_MODE;
                            control_mode.trxs = 0;
                         }
                         break;
/////////////////////////////////////////////////////////////////////
//  ERROR!!!!
        default    :    break;
    }//end SWITCH   
    
}// END control mode manager
Example #4
0
/*******************************************************
* Update parameters function, called at init and when
* a parameter is modified through SACT protocol
********************************************************/
void update_params(void)
{
uint32_t templong;//intero lungo temporaneo
uint8_t tempshift;//scalamento temporaneo

///////////////////////////////////////////////////////////////////
// VARIABLES FOR RUN-TIME USE OF PARAMETERS 
    max_current = parameters_RAM[0];//la corrente massima è in memoria RAM
    //encoder_counts_rev = (int32_t)parameters_RAM[19] << 2; // TAKE INTO ACCOUNT x4 QEI MODE
    //direction_flags.word = parameters_RAM[21];//anche la direzione è in memoria RAM

//ROBOT DIMENSION [in meters] 
lf = parameters_RAM[13]/1000.0; //control arm lenght 
le = parameters_RAM[14]/1000.0; //forearm lenght
e = parameters_RAM[15]/1000.0; //effector apothema
f = parameters_RAM[16]/1000.0; //base apothema

//ROBOT LIMITS [in degrees]
sphJLim = parameters_RAM[17]; //spheric joint limit
posJLim = parameters_RAM[18]; //positive joint limit
negJLim = parameters_RAM[19]; //negative joint limit

//encoder parameters
encoder_ticks = (int32_t) parameters_RAM[25] * parameters_RAM[26] * 4;//10200

kvel = (int32_t) ((float) 1/parameters_RAM[25] * FCY * 60); //4422000

decdeg_to_ticks = encoder_ticks / 3600.0;

decdeg_to_ticks_int = (uint16_t)((3600L << 10)/encoder_counts_rev); // in 5.10 fixed point
///////////////////////////////////////////////////////////////////
// CONTROL LOOPS and TRAJ PLANNERS INIT
////INIT PID CURRENT 1
    PIDCurrent1.qKp = parameters_RAM[5];
    PIDCurrent1.qKi = parameters_RAM[6];
    PIDCurrent1.qKd = parameters_RAM[7];
    PIDCurrent1.qN  = parameters_RAM[8]; // SHIFT FINAL RESULT >> qN
    PIDCurrent1.qdOutMax =  (int32_t)(FULL_DUTY << (PIDCurrent1.qN-1));
    PIDCurrent1.qdOutMin = -(int32_t)(FULL_DUTY << (PIDCurrent1.qN-1));

    InitPID(&PIDCurrent1, &PIDCurrent1_f,-1);
     
////INIT PID CURRENT 2
    PIDCurrent2.qKp = parameters_RAM[5];
    PIDCurrent2.qKi = parameters_RAM[6];
    PIDCurrent2.qKd = parameters_RAM[7];
    PIDCurrent2.qN  = parameters_RAM[8]; // SHIFT FINAL RESULT >> qN
    PIDCurrent2.qdOutMax =  (int32_t)(FULL_DUTY << (PIDCurrent2.qN-1));
    PIDCurrent2.qdOutMin = -(int32_t)(FULL_DUTY << (PIDCurrent2.qN-1));

    InitPID(&PIDCurrent2, &PIDCurrent2_f,-1);        

////INIT PID CURRENT 3
    PIDCurrent3.qKp = parameters_RAM[5];
    PIDCurrent3.qKi = parameters_RAM[6];
    PIDCurrent3.qKd = parameters_RAM[7];
    PIDCurrent3.qN  = parameters_RAM[8]; // SHIFT FINAL RESULT >> qN
    PIDCurrent3.qdOutMax =  (int32_t)(FULL_DUTY << (PIDCurrent3.qN-1));
    PIDCurrent3.qdOutMin = -(int32_t)(FULL_DUTY << (PIDCurrent3.qN-1));

    InitPID(&PIDCurrent3, &PIDCurrent3_f,-1);        
    
////INIT PID POS 1
    PIDPos1.qKp = parameters_RAM[9];
    PIDPos1.qKi = parameters_RAM[10];              
    PIDPos1.qKd = parameters_RAM[11];
    PIDPos1.qN  = parameters_RAM[12];  // SHIFT FINAL RESULT >> qN
    PIDPos1.qdOutMax = ((int32_t)max_current << PIDPos1.qN);
    PIDPos1.qdOutMin = -PIDPos1.qdOutMax;

    InitPID(&PIDPos1, &PIDPos1_f,0);
   
////INIT PID POS 2
    PIDPos2.qKp = parameters_RAM[9];
    PIDPos2.qKi = parameters_RAM[10];              
    PIDPos2.qKd = parameters_RAM[11];
    PIDPos2.qN  = parameters_RAM[12];  // SHIFT FINAL RESULT >> qN
    PIDPos2.qdOutMax = ((int32_t)max_current << PIDPos2.qN);
    PIDPos2.qdOutMin = -PIDPos2.qdOutMax;

    InitPID(&PIDPos2, &PIDPos2_f,0);
   
////INIT PID POS 3
    PIDPos3.qKp = parameters_RAM[9];
    PIDPos3.qKi = parameters_RAM[10];              
    PIDPos3.qKd = parameters_RAM[11];
    PIDPos3.qN  = parameters_RAM[12];  // SHIFT FINAL RESULT >> qN
    PIDPos3.qdOutMax = ((int32_t)max_current << PIDPos3.qN);
    PIDPos3.qdOutMin = -PIDPos3.qdOutMax;

    InitPID(&PIDPos3, &PIDPos3_f,0);

////INIT TRAJ PLANNER 1
    TRAJMotor1_f.enable = 0;
    TRAJMotor1.qVLIM = parameters_RAM[1];
    TRAJMotor1.qACC = parameters_RAM[2];
    TRAJMotor1.qVELshift = parameters_RAM[3];
    TRAJMotor1.qACCshift = parameters_RAM[4];
	TRAJMotor1.qdPosition = parameters_RAM[25];
        
////INIT TRAJ PLANNER 2
    TRAJMotor2_f.enable = 0;
    TRAJMotor2.qVLIM = parameters_RAM[1];
    TRAJMotor2.qACC = parameters_RAM[2];
    TRAJMotor2.qVELshift = parameters_RAM[3];
    TRAJMotor2.qACCshift = parameters_RAM[4];
	TRAJMotor2.qdPosition = parameters_RAM[25]; 

////INIT TRAJ PLANNER 3
    TRAJMotor3_f.enable = 0;
    TRAJMotor3.qVLIM = parameters_RAM[1];
    TRAJMotor3.qACC = parameters_RAM[2];
    TRAJMotor3.qVELshift = parameters_RAM[3];
    TRAJMotor3.qACCshift = parameters_RAM[4];
	TRAJMotor3.qdPosition = parameters_RAM[25];

////INIT Limits for nonlinear filter
    // vel max = (VLIM for PosTRAJ >> VEL SCALE Shift) * POS_LOOP_FREQ
    templong = parameters_RAM[1] >> parameters_RAM[3];
    NLF_vel_max = templong << POS_LOOP_FcSHIFT;
    // acc max = ((ACC for PosTRAJ >> ACC SCALE Shift) * POS_LOOP_FREQ^2 ) >> VEL SCALE Shift
    templong = parameters_RAM[2] >> parameters_RAM[4]; 
    templong = templong << (POS_LOOP_FcSHIFT<<1) ;
    templong = templong >> parameters_RAM[3];
    // search best 2^N scaling approximation for (acc max)^-1
    tempshift = 0;
    while((1UL<<tempshift) <= templong)
        tempshift++;
    NLF_acc_max_shift = tempshift-2;
   
//INIT HOMING!!!!!!!!!!!!!!!!!!!!!!!!!
home_f.done = 0;
home.Velocity = parameters_RAM[1] / parameters_RAM[20];
home.position1 = -(int32_t)parameters_RAM[22];
home.position2 = -(int32_t)parameters_RAM[23];
home.position3 = -(int32_t)parameters_RAM[24];
home.offsetPosition = parameters_RAM[21]; 
//-------------------------------------
}