diff --git a/MDK-ARM/AUTO_CHASSIS.uvoptx b/MDK-ARM/AUTO_CHASSIS.uvoptx
index 5f23ba8..7f33d80 100644
--- a/MDK-ARM/AUTO_CHASSIS.uvoptx
+++ b/MDK-ARM/AUTO_CHASSIS.uvoptx
@@ -103,7 +103,7 @@
1
0
0
- 6
+ 3
@@ -114,7 +114,7 @@
- STLink\ST-LINKIII-KEIL_SWO.dll
+ BIN\CMSIS_AGDI.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
@@ -235,6 +235,11 @@
1
flaggg,0x0A
+
+ 16
+ 1
+ ddd
+
diff --git a/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf b/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf
index 1b1ae25..dd93e1a 100644
Binary files a/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf and b/MDK-ARM/ELE_CHASSIS/AUTO_CHASSIS.axf differ
diff --git a/User/Module/config.c b/User/Module/config.c
index 78ab050..32fc173 100644
--- a/User/Module/config.c
+++ b/User/Module/config.c
@@ -38,14 +38,14 @@ static const ConfigParam_t param_chassis ={
},
.M3508_angle_param = {
.p = 10.0f,
- .i = 0.0f,
- .d = 1.5f,
+ .i = 0.5f,
+ .d = 0.0f,
.i_limit = 1000.0f,
.out_limit = 3000.0f,
},
.M3508_speed_param={
- .p = 5.1f,
- .i = 0.02f,
+ .p = 6.0f,
+ .i = 0.0f,
.d = 3.2f,
.i_limit = 200.0f,
.out_limit =6000.0f,
@@ -77,25 +77,25 @@ static const ConfigParam_t param_chassis ={
.rev = 0,
.T=0.1,
.W=0.1,
- .K_P=0.10f,
+ .K_P=0.20f,
.K_W=0.1,
},
/*上层其他参数*/
/*运球*/
.DribbleConfig_Config = {
- .m3508_init_angle = 0,
- .m3508_high_angle = 900,
- .go2_init_angle = 35,
- .go2_flip_angle = -130,
+ .m3508_init_angle = 50,
+ .m3508_high_angle = 1200,
+ .go2_init_angle = 0,
+ .go2_flip_angle = -250,
.flip_timing = 200,
- .release_threshold = -1.2f,
+ .go2_release_threshold = -550.0f,
},
/*投球*/
.PitchConfig_Config = {
- .m2006_init_angle =-140,
+ .m2006_init_angle =-150,
.m2006_trigger_angle =0,
- .go1_init_position = 0,
- .go1_release_threshold =-2050,
+ .go1_init_position = -300,
+ .go1_release_threshold =-1900,
},
diff --git a/User/Module/up.c b/User/Module/up.c
index 1c00309..9d37a0d 100644
--- a/User/Module/up.c
+++ b/User/Module/up.c
@@ -45,15 +45,13 @@ int8_t up_init(UP_t *u,const UP_Param_t *param,float target_freq)
u->DribbleContext .DribbleConfig = u->param ->DribbleConfig_Config ;//赋值
u->DribbleContext .DribbleState = Dribble_PREPARE;
u->DribbleContext .is_initialized = 1;
- u->DribbleContext .Dribble_run_num =0;//记录运行次数
+
}
if (!u->PitchContext .is_initialized) {
u->PitchContext .PitchConfig = u->param ->PitchConfig_Config ;//赋值
u->PitchContext .PitchState = PITCH_PREPARE; //状态更新,开始夹球
u->PitchContext .is_initialized = 1;
- u->PitchContext .Pitch_run_num =0;//记录运行次数
-
}
@@ -201,7 +199,7 @@ int8_t GO_SendData(UP_t *u,int id,float pos)
{
GO_M8010_send_data(BSP_UART_GetHandle(BSP_UART_RS485), id,u->param->go_param[id] .rev ,u->param->go_param[id] .T ,u->param->go_param[id] .W ,AngleChange(RADIAN,pos),u->param->go_param [id].K_P ,u->param->go_param[id] .K_W );
- return 0;
+ return 0;
}
@@ -246,47 +244,52 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
{
case UP_RCcontrol: //在手动模式下
- switch (c->CMD_UP_mode )
+ switch (c-> CMD_UP_mode )
{
case Normal :
/*投篮*/
u->motor_target .go_shoot =u->PitchContext .PitchConfig .go1_init_position ;
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 ;
u->motor_target .M3508_angle =u->DribbleContext .DribbleConfig .m3508_init_angle ;
+ u->DribbleContext .DribbleState = Dribble_PREPARE; //重置最初状态
- RELAY1_TOGGLE (1);//接球,1开0关
- RELAY2_TOGGLE (1);//夹球,0关1开
+ RELAY1_TOGGLE (1);//夹球,0夹1开
+ RELAY2_TOGGLE (0);//球,0接1收
break;
case Pitch :
- Pitch_Process(u,out);
- u->PitchContext .PitchState=PITCH_START;//置标志位用于启动投篮
-
+ if (u->PitchContext .PitchState ==PITCH_PREPARE) //首次启动
+ {
+ u->PitchContext .PitchState=PITCH_START;//置标志位用于启动投篮
+ }
+
+ Pitch_Process(u,out);
+
break ;
case Dribble:
{
/*夹球 -> 3508 升起 ,同时go2翻转 -> 到位置后,继电器开,放球,同时3508降,go2翻回->接球,收 */
- Dribble_Process(u,out);
- u->DribbleContext .DribbleState =STATE_GRAB_BALL;//置标志位用于启动运球
-
+
+ if(u->DribbleContext.DribbleState== Dribble_PREPARE){
+
+ u->DribbleContext .DribbleState =STATE_GRAB_BALL;
+ }
+ Dribble_Process(u,out);
+
+
}break ;
-
- case PICK_Pitch_START :
+ case Dribbl_transfer:
- Pitch_Process(u,out);
- u->PitchContext .PitchState=PITCH_START;//置标志位用于启动视觉辅助投篮
-
- break;
-
-
-
+ Dribbl_transfer_a(u,out);
}
break;
@@ -311,12 +314,15 @@ int8_t Pitch_Process(UP_t *u, CAN_Output_t *out)
case PITCH_START:
u->motor_target .go_shoot = u->PitchContext .PitchConfig .go1_release_threshold;
- if(u->motorfeedback .GO_motor_info[0]->Pos < -35.0) //检测go位置到达最上面,这里的检测条件可以更改
+ 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->PitchContext .PitchState=PITCH_PULL_TRIGGER;//置标志位用于启动视觉辅助投篮
+}//更改标志位
+
break ;
case PITCH_PULL_TRIGGER:
- if(u->motorfeedback .M2006 .total_angle <5) //当2006的总角度小于5,可以认为已经勾上
+ if(u->motorfeedback .M2006 .total_angle >-1) //当2006的总角度小于1,可以认为已经勾上,误差为1
{
u->motor_target .go_shoot =u->PitchContext.PitchConfig .go1_init_position;//go下拉
u->PitchContext.PitchState =PITCH_LAUNCHING;//转移标志位
@@ -324,18 +330,17 @@ int8_t Pitch_Process(UP_t *u, CAN_Output_t *out)
break ;
case PITCH_LAUNCHING:
- if(u->motorfeedback .GO_motor_info [0]->Pos <2.0f)
+ if(u->motorfeedback .GO_motor_info [0]->Pos >0)
{
- u->motor_target .M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ;//给-140角度发射
+// u->motor_target .M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ;//给-140角度发射
u->PitchContext .PitchState =PITCH_COMPLETE;
}
break ;
case PITCH_COMPLETE://完成运行动作后,恢复2006,-140度,go,pos0位置
- u->motor_target .M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ;//给-140角度
+ u->motor_target .M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ;//给-140角度
u->motor_target .go_shoot = u->PitchContext .PitchConfig .go1_init_position;
- u->PitchContext .Pitch_run_num ++;//运行次数+1
break ;
@@ -349,6 +354,8 @@ return 0;
+// RELAY1_TOGGLE (1);//夹球,0夹1开
+// RELAY2_TOGGLE (0);//夹球,0接1收
@@ -358,18 +365,18 @@ int8_t Dribble_Process(UP_t *u, CAN_Output_t *out)
switch (u->DribbleContext.DribbleState) {
case STATE_GRAB_BALL://开始
- RELAY2_TOGGLE (0);//夹球
+ 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)) {
- RELAY1_TOGGLE (0);
+ RELAY2_TOGGLE (1);
- if((u->motorfeedback.GO_motor_info[1]->angle) <-53){
-
+ if(((u->motorfeedback.GO_motor_info[1]->Pos ) <-1.1)&&(u->motorfeedback.M3508 .total_angle >1190)){
+
u->DribbleContext .DribbleState = STATE_RELEASE_BALL; //当go2到标准位置,标志位改变
}
@@ -378,13 +385,13 @@ int8_t Dribble_Process(UP_t *u, CAN_Output_t *out)
case STATE_RELEASE_BALL:
- RELAY2_TOGGLE (1);//松球
+ RELAY1_TOGGLE (1);//松球
- if((u->motorfeedback.GO_motor_info[1]->angle) <-60){
- u->motor_target.go_spin =u->DribbleContext .DribbleConfig .go2_init_angle ; //恢复go2位置
+ if((u->motorfeedback.GO_motor_info[1]->Pos ) <-1.3){
+ u->motor_target.go_spin =-40; //恢复go2位置
u->DribbleContext .DribbleState = STATE_CATCH_PREP; //当go2到标准位置,标志位改变
}
@@ -392,22 +399,25 @@ int8_t Dribble_Process(UP_t *u, CAN_Output_t *out)
break;
case STATE_CATCH_PREP:
- if((u->motorfeedback.GO_motor_info[1]->angle) > -0){
- u->motor_target.M3508_angle =u->DribbleContext .DribbleConfig .m3508_init_angle ; //当go2到初始位置,3508降
+ if((u->motorfeedback.GO_motor_info[1]->Pos )> -0.4){
+ u->motor_target.M3508_angle =0 ; //当go2到初始位置,3508降
- RELAY1_TOGGLE (1);//接球
+ RELAY2_TOGGLE (0);//接球
}
- if(u->motorfeedback .M3508 .total_angle <5){
- u->DribbleContext .DribbleState = STATE_CATCH_DONE;
+ if(u->motorfeedback .M3508 .total_angle <51.0f){
+ RELAY1_TOGGLE (0);//夹球,0夹1开
+
+ u->DribbleContext .DribbleState = STATE_TRANSFER;
}
+
break;
+
+
+
+
+ break ;
- case STATE_CATCH_DONE:
- RELAY2_TOGGLE (1);//松球
- RELAY1_TOGGLE (0);
- u->DribbleContext .Dribble_run_num ++;//运行次数增加
- break;
default:
break;
@@ -416,3 +426,42 @@ int8_t Dribble_Process(UP_t *u, CAN_Output_t *out)
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 5250861..3019478 100644
--- a/User/Module/up.h
+++ b/User/Module/up.h
@@ -44,7 +44,7 @@
typedef enum {
PITCH_PREPARE, // 准备阶段
PITCH_START, //启动,拉扳机
- PITCH_PULL_TRIGGER, // 扳机拉动
+ PITCH_PULL_TRIGGER,
PITCH_LAUNCHING, // 发射中
PITCH_COMPLETE // 完成
} PitchState_t;
@@ -63,7 +63,6 @@ typedef struct {
PitchConfig_t PitchConfig;
uint8_t is_initialized ;
- uint8_t Pitch_run_num;
} PitchContext_t;
@@ -80,6 +79,7 @@ typedef enum {
STATE_RELEASE_BALL, // 释放球体
STATE_CATCH_PREP, // 接球准备
STATE_CATCH_BALL, // 接球动作
+ STATE_TRANSFER, //转移球
STATE_CATCH_DONE //完成
} DribbleState_t;
@@ -90,7 +90,8 @@ typedef struct {
fp32 go2_init_angle; // GO2初始角度
fp32 go2_flip_angle; // GO2翻转角度
fp32 flip_timing; // 翻转触发时机
- fp32 release_threshold; // 释放球
+// fp32
+ fp32 go2_release_threshold; // 释放球
} DribbleConfig_t;
/* 状态机上下文 */
@@ -99,7 +100,6 @@ typedef struct {
DribbleConfig_t DribbleConfig;
uint8_t is_initialized;
- uint8_t Dribble_run_num;
} DribbleContext_t;
@@ -177,7 +177,7 @@ typedef struct{
uint8_t up_task_run;
const UP_Param_t *param;
- int state;
+ int state;
@@ -260,7 +260,7 @@ typedef struct{
LowPassFilter2p_t filled[6]; /* 输出滤波器滤波器数组 */
- fp32 vofa_send[8];
+ fp32 vofa_send[8];
@@ -282,5 +282,6 @@ int8_t Pitch_Process(UP_t *u, CAN_Output_t *out);
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/cmd.c b/User/device/cmd.c
index 88a50c0..961968d 100644
--- a/User/device/cmd.c
+++ b/User/device/cmd.c
@@ -43,9 +43,12 @@ int8_t CMD_ParseNuc(CMD_t *cmd,CMD_NUC_t *n){
/*遥控器,上下层通用,按键控制,统一到cmd*/
int8_t CMD_ParseRC(CMD_t *cmd,const CMD_RC_t *rc) {
-
+
+
if(cmd == NULL) return -1;
-
+ const CMD_CtrlType_t prev_CtrlType = cmd->CMD_CtrlType ;
+ const CMD_UP_mode_t prev_mode = cmd->CMD_UP_mode ;//保存旧状态
+
if ((rc->sw_l == CMD_SW_ERR) || (rc->sw_r == CMD_SW_ERR)) {
cmd->CMD_CtrlType =RELAXED;
}
@@ -54,7 +57,7 @@ int8_t CMD_ParseRC(CMD_t *cmd,const CMD_RC_t *rc) {
cmd ->CMD_CtrlType =UP_RCcontrol;
if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_UP_mode =Pitch; //左上,右上,投篮
if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_UP_mode =Normal; //左上,右中,无模式
- if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_UP_mode =Dribble; //左上,右上,运球
+ if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_UP_mode =Normal; //左上,右上,运球
}
else if(rc->sw_l==CMD_SW_MID)
@@ -74,13 +77,16 @@ int8_t CMD_ParseRC(CMD_t *cmd,const CMD_RC_t *rc) {
}
else if(rc->sw_l==CMD_SW_DOWN)
{
- cmd ->CMD_CtrlType =PICK_t;
- if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_UP_mode =PICK_Pitch_Normal; //左下,右上,投篮
- if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_UP_mode =Normal; //左下,右中,无模式
- if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_UP_mode =PICK_Pitch_START; //左下,右上,投篮
+ cmd ->CMD_CtrlType =UP_RCcontrol;
+ if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_UP_mode =Dribbl_transfer; //左下,右上,投篮
+ if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_UP_mode =Dribble; //左下,右中,无模式
+ if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_UP_mode =Normal; //左下,右上,无模式
}
-
-
+
+ if (prev_CtrlType!= cmd->CMD_CtrlType ) cmd ->last_CMD_CtrlType = prev_CtrlType;
+ if (prev_mode!=cmd->CMD_UP_mode ) cmd ->last_CMD_UP_mode =prev_mode;
+
+
return 0;
}
diff --git a/User/device/cmd.h b/User/device/cmd.h
index 24e998b..cb73edc 100644
--- a/User/device/cmd.h
+++ b/User/device/cmd.h
@@ -26,8 +26,7 @@ typedef enum{
/*视觉辅助下的投篮*/
PICK_Pitch_Normal,
- PICK_Pitch_START
-
+ Dribbl_transfer
}CMD_UP_mode_t;
typedef struct {
uint8_t status_fromnuc;
@@ -99,7 +98,8 @@ typedef struct {
CMD_UP_mode_t CMD_UP_mode;
CMD_CtrlType_t CMD_CtrlType;
-
+ CMD_CtrlType_t last_CMD_CtrlType;
+ CMD_UP_mode_t last_CMD_UP_mode;
} CMD_t;
diff --git a/User/task/up_task.c b/User/task/up_task.c
index 63701fd..5f1b52a 100644
--- a/User/task/up_task.c
+++ b/User/task/up_task.c
@@ -67,19 +67,16 @@ void Task_up(void *argument)
//
-// GO_SendData(&UP, 1,CCC);
-// GO_SendData(&UP, 0,aaa);
UP_control(&UP,&UP_CAN_out,&up_cmd);
// UP.motor_target .go_shoot =aaa;
// UP.motor_target .M2006_angle =bbb ;
-// UP_control(&UP,&UP_CAN_out,&up_cmd);
// UP.motor_target .M3508_angle =CCC;
// UP.motor_target .go_shoot =aaa;
// UP.motor_target .M2006_angle =bbb;
// UP.motor_target .go_spin =ddd;
-
+//
ALL_Motor_Control(&UP,&UP_CAN_out);
osDelay(1);