diff --git a/MDK-ARM/AUTO_CHASSIS.uvoptx b/MDK-ARM/AUTO_CHASSIS.uvoptx index 8492b49..80d1c51 100644 --- a/MDK-ARM/AUTO_CHASSIS.uvoptx +++ b/MDK-ARM/AUTO_CHASSIS.uvoptx @@ -103,7 +103,7 @@ 1 0 0 - 3 + 6 @@ -114,7 +114,7 @@ - BIN\CMSIS_AGDI.dll + STLink\ST-LINKIII-KEIL_SWO.dll @@ -140,12 +140,12 @@ 0 CMSIS_AGDI - -X"Horco CMSIS-DAP" -U4626385832 -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC168000000 -TT168000000 -TP20 -TDS8010 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGHx$CMSIS\Flash\STM32F4xx_1024.FLM) + -X"Horco CMSIS-DAP" -U8626380832 -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC168000000 -TT168000000 -TP20 -TDS8010 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGHx$CMSIS\Flash\STM32F4xx_1024.FLM) 0 DLGUARM - + (105=-1,-1,-1,-1,0) 0 @@ -180,6 +180,11 @@ 1 motor_send_data,0x0A + + 5 + 1 + GO_calibration,0x0A + @@ -194,7 +199,7 @@ 0 1 - 1 + 0 0 0 0 diff --git a/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf b/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf new file mode 100644 index 0000000..32d3906 Binary files /dev/null and b/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf differ diff --git a/User/Module/config.c b/User/Module/config.c index 018fbc1..2372880 100644 --- a/User/Module/config.c +++ b/User/Module/config.c @@ -22,48 +22,33 @@ static const ConfigParam_t param_chassis ={ /*上层pid参数*/ -.M2006_angle_param = { +.Shoot_M2006_angle_param = { .p = 25.0f, .i = 0.0f, .d = 1.5f, .i_limit = 1000.0f, .out_limit = 3000.0f, }, -.M2006_speed_param = { +.Shoot_M2006_speed_param = { .p = 5.0f, .i = 0.3f, .d = 0.0f, .i_limit = 2000.0f, .out_limit = 3000.0f, }, -.M3508_angle_param = { - .p = 10.0f, - .i = 0.5f, - .d = 0.0f, +.Pitch_M2006_angle_param = { + .p = 25.0f, + .i = 0.0f, + .d = 1.5f, .i_limit = 1000.0f, .out_limit = 3000.0f, }, -.M3508_speed_param={ - .p = 6.0f, - .i = 0.0f, - .d = 3.2f, - .i_limit = 200.0f, - .out_limit =6000.0f, -}, - -.UP_GM6020_angle_param={ - .p = 30.0f, - .i = 20.0f, - .d =0.0f, - .i_limit = 200.0f, - .out_limit = 1500.0f, -} , -.UP_GM6020_speed_param={ - .p =3.0f, - .i =0.5f, - .d =0.0f, - .i_limit = 200.0f, - .out_limit = 3000.0f +.Pitch_M2006_speed_param={ + .p = 5.0f, + .i = 0.3f, + .d = 0.0f, + .i_limit = 2000.0f, + .out_limit = 3000.0f, }, diff --git a/User/Module/up.c b/User/Module/up.c index 2a137a6..5d1e45d 100644 --- a/User/Module/up.c +++ b/User/Module/up.c @@ -24,14 +24,12 @@ int8_t up_init(UP_t *u,const UP_Param_t *param,float target_freq) PID_init (&u->pid.VESC_5065_M1 ,PID_POSITION ,&(u->param ->VESC_5065_M1_param )); PID_init (&u->pid.VESC_5065_M2 ,PID_POSITION ,&(u->param ->VESC_5065_M2_param )); - PID_init (&u->pid .M2006_angle ,PID_POSITION ,&(u->param->M2006_angle_param )); - PID_init (&u->pid .M2006_speed ,PID_POSITION ,&(u->param->M2006_speed_param )); + PID_init (&u->pid .Shoot_M2006angle ,PID_POSITION ,&(u->param->Shoot_M2006_angle_param )); + PID_init (&u->pid .Shoot_M2006speed ,PID_POSITION ,&(u->param->Shoot_M2006_speed_param )); - PID_init (&u->pid .M3508_angle ,PID_POSITION ,&(u->param->M3508_angle_param )); - PID_init (&u->pid .M3508_speed ,PID_POSITION ,&(u->param->M3508_speed_param )); + PID_init (&u->pid .Pitch_M2006_angle ,PID_POSITION ,&(u->param->Pitch_M2006_angle_param )); + PID_init (&u->pid .Pitch_M2006_speed ,PID_POSITION ,&(u->param->Pitch_M2006_speed_param )); - PID_init (&u->pid .GM6020_speed,PID_POSITION ,&(u->param ->UP_GM6020_speed_param )); - PID_init (&u->pid .GM6020_angle,PID_POSITION ,&(u->param ->UP_GM6020_angle_param )); u->go_cmd =u->param ->go_cmd ; @@ -56,20 +54,16 @@ int8_t up_init(UP_t *u,const UP_Param_t *param,float target_freq) /*can,上层状态更新*/ int8_t UP_UpdateFeedback(UP_t *u, const CAN_t *can, CMD_t *c) { - u->motorfeedback .go_data = get_GO_measure_point() ; - u->motorfeedback .M2006 .motor =M2006; - u->motorfeedback .M3508 .motor =M3508; u->motorfeedback .VESC_5065_M1_rpm =can ->motor .chassis5065 .as_array [0].rotor_speed ; u->motorfeedback .VESC_5065_M2_rpm =can ->motor .chassis5065 .as_array [1].rotor_speed ; - u->motorfeedback .rotor_pit6020ecd =can ->motor .chassis6020.as_array [2].rotor_ecd ; - u->motorfeedback .rotor_pit6020rpm =can ->motor .chassis6020.as_array [2].rotor_speed ; for(int i=0;i<4;i++){ - u->motorfeedback .M3508_rpm[i] =can ->motor .motor3508 .as_array [i].rotor_speed ; - u->motorfeedback .M3508_angle [i]=can ->motor .motor3508 .as_array [i].rotor_ecd ; + u->motorfeedback .DJmotor_feedback[i].rpm =can ->motor .motor3508 .as_array [i].rotor_speed ; + u->motorfeedback .DJmotor_feedback[i].ecd =can ->motor .motor3508 .as_array [i].rotor_ecd ; + DJ_processdata(&u->motorfeedback .DJmotor_feedback [i], MOTOR2006_ECD_TO_ANGLE); } u->cmd =c; @@ -77,90 +71,42 @@ int8_t UP_UpdateFeedback(UP_t *u, const CAN_t *can, CMD_t *c) { return 0; } - - -/*上层大疆电机角度控制,使用can1的id1和2*/ -int8_t UP_angle_control(UP_t *u, fp32 target_angle,MotorType_t motor) { - // 获取当前编码器角度 - int8_t cnt=0; - fp32 angle ,delta; - - switch(motor) - { - case M2006 : - angle = u->motorfeedback.M3508_angle[0]; - if (u->motorfeedback .M2006 .init_cnt < 50) { - u->motorfeedback .M2006.orig_angle = angle; // 记录初始编码器值 - u->motorfeedback .M2006.last_angle = angle; - - u->motorfeedback .M2006.init_cnt++; // 初始化计数器递增 - return 0; +int8_t DJ_processdata(DJmotor_feedback_t *f,fp32 ecd_to_angle) +{ + int8_t cnt=0; + fp32 angle ,delta; + + angle = f->ecd; + if (f->init_cnt < 50) { + f->orig_angle= angle; + f->last_angle = angle; + f->init_cnt++; + return 0; } - delta = angle - u->motorfeedback .M2006.last_angle; - delta = angle - u->motorfeedback .M2006.last_angle; + + delta = angle - f->last_angle; if (delta > 4096) { - u->motorfeedback .M2006.round_cnt--; // 逆时针跨圈 + f->round_cnt--; } else if (delta < -4096) { - u->motorfeedback .M2006.round_cnt++; // 顺时针跨圈 + f->round_cnt++; } - u->motorfeedback.M2006.last_angle = angle; - // 计算总角度 - float total_angle = (u->motorfeedback.M2006 .round_cnt * 8191 + (angle - u->motorfeedback.M2006.orig_angle)) * MOTOR2006_ECD_TO_ANGLE; - u->motorfeedback.M2006.total_angle =total_angle; - - float delta_angle = PID_calc(&u->pid.M2006_angle, total_angle, target_angle); - float delta_speed = PID_calc(&u->pid.M2006_speed, u->motorfeedback.M3508_rpm [0], delta_angle); - u->motor_target.M2006_angle = target_angle; - u->final_out .final_3508out [0] =delta_speed; - - break ; - - case M3508 : - - angle = u->motorfeedback.M3508_angle[1]; - if (u->motorfeedback .M3508 .init_cnt < 50) { - u->motorfeedback .M3508.orig_angle = angle; // 记录初始编码器值 - u->motorfeedback .M3508.last_angle = angle; - - u->motorfeedback .M3508.init_cnt++; // 初始化计数器递增 - return 0; - } - - delta = angle - u->motorfeedback .M3508.last_angle; - delta = angle - u->motorfeedback .M3508.last_angle; - if (delta > 4096) { - u->motorfeedback .M3508.round_cnt--; // 逆时针跨圈 - } else if (delta < -4096) { - u->motorfeedback .M3508.round_cnt++; // 顺时针跨圈 - } - u->motorfeedback.M3508.last_angle = angle; - // 计算总角度 - total_angle = (u->motorfeedback.M3508 .round_cnt * 8191 + (angle - u->motorfeedback.M3508.orig_angle)) * MOTOR2006_ECD_TO_ANGLE; - u->motorfeedback.M3508.total_angle =total_angle; - - delta_angle = PID_calc(&u->pid.M3508_angle , total_angle, target_angle); - delta_speed = PID_calc(&u->pid.M3508_speed , u->motorfeedback.M3508_rpm [1], delta_angle); - - u->motor_target.M3508_angle = target_angle; - u->final_out .final_3508out[1] =delta_speed; - - break ; - - } - return 0; + f->last_angle = angle; + f->total_angle=(f->round_cnt*8191+(angle -f->orig_angle ))*ecd_to_angle; + +} +/* + 这里id范围为1-4, +*/ +int8_t DJ_Angle_Control(UP_t *u,int id,DJmotor_feedback_t *f,pid_type_def *Angle_pid,pid_type_def *Speed_pid,fp32 target_angle) +{ + fp32 delta_angle,delta_speed; + delta_angle = PID_calc(Angle_pid , f->total_angle , target_angle); + delta_speed = PID_calc(Speed_pid , f->rpm , delta_angle); + + u->final_out .DJfinal_out [id-1]=delta_speed; + return 0; } - -//int8_t UP_M3508_speed(UP_t *u,fp32 speed) -//{ -// u->motor_target .M3508_speed [] =speed; -// for(int i=0;i<3;i++){ -// u->final_out .final_3508out [i] = -// PID_calc (&(u->pid .M3508_speed[i] ),u->motorfeedback .M3508_speed [i],speed ); -// } -// -//} - int8_t VESC_M5065_Control(UP_t *u,fp32 speed) { @@ -175,73 +121,75 @@ int8_t VESC_M5065_Control(UP_t *u,fp32 speed) } -int8_t GM6020_control(UP_t *u,fp32 angle) -{ - fp32 delat_speed; -// Clip(&angle,90,270); - delat_speed = - PID_calc (&(u->pid .GM6020_angle ),u->motorfeedback .rotor_pit6020ecd ,(angle /360*8191)); - u->final_out .final_pitchout = - PID_calc (&(u->pid .GM6020_speed ),u->motorfeedback.rotor_pit6020rpm ,delat_speed); - u->motor_target .rotor_pit6020angle =angle ; - return 0; - -} /*go电机控制*/ -int8_t GO_SendData(UP_t *u,float pos,float limit) +int8_t GO_SendData(UP_t *u, float pos, float limit) { - u->go_cmd .Pos =pos; - // 读取参数 - float tff = u->go_cmd.T ; // 前馈力矩 - float kp = u->go_cmd .K_P; // 刚度 - float kd = u->go_cmd.K_W; // 阻尼(原代码中kdd/kid混淆,需统一为K_W) - float q_desired = u->go_cmd.Pos; // 期望位置(rad) - float q_current = u->motorfeedback.go_data ->Pos ; // 当前位置(rad) - float dq_desired = u->go_cmd.W; // 期望速度(rad/s) - float dq_current = u->motorfeedback.go_data ->W ; // 当前速度(rad/s) + static int is_calibration=0; + static fp32 error=0; //误差量 + GO_MotorData_t *GO_calibration;//校准前,原始数据 + GO_calibration = get_GO_measure_point() ; + if(is_calibration==0) + { + is_calibration=HAL_GPIO_ReadPin (GPIOE ,GPIO_PIN_9 ); + u->go_cmd.Pos = -50; //上电之后跑 + error= GO_calibration->Pos ; + } + u->motorfeedback .go_data = GO_calibration; + u->motorfeedback .go_data ->Pos= error ; + u->go_cmd.Pos = pos; + + // 读取参数 + float tff = u->go_cmd.T; // 前馈力矩 + float kp = u->go_cmd.K_P; // 位置刚度 + float kd = u->go_cmd.K_W; // 速度阻尼 + float q_desired = u->go_cmd.Pos; // 期望位置(rad) + float q_current = u->motorfeedback.go_data->Pos; // 当前角度位置(rad) + float dq_desired = u->go_cmd.W; // 期望角速度(rad/s) + float dq_current = u->motorfeedback.go_data->W; // 当前角速度(rad/s) + + // 计算输出力矩 tau float tau = tff + kp * (q_desired - q_current) + kd * (dq_desired - dq_current); - - - if (tau > limit) { - - tff = limit - kp * (q_desired - q_current) - kd * (dq_desired - dq_current) - (tau - limit) / 2.0; - tau = limit; - } else if (tau < -limit) { + /*限制最大输入来限制最大输出*/ + if (pos - q_current > limit) { + u->go_cmd.Pos = q_current + limit; // 限制位置 + }else if (pos - q_current < -limit) { + u->go_cmd.Pos = q_current - limit; // 限制位置 + }else { + u->go_cmd.Pos = pos; // 允许位置 + } - tff = limit - kp * (q_desired - q_current) - kd * (dq_desired - dq_current) + (tau - limit) / 2.0; - tau = -limit; - } - u->go_cmd .T =tff; - GO_M8010_send_data(&u->go_cmd ); - u->go_cmd .T =0; + // 发送数据 + GO_M8010_send_data(&u->go_cmd); - return 0; + + return 0; } int8_t ALL_Motor_Control(UP_t *u,CAN_Output_t *out) { //电机控制 ,传进can - - UP_angle_control(u,u->motor_target .M2006_angle ,M2006); - UP_angle_control(u,u->motor_target .M3508_angle ,M3508 ); - - - - GO_SendData(u,u->motor_target .go_shoot,0.08 ); + DJ_Angle_Control(u,1,&u->motorfeedback .DJmotor_feedback[0] , + &u->pid .Shoot_M2006angle , + &u->pid .Shoot_M2006speed , + u->motor_target .Shoot_M2006_angle ); + DJ_Angle_Control(u,2,&u->motorfeedback .DJmotor_feedback[1] , + &u->pid .Pitch_M2006_angle , + &u->pid .Pitch_M2006_speed , + u->motor_target .Pitch_M2006_angle ); + GO_SendData(u,u->motor_target .go_shoot,1 ); for(int i=0;i<4;i++){ - out ->motor3508 .as_array[i]=u->final_out.final_3508out [i] ; + out ->motor3508 .as_array[i]=u->final_out.DJfinal_out [i] ; } out ->chassis5065 .erpm [0]= u->final_out .final_VESC_5065_M1out ; out ->chassis5065 .erpm [1]= -u->final_out .final_VESC_5065_M2out ; - out ->chassis6020 .as_array [2]=u->final_out .final_pitchout ; return 0; @@ -270,8 +218,8 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c) u->motor_target .go_shoot =u->PitchContext .PitchConfig .go1_init_position ; is_pitch=0; } - u->motor_target .M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ; - u->PitchContext .PitchState = PITCH_PREPARE; //状态更新,开始夹球 +// u->motor_target .M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ; +// u->PitchContext .PitchState = PITCH_PREPARE; //状态更新,开始夹球 // /*运球*/ // u->motor_target .go_spin = u->DribbleContext.DribbleConfig .go2_init_angle ; @@ -291,7 +239,7 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c) u->PitchContext .PitchState=PITCH_START;//置标志位用于启动投篮 } - Pitch_Process(u,out,c); +// Pitch_Process(u,out,c); break ; @@ -303,13 +251,13 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c) u->DribbleContext .DribbleState =STATE_GRAB_BALL; } - Dribble_Process(u,out); +// Dribble_Process(u,out); }break ; case Dribbl_transfer: - Dribbl_transfer_a(u,out); +// Dribbl_transfer_a(u,out); } break; @@ -338,184 +286,184 @@ return 0; -int8_t Pitch_Process(UP_t *u, CAN_Output_t *out,CMD_t *c) -{ - static fp32 go1_position,M2006_Screw_position ; - static int is_initialize=1; - if(is_initialize) - { - go1_position=u->PitchContext .PitchConfig .go1_init_position ; - M2006_Screw_position=u->PitchContext .PitchConfig .m2006_Screw_init; - is_initialize=0; - } +//int8_t Pitch_Process(UP_t *u, CAN_Output_t *out,CMD_t *c) +//{ +// static fp32 go1_position,M2006_Screw_position ; +// static int is_initialize=1; +// if(is_initialize) +// { +// go1_position=u->PitchContext .PitchConfig .go1_init_position ; +// M2006_Screw_position=u->PitchContext .PitchConfig .m2006_Screw_init; +// is_initialize=0; +// } - switch(u->PitchContext .PitchState){ - - case PITCH_START: - u->motor_target .go_shoot = u->PitchContext .PitchConfig .go1_release_threshold; - -// if(u->motorfeedback .GO_motor_info[0]->Pos < -32.40){ //检测go位置到达最上面,这里的检测条件可以更改 -// u->motor_target .M2006_angle = u->PitchContext .PitchConfig .m2006_trigger_angle ;//设置2006角度,0 - - u->PitchContext .PitchState=PITCH_PULL_TRIGGER; -//}//更改标志位 - - break ; - case PITCH_PULL_TRIGGER: - - - if(u->motorfeedback .M2006 .total_angle >-1) //当2006的总角度小于1,可以认为已经勾上,误差为1 - { - u->motor_target .go_shoot = go1_position;//go下拉 - u->motor_target .M3508_angle = M2006_Screw_position;//丝杠上的2006 - go1_position = go1_position + c->Vx ; - M2006_Screw_position=M2006_Screw_position+ c->Vy; - - - } - - break ; - - - - - } - -return 0; - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -int8_t Dribble_Process(UP_t *u, CAN_Output_t *out) -{ - - switch (u->DribbleContext.DribbleState) { - case STATE_GRAB_BALL://开始 - - RELAY1_TOGGLE (0);//夹球 - - u->motor_target.M3508_angle =u->DribbleContext .DribbleConfig .m3508_high_angle;//3508升起 - u->motor_target.go_spin =u->DribbleContext .DribbleConfig .go2_flip_angle; - - - if((u->motorfeedback .M3508 .total_angle >400)) { - RELAY2_TOGGLE (1); - - -// if(((u->motorfeedback.GO_motor_info[1]->Pos ) <-1.1)&&(u->motorfeedback.M3508 .total_angle >1190)){ -// -// u->DribbleContext .DribbleState = STATE_RELEASE_BALL; //当go2到标准位置,标志位改变 -// } - - } - break; - - - case STATE_RELEASE_BALL: - RELAY1_TOGGLE (1);//松球 - - - - -// if((u->motorfeedback.GO_motor_info[1]->Pos ) <-1.3){ -// u->motor_target.go_spin =-40; //恢复go2位置 -// u->DribbleContext .DribbleState = STATE_CATCH_PREP; //当go2到标准位置,标志位改变 - -// } - - break; - - case STATE_CATCH_PREP: -// if((u->motorfeedback.GO_motor_info[1]->Pos )> -0.4){ -// u->motor_target.M3508_angle =0 ; //当go2到初始位置,3508降 +// switch(u->PitchContext .PitchState){ +// +// case PITCH_START: +// u->motor_target .go_shoot = u->PitchContext .PitchConfig .go1_release_threshold; // -// RELAY2_TOGGLE (0);//接球 -// } - if(u->motorfeedback .M3508 .total_angle <51.0f){ - RELAY1_TOGGLE (0);//夹球,0夹1开 +//// if(u->motorfeedback .GO_motor_info[0]->Pos < -32.40){ //检测go位置到达最上面,这里的检测条件可以更改 +//// u->motor_target .M2006_angle = u->PitchContext .PitchConfig .m2006_trigger_angle ;//设置2006角度,0 +// +// u->PitchContext .PitchState=PITCH_PULL_TRIGGER; +////}//更改标志位 - u->DribbleContext .DribbleState = STATE_TRANSFER; - } - - break; - - - - - break ; - - - - default: - break; - } - - return 0; -} - -void Dribbl_transfer_a(UP_t *u, CAN_Output_t *out) -{ - switch (u->DribbleContext.DribbleState) { - - - - case STATE_TRANSFER: - if((u->motorfeedback.M3508 .total_angle <52.0f )) //满足这个状态时认为go和3508到达初始位置,再夹上球 - { - - u->motor_target .go_spin =u->DribbleContext .DribbleConfig .go2_release_threshold ; - } - -// if(u->motorfeedback .GO_motor_info [1]->Pos < -4.9) +// break ; +// case PITCH_PULL_TRIGGER: +// +// +// if(u->motorfeedback .M2006 .total_angle >-1) //当2006的总角度小于1,可以认为已经勾上,误差为1 // { -// RELAY1_TOGGLE (1);//夹球,0夹1开 +// u->motor_target .go_shoot = go1_position;//go下拉 +// u->motor_target .M3508_angle = M2006_Screw_position;//丝杠上的2006 +// go1_position = go1_position + c->Vx ; +// M2006_Screw_position=M2006_Screw_position+ c->Vy; +// // -// if(u->motorfeedback .GO_motor_info [1]->Pos > -4.8) -// { -// u->DribbleContext .DribbleState = STATE_CATCH_DONE; //当go2到标准位置,标志位改变 -// } // } - - - break ; +// +// break ; - case STATE_CATCH_DONE: - - RELAY1_TOGGLE (1);//夹球,0夹1开 - RELAY2_TOGGLE (0);//夹球,0接1收 +// +// +// +// } +// +//return 0; +// +//} - u->motor_target.go_spin=u->DribbleContext .DribbleConfig.go2_init_angle ; - break; - break; - } -} + + + + + + + + + + + + + + + + + + + + + + + + + +//int8_t Dribble_Process(UP_t *u, CAN_Output_t *out) +//{ +// +// switch (u->DribbleContext.DribbleState) { +// case STATE_GRAB_BALL://开始 +// +// RELAY1_TOGGLE (0);//夹球 +// +// u->motor_target.M3508_angle =u->DribbleContext .DribbleConfig .m3508_high_angle;//3508升起 +// u->motor_target.go_spin =u->DribbleContext .DribbleConfig .go2_flip_angle; + +// +// if((u->motorfeedback .M3508 .total_angle >400)) { +// RELAY2_TOGGLE (1); +// + +//// if(((u->motorfeedback.GO_motor_info[1]->Pos ) <-1.1)&&(u->motorfeedback.M3508 .total_angle >1190)){ +//// +//// u->DribbleContext .DribbleState = STATE_RELEASE_BALL; //当go2到标准位置,标志位改变 +//// } +// +// } +// break; + + +// case STATE_RELEASE_BALL: +// RELAY1_TOGGLE (1);//松球 + +// +// +// +//// if((u->motorfeedback.GO_motor_info[1]->Pos ) <-1.3){ +//// u->motor_target.go_spin =-40; //恢复go2位置 +//// u->DribbleContext .DribbleState = STATE_CATCH_PREP; //当go2到标准位置,标志位改变 + +//// } + +// break; + +// case STATE_CATCH_PREP: +//// if((u->motorfeedback.GO_motor_info[1]->Pos )> -0.4){ +//// u->motor_target.M3508_angle =0 ; //当go2到初始位置,3508降 +//// +//// RELAY2_TOGGLE (0);//接球 +//// } +// if(u->motorfeedback .M3508 .total_angle <51.0f){ +// RELAY1_TOGGLE (0);//夹球,0夹1开 + +// u->DribbleContext .DribbleState = STATE_TRANSFER; +// } +// +// break; +// + +// +// +// break ; + + + +// default: +// break; +// } + +// return 0; +//} + +//void Dribbl_transfer_a(UP_t *u, CAN_Output_t *out) +//{ +// switch (u->DribbleContext.DribbleState) { +// +// +// +// case STATE_TRANSFER: +// if((u->motorfeedback.M3508 .total_angle <52.0f )) //满足这个状态时认为go和3508到达初始位置,再夹上球 +// { +// +// u->motor_target .go_spin =u->DribbleContext .DribbleConfig .go2_release_threshold ; +// } +// +//// if(u->motorfeedback .GO_motor_info [1]->Pos < -4.9) +//// { +//// RELAY1_TOGGLE (1);//夹球,0夹1开 +//// +//// if(u->motorfeedback .GO_motor_info [1]->Pos > -4.8) +//// { +//// u->DribbleContext .DribbleState = STATE_CATCH_DONE; //当go2到标准位置,标志位改变 +//// } +//// } +// +// +// break ; + +// case STATE_CATCH_DONE: +// +// RELAY1_TOGGLE (1);//夹球,0夹1开 +// RELAY2_TOGGLE (0);//夹球,0接1收 + +// u->motor_target.go_spin=u->DribbleContext .DribbleConfig.go2_init_angle ; + +// break; + +// break; + +// } +//} diff --git a/User/Module/up.h b/User/Module/up.h index 70be9d9..cc81c4f 100644 --- a/User/Module/up.h +++ b/User/Module/up.h @@ -91,7 +91,6 @@ typedef struct { fp32 go2_init_angle; // GO2初始角度 fp32 go2_flip_angle; // GO2翻转角度 fp32 flip_timing; // 翻转触发时机 -// fp32 fp32 go2_release_threshold; // 释放球 } DribbleConfig_t; @@ -112,47 +111,18 @@ typedef struct { AHRS_Eulr_t imu_eulr;//解算后存放欧拉角(弧度制) }UP_Imu_t; - -/** - *@input[in] rev 暂时不知道干啥用的,github为回答issue - *@input[in] T 力矩,单位N·m - *@input[in] Pos 目标位置,单位rad - *@input[in] W 目标速度,单位rad/s - *@input[in] K_P 位置环环kp - *@input[in] K_W 速度环kp - *@note 控制公式 : t = T + (设定位置 - 实际位置)*K_P + (设定速度 - 实际速度)*K_W - */ -typedef struct { - - int rev; //暂时不知何用 - float T; - float W; - float K_P; - float K_W; - -}GO_param_t; -/*角度环控制电机类型*/ -typedef enum { - M2006 = 1, - M3508 -} MotorType_t; - - - + typedef struct { pid_param_t VESC_5065_M1_param; pid_param_t VESC_5065_M2_param; - pid_param_t UP_GM6020_speed_param; - pid_param_t UP_GM6020_angle_param; + pid_param_t Shoot_M2006_speed_param; + pid_param_t Shoot_M2006_angle_param; - pid_param_t M2006_speed_param; - pid_param_t M2006_angle_param; - - pid_param_t M3508_speed_param; - pid_param_t M3508_angle_param; + pid_param_t Pitch_M2006_speed_param; + pid_param_t Pitch_M2006_angle_param; DribbleConfig_t DribbleConfig_Config; PitchConfig_t PitchConfig_Config; @@ -161,88 +131,69 @@ typedef struct }UP_Param_t; typedef struct -{ - MotorType_t motor; - - float orig_angle; - float last_angle; - int32_t round_cnt; - uint16_t init_cnt; - float total_angle; - -}motor_angle_data; +{ + fp32 ecd; + fp32 rpm; + + fp32 orig_angle; + fp32 last_angle; + int32_t round_cnt; + uint16_t init_cnt; + fp32 total_angle; +}DJmotor_feedback_t; typedef struct{ uint8_t up_task_run; const UP_Param_t *param; - - int state; - - - /*运球过程*/ DribbleContext_t DribbleContext; /*投篮过程*/ PitchContext_t PitchContext; - - UP_Imu_t pos088; CMD_t *cmd; struct{ - fp32 rotor_pit6020ecd; - fp32 rotor_pit6020rpm; fp32 VESC_5065_M1_rpm; fp32 VESC_5065_M2_rpm; - motor_angle_data M2006; - motor_angle_data M3508; - - const GO_MotorData_t *go_data;//存放go电机数据 + GO_MotorData_t *go_data;//存放go电机数据 - fp32 M3508_angle[4]; - fp32 M3508_rpm [4]; + DJmotor_feedback_t DJmotor_feedback[4]; - int flag; }motorfeedback; struct{ - - fp32 rotor_pit6020angle; fp32 VESC_5065_M1_rpm; fp32 VESC_5065_M2_rpm; - fp32 M2006_angle; - fp32 M3508_angle; + fp32 Shoot_M2006_angle; + fp32 Pitch_M2006_angle; fp32 go_shoot; - fp32 go_spin; }motor_target; struct{ - pid_type_def GM6020_speed; - pid_type_def GM6020_angle; pid_type_def VESC_5065_M1; pid_type_def VESC_5065_M2; - pid_type_def M2006_angle; - pid_type_def M2006_speed; + pid_type_def Shoot_M2006angle; + pid_type_def Shoot_M2006speed; - pid_type_def M3508_angle; - pid_type_def M3508_speed; + pid_type_def Pitch_M2006_angle; + pid_type_def Pitch_M2006_speed; }pid; GO_MotorCmd_t go_cmd; @@ -253,8 +204,7 @@ typedef struct{ /*经PID计算后的实际发送给电机的实时输出值*/ struct { - fp32 final_3508out[4]; - fp32 final_pitchout; + fp32 DJfinal_out[4]; fp32 final_VESC_5065_M1out; fp32 final_VESC_5065_M2out; @@ -271,20 +221,13 @@ typedef struct{ int8_t up_init(UP_t *u,const UP_Param_t *param,float target_freq); - int8_t UP_UpdateFeedback(UP_t *u, const CAN_t *can, CMD_t *c) ; -int8_t GM6020_control(UP_t *u,fp32 angle); int8_t VESC_M5065_Control(UP_t *u,fp32 speed); int8_t GO_SendData(UP_t *u,float pos,float limit); -int8_t UP_angle_control(UP_t *u, fp32 target_angle,MotorType_t motor); int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c); int8_t ALL_Motor_Control(UP_t *u,CAN_Output_t *out); -int8_t UP_M2006_angle(UP_t *u,fp32 target_angle); -int8_t UP_M3508_speed(UP_t *u,fp32 speed); -int8_t Pitch_Process(UP_t *u, CAN_Output_t *out,CMD_t *c); +int8_t DJ_processdata(DJmotor_feedback_t *f,fp32 ecd_to_angle); +int8_t DJ_Angle_Control(UP_t *u,int id,DJmotor_feedback_t *f,pid_type_def *Angle_pid,pid_type_def *Speed_pid,fp32 target_angle); -int8_t Dribble_Process(UP_t *u, CAN_Output_t *out); - -void Dribbl_transfer_a(UP_t *u, CAN_Output_t *out); #endif diff --git a/User/device/GO_M8010_6_Driver.c b/User/device/GO_M8010_6_Driver.c index 4bff220..7a16ce6 100644 --- a/User/device/GO_M8010_6_Driver.c +++ b/User/device/GO_M8010_6_Driver.c @@ -15,7 +15,6 @@ else if ((_IN) >= (_MAX)) \ (_IN) = (_MAX); \ } -GO_MotorCmd_t cmd_gogogo ; RIS_ControlData_t motor_send_data; @@ -102,12 +101,7 @@ void USART6_RxCompleteCallback(void ) memcpy(&data.motor_recv_data, rx_buffer, sizeof(data.motor_recv_data)); // Copy received data extract_data(&data); } -const GO_MotorData_t *get_GO_measure_point(void) +GO_MotorData_t *get_GO_measure_point(void) { return &data; } -void gogogo(void ) -{ - - -} \ No newline at end of file diff --git a/User/device/GO_M8010_6_Driver.h b/User/device/GO_M8010_6_Driver.h index 32de5f3..99cc0cc 100644 --- a/User/device/GO_M8010_6_Driver.h +++ b/User/device/GO_M8010_6_Driver.h @@ -107,10 +107,9 @@ typedef struct void modify_data(GO_MotorCmd_t *motor_s); void extract_data(GO_MotorData_t *motor_r); -const GO_MotorData_t *get_GO_measure_point(void); +GO_MotorData_t *get_GO_measure_point(void); void GO_M8010_send_data( GO_MotorCmd_t *cmd); void USART6_RxCompleteCallback(void ); -void gogogo(void ); #endif /*__GO_M8010_6_H */ diff --git a/User/task/up_task.c b/User/task/up_task.c index 74e1a88..1f96fc2 100644 --- a/User/task/up_task.c +++ b/User/task/up_task.c @@ -31,7 +31,7 @@ static UP_t UP; static CMD_t up_cmd; #endif -float aaa=0; +float aaa=1; float bbb=0; float CCC=0; float ddd=0; @@ -65,11 +65,11 @@ void Task_up(void *argument) // // VESC_M5065_Control(&UP, 20000); - + // - UP_control(&UP,&UP_CAN_out,&up_cmd); - UP.motor_target .go_shoot =aaa; +// UP_control(&UP,&UP_CAN_out,&up_cmd); + UP.motor_target .Pitch_M2006_angle =aaa; // UP.motor_target .M2006_angle =bbb ; // UP.motor_target .M3508_angle =CCC;