diff --git a/MDK-ARM/.vscode/keil-assistant.log b/MDK-ARM/.vscode/keil-assistant.log
index 488f11b..28d9a59 100644
--- a/MDK-ARM/.vscode/keil-assistant.log
+++ b/MDK-ARM/.vscode/keil-assistant.log
@@ -471,3 +471,7 @@
[info] Log at : 2025/6/22|14:26:08|GMT+0800
+[info] Log at : 2025/6/23|20:59:34|GMT+0800
+
+[info] Log at : 2025/6/24|03:28:50|GMT+0800
+
diff --git a/MDK-ARM/R2.uvoptx b/MDK-ARM/R2.uvoptx
index 42438c7..52b5e21 100644
--- a/MDK-ARM/R2.uvoptx
+++ b/MDK-ARM/R2.uvoptx
@@ -103,7 +103,7 @@
1
0
0
- 3
+ 6
@@ -114,13 +114,13 @@
- BIN\CMSIS_AGDI.dll
+ STLink\ST-LINKIII-KEIL_SWO.dll
0
ST-LINKIII-KEIL_SWO
- -U00260035480000034E575152 -O206 -SF5000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGHx$CMSIS\Flash\STM32F4xx_1024.FLM)
+ -U00260035480000034E575152 -O206 -SF1000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGHx$CMSIS\Flash\STM32F4xx_1024.FLM)
0
@@ -140,12 +140,12 @@
0
DLGUARM
-
+ (105=-1,-1,-1,-1,0)
0
CMSIS_AGDI
- -X"Any" -UAny -O206 -S9 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGHx$CMSIS\Flash\STM32F4xx_1024.FLM)
+ -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407IGHx$CMSIS\Flash\STM32F4xx_1024.FLM)
0
@@ -158,73 +158,38 @@
0
1
- can,0x0A
+ NUC_send,0x0A
1
1
- chassis,0x0A
+ SendBuffer,0x10
2
1
- UP,0x0A
+ f,0x0A
3
1
- NUC_send,0x0A
+ a,0x0A
4
1
- pid,0x0A
+ chassis
5
1
- pid_param,0x0A
+ cmd_fromnuc,0x0A
6
1
- cmd_rc,0x0A
-
-
- 7
- 1
- cbuf,0x10
-
-
- 8
- 1
- cmd
-
-
- 9
- 1
- rc_ctrl,0x0A
-
-
- 10
- 1
- nuc_raw,0x0A
-
-
- 11
- 1
- cmd_fromnuc,0x0A
-
-
- 12
- 1
nucbuf,0x0A
-
- 13
- 1
- LD_raw,0x0A
-
0
@@ -273,7 +238,7 @@
0
0
2
- 5000000
+ 1000000
diff --git a/MDK-ARM/R2/R2.axf b/MDK-ARM/R2/R2.axf
index 244cf2c..011c36e 100644
Binary files a/MDK-ARM/R2/R2.axf and b/MDK-ARM/R2/R2.axf differ
diff --git a/User/Algorithm/error_detect.h b/User/Algorithm/error_detect.h
index 76f75a1..48e51db 100644
--- a/User/Algorithm/error_detect.h
+++ b/User/Algorithm/error_detect.h
@@ -1,6 +1,4 @@
#ifndef ERROR_DETECT_H
-
-
#define ERROR_DETECT_H
#include "struct_typedef.h"
diff --git a/User/Module/Chassis.c b/User/Module/Chassis.c
index b5a18dd..f0593f6 100644
--- a/User/Module/Chassis.c
+++ b/User/Module/Chassis.c
@@ -48,7 +48,7 @@ int8_t Chassis_init(Chassis_t *c, const Chassis_Param_t *param, float target_fre
PID_init(&(c->pid.SickCaliWzPID), PID_POSITION, &(c->param->Sick_CaliWparam));
PID_init(&(c->pid.SickCaliVxPID), PID_POSITION, &(c->param->Sick_CaliXparam));
PID_init(&(c->pid.SickCaliVyPID), PID_POSITION, &(c->param->Sick_CaliYparam));
-
+ PID_init(&(c->pid.Chassis_AngleAdjust), PID_POSITION, &(c->param->Chassis_AngleAdjust_param));
LowPassFilter2p_Init(&(c->filled[0]), target_freq, 80.0f); // 角加速度滤波
LowPassFilter2p_Init(&(c->filled[1]), target_freq, 80.0f); // w滤波
@@ -60,8 +60,6 @@ int8_t Chassis_init(Chassis_t *c, const Chassis_Param_t *param, float target_fre
return CHASSIS_OK;
}
-fp32 gyro_kp = 1.0f;
-fp32 PIAN = 0;
fp32 pian_yaw;
void Chassis_speed_calculate(Chassis_t *c, fp32 Vx, fp32 Vy, fp32 Vw) {
fp64 Nor_Vx, Nor_Vy;
@@ -107,7 +105,7 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) {
c->move_vec.Vw = ctrl->Vw * 6000;
break;
- case Chassis_Adjust:
+ case Chassis_Adjust_Sick:
sick_calibration(c, ctrl, out);
c->NUC_send.send[0] = (c->sick_cali.is_reach == 1) ? 1 : 0;
@@ -127,7 +125,7 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) {
abs_limit_fp(&c->move_vec.Vx, 5000.0f);
abs_limit_fp(&c->move_vec.Vy, 5000.0f);
abs_limit_fp(&c->move_vec.Vw, 5000.0f);
- c->NUC_send.send[0] = 1;
+ // c->NUC_send.send[0] = 1;
break;
case AUTO_MID360_Pitch:
@@ -138,6 +136,14 @@ int8_t Chassis_Control(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out) {
c->move_vec.Vy = ctrl->Vx * 6000;
break;
+ case PassBall: //
+ c->move_vec.Vw = ctrl->cmd_MID360.posw * 1000;
+ c->move_vec.Vy = -ctrl->cmd_MID360.posy * 1000;
+ c->move_vec.Vx = -ctrl->cmd_MID360.posx * 1000;
+ abs_limit_fp(&c->move_vec.Vx, 5000.0f);
+ abs_limit_fp(&c->move_vec.Vy, 5000.0f);
+ abs_limit_fp(&c->move_vec.Vw, 5000.0f);
+ break ;
default:
break;
@@ -194,7 +200,7 @@ int8_t sick_calibration(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out)
fp32 diff_yaw = -(fp32)(sick1 - sick2);
fp32 diff_y = -(fp32)(sick1 - c->sick_cali.sickparam.y_set);
- fp32 diff_x = (fp32)(sick0 - c->sick_cali.sickparam.x_set);
+ fp32 diff_x = (fp32)(sick0 - c->sick_cali.sickparam.x_set);
c->move_vec.Vw = (fabsf(diff_yaw) > param->w_error) ? PID_calc(&(c->pid.SickCaliWzPID), diff_yaw, 0) : 0;
@@ -219,37 +225,20 @@ int8_t sick_calibration(Chassis_t *c, CMD_t *ctrl, CAN_Output_t *out)
return CHASSIS_OK;
}
-
-pid_type_def pid;
-pid_param_t pid_param={
- .p = 10.0f,
- .i = 0.00f,
- .d = 0.00f,
- .i_limit = 2000.0f,
- .out_limit =5000.0f,
-};
- fp32 cur_angle,pian_angel;
int8_t Chassis_AngleCompensate(Chassis_t *c)
{
if (c == NULL) return CHASSIS_ERR_NULL;
-// int is_in;//是否初始化
-// if(is_in==0){
- PID_init(&pid,PID_POSITION,&pid_param);
-// is_in=1;
-// }
-
-
-
+ static fp32 pian_angel,cur_angle;
if((c->move_vec.Vx || c->move_vec.Vy) && (c->move_vec.Vw== 0))
{
- pian_angel=cur_angle-AngleChange(DEGREE,c->pos088.imu_eulr.yaw);
+ pian_angel=cur_angle-AngleChange(DEGREE,c->pos088.imu_eulr.yaw);
}
else {
cur_angle=AngleChange(DEGREE,c->pos088.imu_eulr.yaw);
- pian_angel=0;
+ pian_angel=0;
}
- pian_yaw = PID_calc(&pid,pian_angel,0);
+ pian_yaw = PID_calc(&c->pid.Chassis_AngleAdjust,pian_angel,0);
}
diff --git a/User/Module/Chassis.h b/User/Module/Chassis.h
index e2e2e4a..6020adc 100644
--- a/User/Module/Chassis.h
+++ b/User/Module/Chassis.h
@@ -82,8 +82,8 @@ typedef struct
pid_param_t Sick_CaliWparam;
pid_param_t Sick_CaliYparam;
- pid_param_t Sick_CaliXparam;
-
+ pid_param_t Sick_CaliXparam;
+ pid_param_t Chassis_AngleAdjust_param;
sickparam_t sickparam;
@@ -100,6 +100,7 @@ typedef struct
}ChassisMove_Vec;
typedef struct
{
+
fp32 send[4];
}NUC_send_t;
@@ -154,7 +155,7 @@ typedef struct{
/*存在较低误差*/
pid_type_def chassis_PICKWzPID_LOW;
-
+ pid_type_def Chassis_AngleAdjust;
pid_type_def SickCaliWzPID;
pid_type_def SickCaliVxPID;
diff --git a/User/Module/config.c b/User/Module/config.c
index ef628ab..d748f9c 100644
--- a/User/Module/config.c
+++ b/User/Module/config.c
@@ -58,28 +58,6 @@ static const ConfigParam_t param ={
.out_limit = 3000.0f,
},
-.Dribble_M3508_speed_param={ //三摩擦速度环
- .p = 30.0f,
- .i = 0.45f,
- .d = 0.0f,
- .i_limit = 3000.0f,
- .out_limit = 5000.0f,
-},
-.Dribble_translate_M3508_speed_param={//平移用3508速度环
- .p = 5.0f,
- .i = 0.3f,
- .d = 0.0f,
- .i_limit = 2000.0f,
- .out_limit = 3000.0f,
-},
-.Dribble_translate_M3508_angle_param= { //平移用3508角度环
- .p = 25.0f,
- .i = 0.0f,
- .d = 1.5f,
- .i_limit = 1000.0f,
- .out_limit = 3000.0f,
-},
-
.go_cmd={
.id =0,
@@ -93,21 +71,8 @@ static const ConfigParam_t param ={
},
-/*上层其他参数*/
- /*运球*/
- .DribbleCfg = {
- .dribble_flag=0,
- .m3508_init_ang = -5,
- .m3508_translate_angle = 1000,
- .rev_spd=-2000,
- .spd= 4200, // 转动速度
- .init_spd=0,
+/*上层其他参数*/
- .light_3508_flag=0,//3508平移处的光电,0初始,1到位置
- .light_ball_flag=0,//检测球的flag
-
-
-},
/*投球*/
.PitchCfg = {
.m2006_init =-150, //释放的角度
@@ -167,11 +132,19 @@ static const ConfigParam_t param ={
.i_limit = 500.0f,
.out_limit =3000.0f,
},
+ .Chassis_AngleAdjust_param={
+ .p = 10.0f,
+ .i = 0.0f,
+ .d = 0.0f,
+ .i_limit = 0.0f,
+ .out_limit =1000.0f,
+
+ },
.sickparam={
.w_error=5,
.xy_error=5,
- .x_set=927,
- .y_set=1255,
+ .x_set=600,
+ .y_set=100,
},
diff --git a/User/Module/up.c b/User/Module/up.c
index f9d6b73..e5608d7 100644
--- a/User/Module/up.c
+++ b/User/Module/up.c
@@ -5,11 +5,6 @@
#include "bsp_delay.h"
/*接线
-上层用到三个光电
-1.PE9 发射用 输出高电平 LIGHTA
-2.PE11 运球上3508 输出高电平 LIGHTB
-3.PE13 三摩擦检测球 输出高电平LIGHTC
-
*/
@@ -41,24 +36,10 @@ int8_t up_init(UP_t *u,const UP_Param_t *param,float target_freq)
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 .Dribble_translate_M3508_angle ,PID_POSITION ,&(u->param->Dribble_translate_M3508_angle_param ));
- PID_init (&u->pid .Dribble_translate_M3508_speed ,PID_POSITION ,&(u->param->Dribble_translate_M3508_speed_param ));
- for(int i=0;i<3;i++){
- PID_init (&u->pid .Dribble_M3508_speed[i] ,PID_POSITION ,&(u->param->Dribble_M3508_speed_param ));
- }
u->go_cmd =u->param ->go_cmd ;
LowPassFilter2p_Init(&(u->filled[0]),target_freq,100.0f);
-
- // 初始化上层状态机
- if (!u->DribbleCont .is_init) { //检查是否为第一次运行状态机,运球
- u->DribbleCont .DribbleConfig = u->param ->DribbleCfg ;//赋值
- u->DribbleCont .DribbleState = DRIBBLE_PREPARE;
- u->DribbleCont .is_init = 1;
-
- }
if (!u->Pitch_Cfg .is_init) {
u->Pitch_Cfg .PitchConfig = u->param ->PitchCfg ;//赋值
@@ -95,10 +76,6 @@ int8_t UP_UpdateFeedback(UP_t *u, const CAN_t *can, CMD_t *c) {
}
u->cmd =c;
- /*光电状态更新*/
- u->DribbleCont .DribbleConfig .light_ball_flag =HAL_GPIO_ReadPin(LIGHT_C_GPIO_Port ,LIGHT_C_Pin);
- u->DribbleCont .DribbleConfig .light_3508_flag =HAL_GPIO_ReadPin(LIGHT_B_GPIO_Port ,LIGHT_B_Pin);
-
return 0;
}
@@ -202,21 +179,10 @@ int8_t GO_SendData(UP_t *u, float pos, float limit)
int8_t ALL_Motor_Control(UP_t *u,CAN_Output_t *out)
{
//电机控制 ,传进can
- DJ_Speed_Control(u,0x201,&u->motorfeedback .DJmotor_feedback[0] ,&u->pid .Dribble_M3508_speed[0],u->motor_target .Dribble_M3508_speed[0]);
- DJ_Speed_Control(u,0x202,&u->motorfeedback .DJmotor_feedback[1] ,&u->pid .Dribble_M3508_speed[1],u->motor_target .Dribble_M3508_speed[1]);
- DJ_Speed_Control(u,0x203,&u->motorfeedback .DJmotor_feedback[2] ,&u->pid .Dribble_M3508_speed[2],u->motor_target .Dribble_M3508_speed[2]);
- DJ_Angle_Control(u,0x204,&u->motorfeedback .DJmotor_feedback[3] ,
- &u->pid .Dribble_translate_M3508_angle ,
- &u->pid .Dribble_translate_M3508_speed ,
- u->motor_target .Dribble_translate_M3508_angle );
DJ_Angle_Control(u,0x205,&u->motorfeedback .DJmotor_feedback[4] ,
&u->pid .Shoot_M2006angle ,
&u->pid .Shoot_M2006speed ,
u->motor_target .Shoot_M2006_angle );
-// DJ_Angle_Control(u,0x206,&u->motorfeedback .DJmotor_feedback[5] ,
-// &u->pid .Pitch_M2006_angle ,
-// &u->pid .Pitch_M2006_speed ,
-// u->motor_target .Pitch_M2006_angle );
DJ_Speed_Control(u,0x206,&u->motorfeedback .DJmotor_feedback[5],&u->pid .Pitch_M2006_speed,
(PID_calc (&(u->pid .Pitch_M2006_angle ),
u->motorfeedback .Encoder.angle,u->motor_target .Shoot_Pitch_angle))
@@ -252,7 +218,6 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
/*指针简化*/
PitchCfg_t *pitch_cfg = &u->Pitch_Cfg.PitchConfig;
- DribbleCfg_t *DribbleCont = &u->DribbleCont.DribbleConfig;
up_motor_target_t *target=&u->motor_target ;
static int is_pitch=1;
@@ -278,17 +243,6 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
target->Shoot_M2006_angle =u->Pitch_Cfg .PitchConfig .m2006_init ;
u->Pitch_Cfg .PitchState = PITCH_PREPARE; //状态更新,开始夹球
- /*运球*/
-
- RELAY1_TOGGLE(0);//关闭气缸
- for(int i=0;i<3;i++){
- target->Dribble_M3508_speed[i]=0;
- }
- target->Dribble_translate_M3508_angle =u->DribbleCont .DribbleConfig .m3508_translate_angle;
- u->DribbleCont .DribbleState = DRIBBLE_PREPARE; //重置最初状态
-
-
-
break;
case Pitch :
@@ -309,17 +263,7 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
target->go_shoot=u->Pitch_Cfg.PitchConfig.go_release_pos;
target->Shoot_Pitch_angle=u->Pitch_Cfg.PitchConfig.Pitch_angle;
break ;
- case Dribble:
- {
-
- if(u->DribbleCont.DribbleState== DRIBBLE_PREPARE){
- u->DribbleCont .DribbleState=DRIBBLE_PROCESS_DOWN;
- }
- //光电状态更新
- Dribble_Process(u,out);
- }break ;
-
-
+
default:
break;
@@ -334,13 +278,9 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
{
u->Pitch_Cfg .PitchState=PITCH_START;//置标志位用于启动投篮
}
- /*根据距离实时计算所需pos*/
-
+ /*根据距离实时计算所需pos*/
pitch_cfg ->go_release_pos=c->pos;
-// if(u->CoContext .CoState == CoPITCH){
-// u->CoContext.CoState=CoPITCH_MID360;
-// }
-// Co_Process(u,out);
+
Pitch_Process(u,out);
break ;
@@ -349,9 +289,7 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
target->Shoot_M2006_angle =pitch_cfg ->m2006_init ;
u->Pitch_Cfg .PitchState = PITCH_PREPARE;
- u->DribbleCont .DribbleState = DRIBBLE_PREPARE;
-
-
+
break ;
}
@@ -371,8 +309,6 @@ return 0;
-
-
int8_t Pitch_Process(UP_t *u, CAN_Output_t *out)
{
@@ -425,187 +361,3 @@ return 0;
-
-
-
-
-
-int8_t Dribble_Process(UP_t *u, CAN_Output_t *out)
-{
- static int common_speed_flag=0;//是否共速
- static int common_speed_reverse_flag=0;//是否共速
-
- DribbleCfg_t *DribbleCfg = &u->DribbleCont.DribbleConfig;
- up_motor_target_t *target=&u->motor_target ;
- DribbleState_t *DribbleState=&u->DribbleCont.DribbleState;
-
- switch (u->DribbleCont.DribbleState) {
-
- case DRIBBLE_TRANSLATE:
- target->Dribble_translate_M3508_angle =DribbleCfg->m3508_translate_angle;//平行移动
-
- if(u->motorfeedback.DJmotor_feedback[3].rpm==0 && u->motorfeedback.DJmotor_feedback[3].total_angle < -500)//速度为0认为卡主
- {
- u->DribbleCont .DribbleState=DRIBBLE_PROCESS_DOWN;//到达位置后,转移状态
- }
- break;
- case DRIBBLE_PROCESS_DOWN:
-
- target->Dribble_M3508_speed[0]=DribbleCfg->spd;
- target->Dribble_M3508_speed[1]=DribbleCfg->spd;
- target->Dribble_M3508_speed[2]=DribbleCfg->spd;
-
- if(is_reached_multiple(u->motorfeedback .DJmotor_feedback [0].rpm,
- u->motorfeedback .DJmotor_feedback [1].rpm,
- u->motorfeedback .DJmotor_feedback [2].rpm,
- DribbleCfg->spd,
- DribbleCfg->spd,
- DribbleCfg->spd, 50.0f,50)
- ) {
- RELAY1_TOGGLE(1); //速度达到后打开气缸
- common_speed_flag =1;
- }
- if(common_speed_flag){
- if(u->DribbleCont .DribbleConfig .light_ball_flag == 0){//球下落检测,反转
- target->Dribble_M3508_speed[0]=DribbleCfg->rev_spd;
- target->Dribble_M3508_speed[1]=DribbleCfg->rev_spd;
- target->Dribble_M3508_speed[2]=DribbleCfg->rev_spd;
-
- *DribbleState=DRIBBLE_PROCESS_UP;
-
- }
-
- }
-
-
- break;
- case DRIBBLE_PROCESS_UP:
- common_speed_flag =0;
-
- if((u->motorfeedback .DJmotor_feedback [0].rpm<-500)&&
- (u->motorfeedback .DJmotor_feedback [1].rpm<-500)&&
- (u->motorfeedback .DJmotor_feedback [2].rpm<-500)
- ){
- common_speed_reverse_flag=1;
-
- }
- if(common_speed_reverse_flag){
- if(DribbleCfg->light_ball_flag == 1){
- *DribbleState=DRIBBLE_DONE;
- RELAY1_TOGGLE(0); //关闭气缸
- }
- }
- break ;
- case DRIBBLE_DONE:
- common_speed_reverse_flag=0;
- for(int i=0;i<3;i++){
- target->Dribble_M3508_speed[i]=DribbleCfg->init_spd ;//三摩擦速度归0
- }
-
- /*标志位清零*/
- DribbleCfg->light_ball_flag=0;
- DribbleCfg->light_3508_flag=0;
-
-
- break;
- default:
- // 处理未知状态
- break;
- }
- return 0;
-}
-// CoPREPARE, // 准备阶段
-// CoTRANSLATE_OUT,//上方平移,去运球
-// CoDRIBBLE, //运球阶段
-// CoTRANSLATE_IN,//上方平移,送球发射,回到运球位置
-// CoPITCH, //发射
-// CoDONE,
-//int8_t Trans_Process (UP_t *u, CAN_Output_t *out)
-//{
-//
-//}
-int8_t Co_Process(UP_t *u, CAN_Output_t *out)
-{
- switch(u->CoContext .CoState )
- {
- case CoPREPARE:
-
- break ;
- case CoTRANSLATE_OUT:
- u->motor_target .Dribble_translate_M3508_angle =u->DribbleCont .DribbleConfig.m3508_translate_angle;//平行移动
-
- if(u->motorfeedback.DJmotor_feedback[3].rpm==0 && u->motorfeedback.DJmotor_feedback[3].total_angle > 500)//速度为0认为卡主
- {
- u->DribbleCont .DribbleState=DRIBBLE_PROCESS_DOWN;//到达位置后,运球转移状态
- u->Pitch_Cfg .PitchState = PITCH_START;
-
- u->CoContext .CoState =CoDRIBBLE;
- }
- break;
-
- case CoDRIBBLE:
- Dribble_Process(u,out); //状态停在DRIBBLE_DONE
- Pitch_Process(u,out); //状态停在PITCH_LAUNCHING
- //状态停在对应位置时,平移去给发射送球
- if(u->DribbleCont .DribbleState ==DRIBBLE_DONE && u->Pitch_Cfg.PitchState ==PITCH_LAUNCHING)
- {
- u->motor_target .Dribble_translate_M3508_angle =u->DribbleCont .DribbleConfig .m3508_init_ang;
- }
- if(is_reached(u->motorfeedback.DJmotor_feedback[3].total_angle ,u->DribbleCont .DribbleConfig.m3508_init_ang,1.0f))
- {
- u->motor_target.Dribble_M3508_speed[0]=1000;
- u->motor_target.Dribble_M3508_speed[1]=1000;
- u->motor_target.Dribble_M3508_speed[2]=1000;
-
- u->CoContext .CoState =CoTRANSLATE_IN;
- }
-
- break ;
- case CoTRANSLATE_IN:
-
- if(is_reached_multiple(u->motorfeedback .DJmotor_feedback [0].rpm,
- u->motorfeedback .DJmotor_feedback [1].rpm,
- u->motorfeedback .DJmotor_feedback [2].rpm,
- u->motor_target.Dribble_M3508_speed [0],
- u->motor_target.Dribble_M3508_speed [1],
- u->motor_target.Dribble_M3508_speed[2],
- 50.0f,100)
- ) {
- RELAY1_TOGGLE(1); //速度达到后打开气缸,送给发射
- }
- if(u->DribbleCont .DribbleConfig.light_ball_flag == 0)
- {
- u->motor_target.Dribble_M3508_speed[0]=0;
- u->motor_target.Dribble_M3508_speed[1]=0;
- u->motor_target.Dribble_M3508_speed[2]=0;
- u->motor_target .Dribble_translate_M3508_angle =u->DribbleCont .DribbleConfig.m3508_translate_angle;//平行移动
-
- }
-
- if(u->motorfeedback.DJmotor_feedback[3].rpm==0 && u->motorfeedback.DJmotor_feedback[3].total_angle > 900)//速度为0认为卡主,卡到最右端
- {
-
- u->CoContext .CoState =CoPITCH;
-
- }
- break ;
-
- case CoPITCH:
-
-
-
- case CoPITCH_MID360:
-
- u->motor_target .go_shoot=u->Pitch_Cfg.PitchConfig.go_init;
-
- break ;
- break ;
-
- }
-
-
-
-
-
-}
-
diff --git a/User/Module/up.h b/User/Module/up.h
index b3265cc..219461a 100644
--- a/User/Module/up.h
+++ b/User/Module/up.h
@@ -27,27 +27,6 @@
*/
-/*配合过程状态*/
-typedef enum {
- CoPREPARE, // 准备阶段
- CoTRANSLATE_OUT,//上方平移,去运球
- CoDRIBBLE, //运球和蓄力阶段,再平移回去
- CoTRANSLATE_IN,//上方平移,送球发射,回到运球位置
- CoPITCH, //发射
- CoPITCH_MID360, //雷达发射
- CoDONE,
-
-
-}CoState_t;
-/*总配合上下文*/
-typedef struct {
- CoState_t CoState;
-
- uint8_t is_init ;
-} CoCon_t;
-
-
-
/* 投球状态定义 */
typedef enum {
@@ -72,16 +51,7 @@ typedef struct {
fp32 go_release_pos;//go松开,发射位置
} PitchCfg_t;
-//fp32 go_pull_pos;
-// fp32 m2006_init; // M2006初始角度
-// fp32 m2006_trig; // M2006触发角度
-// fp32 go_init; // GO初始位置
-// fp32 go_release; // GO释放阈值
-// fp32 go_recv; // GO接球位置
-// fp32 screw_init; // 螺杆初始值
-// fp32 pitch_ang; // 投球角度
-// fp32 pull_spd; // 拉动速度
-/* 投球控制上下文 */
+
typedef struct {
PitchState_t PitchState;
PitchCfg_t PitchConfig;
@@ -99,33 +69,6 @@ typedef enum {
DRIBBLE_DONE // 运球结束
} DribbleState_t;
-/* 参数配置结构体 */
-typedef struct {
- int8_t dribble_flag;//当移动三摩擦后为1,否则为0,防止发射撞到
-
- fp32 m3508_init_ang; // 3508平移前位置
- fp32 m3508_translate_angle; // 平移后位置
- fp32 init_spd;
- fp32 spd; // 转动速度
- fp32 rev_spd;
-
-
- /*光电标志位,初始值均为0,触发为1*/
- int light_3508_flag;//3508平移处的光电,0初始,1到位置
- int light_ball_flag;//检测球的flag
-
-} DribbleCfg_t;
-
-/* 状态机上下文 */
-typedef struct {
- DribbleState_t DribbleState;
- DribbleCfg_t DribbleConfig;
-
- uint8_t is_init;
-
-} DribbleCont_t;
-
-
typedef struct {
BMI088_t bmi088;
@@ -147,14 +90,7 @@ typedef struct
pid_param_t Pitch_M2006_angle_param;
pid_param_t Pitch_Angle_M2006_speed_param;
-
- pid_param_t Dribble_M3508_speed_param;//三摩擦用的速度环
-
- pid_param_t Dribble_translate_M3508_speed_param;//平移用的速度环
- pid_param_t Dribble_translate_M3508_angle_param;//平移用的角度环
-
- DribbleCfg_t DribbleCfg;
PitchCfg_t PitchCfg;
GO_MotorCmd_t go_cmd;
@@ -168,8 +104,6 @@ typedef struct{
fp32 Pitch_M2006_angle;
fp32 go_shoot;
- fp32 Dribble_M3508_speed[3];//运球转速
- fp32 Dribble_translate_M3508_angle;//平移用的3508转动角度
fp32 Shoot_Pitch_angle;
@@ -189,11 +123,6 @@ typedef struct{
pid_type_def Pitch_Angle_M2006_speed;
- pid_type_def Dribble_M3508_speed[3];//三摩擦用的速度环
-
- pid_type_def Dribble_translate_M3508_speed;//平移用的速度环
- pid_type_def Dribble_translate_M3508_angle;//平移用的角度环
-
}up_pid_t;
typedef struct
@@ -213,9 +142,6 @@ typedef struct{
uint8_t up_task_run;
const UP_Param_t *param;
- CoCon_t CoContext;
- /*运球过程*/
- DribbleCont_t DribbleCont;
/*投篮过程*/
Pitch_Cfg_t Pitch_Cfg;
@@ -272,9 +198,7 @@ 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 DJ_Speed_Control(UP_t *u,int id,DJmotor_feedback_t *f,pid_type_def *Speed_pid,fp32 target_speed);
-int8_t Dribble_Process(UP_t *u, CAN_Output_t *out);
int8_t Pitch_Process(UP_t *u, CAN_Output_t *out);
-int8_t Co_Process(UP_t *u, CAN_Output_t *out);
#endif
diff --git a/User/device/can_use.c b/User/device/can_use.c
index eb86332..b00a8d4 100644
--- a/User/device/can_use.c
+++ b/User/device/can_use.c
@@ -2,6 +2,9 @@
/*
CAN总线上的设备1到7
将所有CAN总线上挂载的设备抽象成单个设备进行管理和控制
+
+
+ 底盘4个3508,3个dt35接收板,终端电阻勿开,会出现数据收发异常情况
*/
/* Includes ----------------------------------------------------------------- */
@@ -11,13 +14,9 @@
#include "error_detect.h"
#define CAN_MOTOR_ENC_RES (8191) /* 电机编码器分辨率 */
#define CAN_MOTOR_CUR_RES (16384)
-
-
#define CAN_PITCH6020_CTRL_ID (0x2ff)
-
#define CAN_G3508_CTRL_ALL_CHASSIS_ID (0x200)
-
-/*CAN2上有6个大疆电机*/
+/*CAN2上预留>4电机*/
#define CAN_G3508_CTRL_ALL_UP_SHOOT_ID (0x1ff)
#define CAN_G3508_CTRL_ALL_UP_Dribble_ID (0x200)
@@ -57,20 +56,33 @@ static void CAN_DJIMotor_Decode(CAN_MotorFeedback_t *feedback,
feedback->torque_current =
raw_current * CAN_GM6020_MAX_ABS_CUR / (float)CAN_MOTOR_CUR_RES;
}
-static void CAN_Sick_Receive(CAN_SickFeedback_t *feedback,
+static void CAN_Sick_Receive(CAN_SickFeedback_t *feedback,int id,
const uint8_t *raw) {
if (feedback == NULL || raw == NULL) return;
static uint16_t sick_rec[4];
+ switch (id)
+ {
+ case CAN_SICK_ID_1:
+ feedback->raw_dis[0] = (uint16_t)(raw[0] << 8| raw[1]);
+
+ break ;
+
+ case CAN_SICK_ID_2:
+ feedback->raw_dis[1] = (uint16_t)(raw[0] << 8| raw[1]);
+
+ break ;
+
+ case CAN_SICK_ID_3:
+ feedback->raw_dis[2] = (uint16_t)(raw[0] << 8| raw[1]);
+
+ break ;
+
+ case CAN_SICK_ID_4:
+ feedback->raw_dis[3] = (uint16_t)(raw[0] << 8| raw[1]);
+
+ break ;
+ }
- sick_rec[0] = (uint16_t)(raw[0] << 8 | raw[1]);
- sick_rec[1] = (uint16_t)(raw[2] << 8 | raw[3]);
- sick_rec[2] = (uint16_t)(raw[4] << 8 | raw[5]);
- sick_rec[3] = (uint16_t)(raw[6] << 8 | raw[7]);
-
- feedback ->raw_dis [0]= sick_rec[0];
- feedback ->raw_dis [1]= sick_rec[1];
- feedback ->raw_dis [2]= sick_rec[2];
- feedback ->raw_dis [3]= sick_rec[3];
}
void CAN_Encoder_Decode(CAN_EncoderFeedback_t *feedback,
const uint8_t *raw) {
@@ -282,26 +294,7 @@ void CAN_Encoder_Control(CAN_t *can)
break;
}
return DEVICE_OK;
-}
-
-//用来问答接收来自sick的数据
-void CAN_Sick_Control(CAN_t *can)
-{
- raw_tx.tx_header.StdId = 0x301;
- raw_tx.tx_header.IDE = CAN_ID_STD;
- raw_tx.tx_header.DLC = 0x08;
- raw_tx.tx_header.RTR = CAN_RTR_DATA;//˽ߝ֡
- raw_tx.tx_data[0] = 0x00;
- raw_tx.tx_data[1] = 0x00;
- raw_tx.tx_data[2] = 0x00;
- raw_tx.tx_data[3] = 0x00;
- raw_tx.tx_data[4] = 0x00;
- raw_tx.tx_data[5] = 0x00;
- raw_tx.tx_data[6] = 0x00;
- raw_tx.tx_data[7] = 0x00;
-
- HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(can->param->sick),&raw_tx.tx_header,raw_tx.tx_data,&(can->mailbox.chassis));
-}
+}
int8_t CAN_VESC_Control(int id,CAN_MotorGroup_e group, CAN_Output_t *output,CAN_t *can){
if (output == NULL) return DEVICE_ERR_NULL;
@@ -374,7 +367,19 @@ int8_t CAN_StoreMsg(CAN_t *can, CAN_RawRx_t *can_rx) {
CAN_DJIMotor_Decode(&(can->motor.chassis_motor3508.as_array[index]), can_rx->rx_data);
detect_hook(CHASSIS3508M1_TOE + index);
break;
-
+ case CAN_SICK_ID_1:
+ CAN_Sick_Receive(&(can->sickfed),CAN_SICK_ID_1, can_rx->rx_data);
+ break;
+ case CAN_SICK_ID_2:
+ CAN_Sick_Receive(&(can->sickfed),CAN_SICK_ID_2, can_rx->rx_data);
+ break;
+ case CAN_SICK_ID_3:
+ CAN_Sick_Receive(&(can->sickfed),CAN_SICK_ID_3, can_rx->rx_data);
+ break;
+ case CAN_SICK_ID_4:
+ CAN_Sick_Receive(&(can->sickfed),CAN_SICK_ID_4, can_rx->rx_data);
+
+ break;
default:
break;
@@ -405,9 +410,7 @@ int8_t CAN_StoreMsg(CAN_t *can, CAN_RawRx_t *can_rx) {
CAN_DJIMotor_Decode(&(can->motor.up_shoot_motor3508.as_array[index]), can_rx->rx_data);
break;
- case CAN_SICK_ID:
- CAN_Sick_Receive(&(can->sickfed), can_rx->rx_data);
- break;
+
case CAN_Encoder_ID:
CAN_Encoder_Decode(&(can->Oid),can_rx->rx_data);
can->recive_flag |= 1 << 10;
diff --git a/User/device/can_use.h b/User/device/can_use.h
index 9339e47..82cb896 100644
--- a/User/device/can_use.h
+++ b/User/device/can_use.h
@@ -18,7 +18,10 @@ typedef enum {
CAN_UP_M3508_M5_ID = 0x205, /* 1 */
CAN_UP_M3508_M6_ID = 0x206, /* 2 */
- CAN_SICK_ID=0x305,
+ CAN_SICK_ID_1=0x301,
+ CAN_SICK_ID_2=0x302,
+ CAN_SICK_ID_3=0x303,
+ CAN_SICK_ID_4=0x304,
CAN_Encoder_ID=0x01,
@@ -192,12 +195,10 @@ int8_t CAN_DJIMotor_Control(CAN_MotorGroup_e group,CAN_Output_t *output,CAN_t *c
int8_t CAN_VESC_Control(int id,CAN_MotorGroup_e group, CAN_Output_t *output,CAN_t *can);
-void CAN_Sick_Control(CAN_t *can);
-
void CAN_Encoder_Control(CAN_t *can);
void CAN_Encoder_Decode(CAN_EncoderFeedback_t *feedback,
const uint8_t *raw) ;
-static void CAN_Sick_Receive(CAN_SickFeedback_t *feedback,
+static void CAN_Sick_Receive(CAN_SickFeedback_t *feedback,int id,
const uint8_t *raw) ;
#endif
diff --git a/User/device/cmd.c b/User/device/cmd.c
index c7b9a10..7646fbe 100644
--- a/User/device/cmd.c
+++ b/User/device/cmd.c
@@ -146,7 +146,7 @@ int8_t CMD_DR16(CMD_t *cmd,const CMD_RC_t *rc) {
if(rc->dr16.sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左上,右中,无模式
- if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Chassis_Adjust; //左上,右上,手动调整
+ if(rc->dr16.sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Chassis_Adjust_Sick; //左上,右上,手动调整
if(rc->dr16.res > 3000) cmd ->CMD_mode =UP_Adjust;
}
@@ -204,10 +204,10 @@ int8_t CMD_LD(CMD_t *cmd,const CMD_RC_t *rc){
}
else if(cmd ->CMD_CtrlType ==RCcontrol){
/*手动下的*/
- if(rc->LD.key_G ==CMD_SW_DOWN ) cmd ->CMD_mode=Dribble ;
+ if(rc->LD.key_G ==CMD_SW_DOWN ) cmd ->CMD_mode=Normal ;
else if(rc->LD.key_G ==CMD_SW_UP) cmd ->CMD_mode =Pitch;
else if(rc->LD .key_H==CMD_SW_UP) cmd ->CMD_mode =UP_Adjust;
- else if(rc->LD.key_C == CMD_SW_UP) cmd->CMD_mode =Chassis_Adjust;
+ else if(rc->LD.key_C == CMD_SW_UP) cmd->CMD_mode =Chassis_Adjust_Sick;
else cmd ->CMD_mode =Normal;
}
}
diff --git a/User/device/cmd.h b/User/device/cmd.h
index 6e7df12..d48c436 100644
--- a/User/device/cmd.h
+++ b/User/device/cmd.h
@@ -28,9 +28,11 @@ typedef enum{
AUTO_MID360_Adjust,//雷达调整
UP_Adjust,//上层调整
- Chassis_Adjust,
+ Chassis_Adjust_Sick,
+
+ PassBall,
- Dribble , //运球
+
Pitch, //投篮,底盘锁定
diff --git a/User/device/nuc.c b/User/device/nuc.c
index a1c723f..27eda9c 100644
--- a/User/device/nuc.c
+++ b/User/device/nuc.c
@@ -7,7 +7,7 @@ static volatile uint32_t drop_message = 0;
static osThreadId_t thread_alert;
uint8_t nucbuf[31];
-static char SendBuffer[19];
+ char SendBuffer[7];
static void NUC_IdleCallback(void) {
@@ -33,22 +33,22 @@ int8_t NUC_StartSending(fp32 *data) {
union
{
- float x[4];
- char data[16];
+ float x[1];
+ char data[4];
}instance;
- for (int i = 0; i < 4; i++) {
- instance.x[i] = data[i];
- }
+// for (int i = 0; i < 1; i++) {
+ instance.x[0] = data[0];
+// }
- SendBuffer[0] = 0xFC; //发送ID
+ SendBuffer[0] = 0xFC; //帧头
SendBuffer[1] = 0x01; //控制帧
- for(int i = 2; i < 18; i++)
+ for(int i = 2; i < 6; i++)
{
SendBuffer[i] = instance.data[i-2];
}
- SendBuffer[18] = 0xFD; //结束符
+ SendBuffer[6] = 0xFD; //帧尾
if (HAL_UART_Transmit_DMA(BSP_UART_GetHandle(BSP_UART_NUC),
(uint8_t *)SendBuffer,
@@ -146,6 +146,15 @@ int8_t NUC_RawParse(CMD_NUC_t *n){
n->MID360.angle = instance.x[4];//
n->MID360.flag = nucbuf[23];//
+
+
+
+
+
+
+
+
+
break;
diff --git a/User/device/rc.c b/User/device/rc.c
index 84c5658..89066fa 100644
--- a/User/device/rc.c
+++ b/User/device/rc.c
@@ -1,5 +1,9 @@
/*
- DR16接收机
+ 遥控
+ dr16:dbus 乐迪:s-ubs
+ dr16掉线不输出信号,可以使用超时检测方式判断掉线
+ 即RC_SBUS_WaitDmaCplt
+ 乐迪掉线依然有信号输出,只是部分通道变为特定值,无法使用以上方式
*/
diff --git a/User/task/nuc_task.c b/User/task/nuc_task.c
index 94de5f9..54c5af5 100644
--- a/User/task/nuc_task.c
+++ b/User/task/nuc_task.c
@@ -14,7 +14,7 @@ NUC_send_t NUC_send;
#endif
fp32 send[4]={11.0f,45.0,1.f,4.0f};
-
+int a=0;
void Task_nuc(void *argument){
(void)argument; /**/
@@ -33,6 +33,7 @@ void Task_nuc(void *argument){
task_runtime.last_up_time.nuc= tick;
#endif
+ a++;
NUC_StartReceiving();
NUC_StartSending(NUC_send.send);
// NUC_StartSending (send);
diff --git a/User/task/rc_task.c b/User/task/rc_task.c
index 15586ef..f6d978e 100644
--- a/User/task/rc_task.c
+++ b/User/task/rc_task.c
@@ -33,7 +33,7 @@ static LD_Data_t LD;
* \brief dr16接收机
*
* \param argument 未使用
- */int aaaaaaaaaaaaaaaaaaa=0;
+ */
void Task_rc(void *argument) {
(void)argument; /* 未使用,消除警告 */
const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_RC;
@@ -48,7 +48,6 @@ void Task_rc(void *argument) {
#endif
/* 开启DMA */
RC_StartDmaRecv();
-aaaaaaaaaaaaaaaaaaa++;
if (RC_WaitDmaCplt(30)) {
RC_ParseRC(&dr16,&LD_raw,&LD, &cmd_rc);