diff --git a/MDK-ARM/R2.uvoptx b/MDK-ARM/R2.uvoptx
index 551071d..55731e3 100644
--- a/MDK-ARM/R2.uvoptx
+++ b/MDK-ARM/R2.uvoptx
@@ -240,6 +240,11 @@
1
count
+
+ 17
+ 1
+ raw_rx1,0x0A
+
0
diff --git a/MDK-ARM/R2/R2.axf b/MDK-ARM/R2/R2.axf
index acdf706..5c9f8b8 100644
Binary files a/MDK-ARM/R2/R2.axf and b/MDK-ARM/R2/R2.axf differ
diff --git a/User/Algorithm/user_math.c b/User/Algorithm/user_math.c
index c2b6843..ccce2e5 100644
--- a/User/Algorithm/user_math.c
+++ b/User/Algorithm/user_math.c
@@ -372,4 +372,23 @@ void normalize_vector(double x, double y, double *out_x, double *out_y) {
}
bool is_reached(float current, float target, float mistake) {
return fabs(current - target) < mistake;
+}
+bool is_reached_multiple(float current1, float current2, float current3, float target1, float target2, float target3, float mistake, int threshold) {
+ static int count = 0; // 满足条件的计数
+
+ if (count >= threshold) {
+ count=0;//重置
+ return true; // 如果已经满足条件,返回 1
+
+ }
+
+ // 判断三个值是否都满足条件
+ bool all_reached = (fabs(current1 - target1) < mistake) &&
+ (fabs(current2 - target2) < mistake) &&
+ (fabs(current3 - target3) < mistake);
+
+ if (all_reached) {
+ count++; // 所有条件都满足,计数加 1
+ }
+ return false; // 未满足条件达到阈值,返回 0
}
\ No newline at end of file
diff --git a/User/Algorithm/user_math.h b/User/Algorithm/user_math.h
index ad77fba..dd4d8ab 100644
--- a/User/Algorithm/user_math.h
+++ b/User/Algorithm/user_math.h
@@ -160,6 +160,9 @@ uint8_t average(uint8_t arr[], uint8_t n);
int abs_value(int num);
float expo_map(float value, float expo_factor) ;
int read_flag_state(uint8_t flag) ;
+
void normalize_vector(double x, double y, double *out_x, double *out_y) ;
bool is_reached(float current, float target, float mistake) ;
+bool is_reached_multiple(float current1, float current2, float current3, float target1, float target2, float target3, float mistake, int threshold) ;
+
#endif
diff --git a/User/Module/Chassis.c b/User/Module/Chassis.c
index 3be8a8e..bbcc4ec 100644
--- a/User/Module/Chassis.c
+++ b/User/Module/Chassis.c
@@ -88,10 +88,15 @@ void Chassis_speed_calculate(Chassis_t *c,fp32 Vx,fp32 Vy,fp32 Vw) //底盘逆
normalize_vector(Vx,Vy,&Nor_Vx,&Nor_Vy);
- c->hopemotorout.OmniSpeedOut[0] = -Nor_Vx+Nor_Vy+Vw + c->pos088 .bmi088.gyro.z;//右前
- c->hopemotorout.OmniSpeedOut[1] = -Nor_Vx-Nor_Vy+Vw + c->pos088 .bmi088.gyro.z;//右后
- c->hopemotorout.OmniSpeedOut[2] = Nor_Vx-Nor_Vy+Vw + c->pos088 .bmi088.gyro.z;//左后
- c->hopemotorout.OmniSpeedOut[3] = Nor_Vx+Nor_Vy+Vw + c->pos088 .bmi088.gyro.z;//左前
+// c->hopemotorout.OmniSpeedOut[0] = -Nor_Vx+Nor_Vy+Vw + c->pos088 .bmi088.gyro.z;//右前
+// c->hopemotorout.OmniSpeedOut[1] = -Nor_Vx-Nor_Vy+Vw + c->pos088 .bmi088.gyro.z;//右后
+// c->hopemotorout.OmniSpeedOut[2] = Nor_Vx-Nor_Vy+Vw + c->pos088 .bmi088.gyro.z;//左后
+// c->hopemotorout.OmniSpeedOut[3] = Nor_Vx+Nor_Vy+Vw + c->pos088 .bmi088.gyro.z;//左前
+ c->hopemotorout.OmniSpeedOut[0] = -Nor_Vx+Nor_Vy+Vw ;//右前
+ c->hopemotorout.OmniSpeedOut[1] = -Nor_Vx-Nor_Vy+Vw ;//右后
+ c->hopemotorout.OmniSpeedOut[2] = Nor_Vx-Nor_Vy+Vw ;//左后
+ c->hopemotorout.OmniSpeedOut[3] = Nor_Vx+Nor_Vy+Vw ;//左前
+
}
diff --git a/User/Module/config.c b/User/Module/config.c
index 466d4f8..82ef92b 100644
--- a/User/Module/config.c
+++ b/User/Module/config.c
@@ -99,8 +99,8 @@ static const ConfigParam_t param ={
.dribble_flag=0,
.m3508_init_angle = 50,
.m3508_translate_angle = -930,
- .m3508_dribble_Reverse_speed=-3000,
- . m3508_dribble_speed= 4500, // 转动速度
+ .m3508_dribble_Reverse_speed=-3500,
+ . m3508_dribble_speed= 4000, // 转动速度
.m3508_dribble_init_speed=0,
.light_3508_flag=0,//3508平移处的光电,0初始,1到位置
diff --git a/User/Module/up.c b/User/Module/up.c
index 2bd22fa..ceaeddf 100644
--- a/User/Module/up.c
+++ b/User/Module/up.c
@@ -25,7 +25,6 @@
// 定义继电器控制
#define RELAY1_TOGGLE(state) HAL_GPIO_WritePin(GPIOE, RELAY_Pin, (state) ? GPIO_PIN_SET : GPIO_PIN_RESET)
- int count = 0; // 满足条件的计数
int8_t up_init(UP_t *u,const UP_Param_t *param,float target_freq)
{
@@ -206,9 +205,9 @@ 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);
- DJ_Speed_Control(u,0x202,&u->motorfeedback .DJmotor_feedback[1] ,&u->pid .Dribble_M3508_speed[1],-u->motor_target .Dribble_M3508_speed);
- DJ_Speed_Control(u,0x203,&u->motorfeedback .DJmotor_feedback[2] ,&u->pid .Dribble_M3508_speed[2],-u->motor_target .Dribble_M3508_speed);
+ 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 ,
@@ -271,17 +270,18 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
is_pitch=0;
} //让初始go位置只读一次,后面按调整模式更改的来,后面稳定了之后,可以跟随调整模式下一块删
u->motor_target .Shoot_M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ;
-
+ u->motor_target .Dribble_translate_M3508_angle =u->DribbleContext .DribbleConfig.m3508_translate_angle;//平行移动
u->PitchContext .PitchState = PITCH_PREPARE; //状态更新,开始夹球
/*运球*/
RELAY1_TOGGLE(0);//关闭气缸
- u->motor_target.Dribble_M3508_speed=0;
+ for(int i=0;i<3;i++){
+ u->motor_target.Dribble_M3508_speed[i]=0;
+ }
u->motor_target .Dribble_translate_M3508_angle =u->DribbleContext .DribbleConfig .m3508_init_angle;
u->DribbleContext .DribbleState = DRIBBLE_PREPARE; //重置最初状态
- count = 0 ;
break;
case Pitch :
@@ -384,11 +384,11 @@ return 0;
int8_t Dribble_Process(UP_t *u, CAN_Output_t *out)
{
-
+ static int common_speed_flag=0;//是否共速
+
switch (u->DribbleContext.DribbleState) {
case DRIBBLE_TRANSLATE:
- u->motor_target .Dribble_translate_M3508_angle =u->DribbleContext .DribbleConfig.m3508_translate_angle;//平行移动
if(is_reached(u->motorfeedback.DJmotor_feedback[3].total_angle ,u->DribbleContext .DribbleConfig.m3508_translate_angle,1.0f))
{
u->DribbleContext .DribbleState=DRIBBLE_PROCESS_DOWN;//到达位置后,转移状态
@@ -396,16 +396,27 @@ int8_t Dribble_Process(UP_t *u, CAN_Output_t *out)
break;
case DRIBBLE_PROCESS_DOWN:
- u->motor_target.Dribble_M3508_speed=u->DribbleContext .DribbleConfig.m3508_dribble_speed;
+ u->motor_target.Dribble_M3508_speed[0]=u->DribbleContext .DribbleConfig.m3508_dribble_speed;
+ u->motor_target.Dribble_M3508_speed[1]=-u->DribbleContext .DribbleConfig.m3508_dribble_speed;
+ u->motor_target.Dribble_M3508_speed[2]=-u->DribbleContext .DribbleConfig.m3508_dribble_speed;
+
if(is_reached_multiple(u->motorfeedback .DJmotor_feedback [0].rpm,
u->motorfeedback .DJmotor_feedback [1].rpm,
u->motorfeedback .DJmotor_feedback [2].rpm,
- u->DribbleContext .DribbleConfig.m3508_dribble_speed,50.0f,50)
+ u->motor_target.Dribble_M3508_speed [0],
+ u->motor_target.Dribble_M3508_speed [1],
+ u->motor_target.Dribble_M3508_speed[2],
+ 50.0f,50)
) {
RELAY1_TOGGLE(1); //速度达到后打开气缸
-
+ common_speed_flag =1;
+ }
+ if(common_speed_flag){
if(u->DribbleContext .DribbleConfig .light_ball_flag == 1){//球下落检测,反转
- u->motor_target.Dribble_M3508_speed=u->DribbleContext .DribbleConfig.m3508_dribble_Reverse_speed;
+ u->motor_target.Dribble_M3508_speed[0]=u->DribbleContext .DribbleConfig.m3508_dribble_Reverse_speed;
+ u->motor_target.Dribble_M3508_speed[1]=-u->DribbleContext .DribbleConfig.m3508_dribble_Reverse_speed;
+ u->motor_target.Dribble_M3508_speed[2]=-u->DribbleContext .DribbleConfig.m3508_dribble_Reverse_speed;
+
u->DribbleContext .DribbleState=DRIBBLE_PROCESS_UP;
}
@@ -427,7 +438,10 @@ int8_t Dribble_Process(UP_t *u, CAN_Output_t *out)
}
break ;
case DRIBBLE_DONE:
- u->motor_target.Dribble_M3508_speed=u->DribbleContext .DribbleConfig.m3508_dribble_init_speed ;//三摩擦速度归0
+ for(int i=0;i<3;i++){
+ u->motor_target.Dribble_M3508_speed[i]=u->DribbleContext .DribbleConfig.m3508_dribble_init_speed ;//三摩擦速度归0
+ }
+
/*标志位清零*/
u->DribbleContext.DribbleConfig.light_ball_flag=0;
u->DribbleContext.DribbleConfig.light_3508_flag=0;
@@ -440,27 +454,5 @@ int8_t Dribble_Process(UP_t *u, CAN_Output_t *out)
}
return 0;
}
-bool is_reached_multiple(float current1, float current2, float current3, float target, float mistake, int threshold) {
-// static bool reached = false; // 是否已经满足条件
- if (count >=50) {
- return true; // 如果已经满足条件,始终返回 1
- }
-
- // 判断三个值是否都满足条件
- bool all_reached = (fabs(current1 - target) < mistake) &&
- (fabs(current2 -( -target)) < mistake) &&
- (fabs(current3 - ( -target)) < mistake);
-
- if (all_reached) {
- count++; // 所有条件都满足,计数加 1
- if (count >= threshold) {
- return true;
- }
- } else {
- count = 0; // 如果有一个不满足条件,计数清零
- }
-
- return false; // 未满足条件达到阈值,返回 0
-}
diff --git a/User/Module/up.h b/User/Module/up.h
index 120dec9..f06865c 100644
--- a/User/Module/up.h
+++ b/User/Module/up.h
@@ -199,10 +199,11 @@ typedef struct{
fp32 Pitch_M2006_angle;
fp32 go_shoot;
- fp32 Dribble_M3508_speed;//运球转速
+ fp32 Dribble_M3508_speed[3];//运球转速
fp32 Dribble_translate_M3508_angle;//平移用的3508转动角度
fp32 Shoot_Pitch_angle;
+
}motor_target;
struct{
@@ -263,6 +264,5 @@ int8_t DJ_Speed_Control(UP_t *u,int id,DJmotor_feedback_t *f,pid_type_def *Speed
int8_t Dribble_Process(UP_t *u, CAN_Output_t *out);
int8_t Pitch_Process(UP_t *u, CAN_Output_t *out,CMD_t *c);
-bool is_reached_multiple(float current1, float current2, float current3, float target, float mistake, int threshold) ;
#endif
diff --git a/User/device/can_use.c b/User/device/can_use.c
index 357db27..4010af2 100644
--- a/User/device/can_use.c
+++ b/User/device/can_use.c
@@ -56,14 +56,31 @@ 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,uint16_t id,
const uint8_t *raw) {
- if (feedback == NULL || raw == NULL) return;
- feedback->raw_dis[0] = (uint16_t)((raw[0] << 8) | raw[1]);
- feedback->raw_dis[1] = (uint16_t)((raw[2] << 8) | raw[3]);
- feedback->raw_dis[2] = (uint16_t)((raw[4] << 8) | raw[5]);
- feedback->raw_dis[3]= (uint16_t)((raw[6] << 8) | raw[7]);
-
+ if (feedback == NULL || raw == NULL) return;
+ 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 ;
+ }
}
void CAN_Encoder_Decode(CAN_EncoderFeedback_t *feedback,
const uint8_t *raw) {
@@ -366,7 +383,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;
}
@@ -396,10 +425,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:
- // 存储消息到sickfed结构体中
- 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 8bdfe47..066ded2 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=0x301,
+ CAN_SICK_ID_1=0x301,
+ CAN_SICK_ID_2=0x302,
+ CAN_SICK_ID_3=0x303,
+ CAN_SICK_ID_4=0x304,
CAN_Encoder_ID=0x01,
@@ -121,7 +124,7 @@ typedef struct {
/* sick反馈信息 */
typedef struct {
uint16_t raw_dis[4];
- int changed_dis[4];
+
}CAN_SickFeedback_t;
/* encoder编码器反馈信息 */
typedef struct {
@@ -197,5 +200,6 @@ 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,uint16_t id,
+ const uint8_t *raw) ;
#endif