diff --git a/Core/Inc/FreeRTOSConfig.h b/Core/Inc/FreeRTOSConfig.h
index 19445a7..d9fcec8 100644
--- a/Core/Inc/FreeRTOSConfig.h
+++ b/Core/Inc/FreeRTOSConfig.h
@@ -69,7 +69,7 @@
#define configTICK_RATE_HZ ((TickType_t)1000)
#define configMAX_PRIORITIES ( 56 )
#define configMINIMAL_STACK_SIZE ((uint16_t)128)
-#define configTOTAL_HEAP_SIZE ((size_t)15360)
+#define configTOTAL_HEAP_SIZE ((size_t)0x6000)
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0
diff --git a/MDK-ARM/R2.uvoptx b/MDK-ARM/R2.uvoptx
index 3ee1328..9610097 100644
--- a/MDK-ARM/R2.uvoptx
+++ b/MDK-ARM/R2.uvoptx
@@ -195,6 +195,16 @@
1
cmd_fromnuc
+
+ 9
+ 1
+ up_cmd,0x0A
+
+
+ 10
+ 1
+ can_out
+
0
diff --git a/MDK-ARM/R2/R2.axf b/MDK-ARM/R2/R2.axf
index 5768f97..a717ef1 100644
Binary files a/MDK-ARM/R2/R2.axf and b/MDK-ARM/R2/R2.axf differ
diff --git a/R2.ioc b/R2.ioc
index 1e268a9..730c0b8 100644
--- a/R2.ioc
+++ b/R2.ioc
@@ -107,9 +107,10 @@ FREERTOS.INCLUDE_xEventGroupSetBitFromISR=1
FREERTOS.INCLUDE_xSemaphoreGetMutexHolder=1
FREERTOS.INCLUDE_xTaskAbortDelay=1
FREERTOS.INCLUDE_xTaskGetHandle=1
-FREERTOS.IPParameters=Tasks01,INCLUDE_pcTaskGetTaskName,INCLUDE_xSemaphoreGetMutexHolder,INCLUDE_vTaskCleanUpResources,INCLUDE_xEventGroupSetBitFromISR,INCLUDE_uxTaskGetStackHighWaterMark2,INCLUDE_xTaskGetHandle,INCLUDE_xTaskAbortDelay,configCHECK_FOR_STACK_OVERFLOW
+FREERTOS.IPParameters=Tasks01,INCLUDE_pcTaskGetTaskName,INCLUDE_xSemaphoreGetMutexHolder,INCLUDE_vTaskCleanUpResources,INCLUDE_xEventGroupSetBitFromISR,INCLUDE_uxTaskGetStackHighWaterMark2,INCLUDE_xTaskGetHandle,INCLUDE_xTaskAbortDelay,configCHECK_FOR_STACK_OVERFLOW,configTOTAL_HEAP_SIZE
FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL
FREERTOS.configCHECK_FOR_STACK_OVERFLOW=1
+FREERTOS.configTOTAL_HEAP_SIZE=0x6000
File.Version=6
GPIO.groupedBy=Group By Peripherals
KeepUserPlacement=false
diff --git a/User/Module/Chassis.c b/User/Module/Chassis.c
index f05467b..338b2e3 100644
--- a/User/Module/Chassis.c
+++ b/User/Module/Chassis.c
@@ -42,19 +42,6 @@ int8_t Chassis_UpdateFeedback(Chassis_t *c, const CAN_t *can) {
}
- c->motorfeedback.rotor_pit6020angle = can->motor.pit6020.as_array[0].rotor_ecd;
- c->motorfeedback.rotor_pit6020rpm = can->motor.pit6020.as_array[0].rotor_speed;
-
- c->motorfeedback.rotor_gimbal_yawangle = can->motor.chassis6020.as_array[0].rotor_ecd;
- c->motorfeedback.rotor_gimbal_yawrpm = can->motor.chassis6020.as_array[0].rotor_speed;
-
- c->motorfeedback.rotor_gimbal_pitchangle = can->motor.chassis6020.as_array[1].rotor_ecd;
- c->motorfeedback.rotor_gimbal_pitchrpm = can->motor.chassis6020.as_array[1].rotor_speed;
-
-// c->sick_dis[0] = can->sickfed.raw_dis[0];
-// c->sick_dis[1] = can->sickfed.raw_dis[1];
-// c->sick_dis[2] = can->sickfed.raw_dis[2];
-// c->sick_dis[3] = can->sickfed.raw_dis[3];
return CHASSIS_OK;
}
@@ -98,10 +85,10 @@ int8_t Chassis_init(Chassis_t *c,const Chassis_Param_t *param,float target_freq)
void Chassis_speed_calculate(Chassis_t *c,fp32 Vx,fp32 Vy,fp32 Vw) //底盘逆运动学的解算
{
- c->hopemotorout.OmniSpeedOut[3] = -Vx+Vy+Vw;//右前
- c->hopemotorout.OmniSpeedOut[0] = -Vx-Vy+Vw;//右后
+ c->hopemotorout.OmniSpeedOut[0] = -Vx+Vy+Vw;//右前
+ c->hopemotorout.OmniSpeedOut[1] = -Vx-Vy+Vw;//右后
c->hopemotorout.OmniSpeedOut[2] = Vx-Vy+Vw;//左后
- c->hopemotorout.OmniSpeedOut[1] = Vx+Vy+Vw;//左前
+ c->hopemotorout.OmniSpeedOut[3] = Vx+Vy+Vw;//左前
}
//bool isArrive(fp32 real_pos,fp32 target_pos,fp32 mistake)
@@ -228,11 +215,11 @@ int8_t Chassis_Control(Chassis_t *c,CMD_t *ctrl,CAN_Output_t *out)
//电机速度限幅
- abs_limit_fp(&c->move_vec.Vx,6000.0f);
+ abs_limit_fp(&c->move_vec.Vx,8000.0f);
- abs_limit_fp(&c->move_vec.Vy,6000.0f);
+ abs_limit_fp(&c->move_vec.Vy,8000.0f);
- abs_limit_fp(&c->move_vec.Vw,6000.0f);
+ abs_limit_fp(&c->move_vec.Vw,8000.0f);
Chassis_speed_calculate(c,c->move_vec.Vx,c->move_vec.Vy,c->move_vec.Vw);
diff --git a/User/Module/Chassis.h b/User/Module/Chassis.h
index 31a6dd8..a6c3e11 100644
--- a/User/Module/Chassis.h
+++ b/User/Module/Chassis.h
@@ -58,26 +58,11 @@ typedef struct {
AHRS_Eulr_t imu_eulr;//解算后存放欧拉角(弧度制)
}ChassisImu_t;
-/*底盘的类型*/
-typedef enum {
- CHASSIS_TYPE_MECANUM, /* 麦轮 */
- CHASSIS_TYPE_OMNI_CROSS, /* 全向轮*/
- CHASSIS_TYPE_AGV, /* AGV舵轮 */
-} Chassis_Type_e;
-
-/*底盘的电机轮组*/
-typedef enum {
- DJI_M3508,
- DJI_G6020,
- AGV_Group,
-}Chassis_Motortype_e;
/* 该结构体用于存取固定的一些参数 在config.c中更改后不再变化 */
typedef struct
{
- Chassis_Type_e chassis_type; /* */
- Chassis_Motortype_e motor_type; /**/
/*该部分决定PID的参数整定在config中修改*/
@@ -131,14 +116,6 @@ typedef struct{
fp32 rotor_rpm3508[4];
fp32 rotor_current3508[4];
- fp32 rotor_pit6020angle;
- fp32 rotor_pit6020rpm;
-
- fp32 rotor_gimbal_yawangle;
- fp32 rotor_gimbal_yawrpm;
-
- fp32 rotor_gimbal_pitchangle;
- fp32 rotor_gimbal_pitchrpm;
}motorfeedback;
@@ -154,10 +131,6 @@ typedef struct{
struct
{
fp32 final_3508out[4];
- fp32 final_pitchout;
- fp32 final_gimbal_yawout;
- fp32 final_gimbal_pitchout;
-
}final_out;
struct{
diff --git a/User/Module/config.c b/User/Module/config.c
index 263d6ec..d0e7dd9 100644
--- a/User/Module/config.c
+++ b/User/Module/config.c
@@ -50,6 +50,35 @@ static const ConfigParam_t param ={
.i_limit = 2000.0f,
.out_limit = 3000.0f,
},
+.Pitch_Angle_M2006_speed_param={ //俯仰跑速度环
+ .p = 20.0f,
+ .i = 0.05f,
+ .d = 0.0f,
+ .i_limit = 500.0f,
+ .out_limit = 3000.0f,
+},
+
+.Dribble_M3508_speed_param={ //三摩擦速度环
+ .p = 5.0f,
+ .i = 0.3f,
+ .d = 0.0f,
+ .i_limit = 2000.0f,
+ .out_limit = 3000.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={
@@ -81,6 +110,7 @@ static const ConfigParam_t param ={
.go1_init_position = -50,
.go1_release_threshold =-210,
.m2006_Screw_init=0,
+ .Pitch_angle =57,
},
@@ -113,18 +143,17 @@ static const ConfigParam_t param ={
},
-
+
.can = {
- .pitch6020 = BSP_CAN_1,
.motor_CHASSIS3508 = BSP_CAN_1,
- .motor_UP3508 = BSP_CAN_2,
+ . motor_UP3508_shoot= BSP_CAN_2,
+ .motor_UP3508_Dribble= BSP_CAN_2,
-// .chassis6020 = BSP_CAN_1,//禁用
.chassis5065 = BSP_CAN_1,
.sick = BSP_CAN_2,
- .encoder=BSP_CAN_2,
+ .encoder=BSP_CAN_2,
},
diff --git a/User/Module/up.c b/User/Module/up.c
index 1019da9..568ace0 100644
--- a/User/Module/up.c
+++ b/User/Module/up.c
@@ -11,6 +11,8 @@
#define MOTOR2006_ECD_TO_ANGLE (360.0 / 8191.0 / (GEAR_RATIO_2006)) //2006编码值转轴角度
#define MOTOR3508_ECD_TO_ANGLE (360.0 / 8191.0 / (GEAR_RATIO_3508)) //3508编码值转轴角度
+#define CAN2_G3508_ID (0x200)
+
// 定义继电器控制
#define RELAY1_TOGGLE(state) HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, (state) ? GPIO_PIN_SET : GPIO_PIN_RESET)
@@ -27,9 +29,16 @@ int8_t up_init(UP_t *u,const UP_Param_t *param,float target_freq)
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 .Pitch_Angle_M2006_speed ,PID_POSITION ,&(u->param->Pitch_Angle_M2006_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 .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 ));
+ PID_init (&u->pid .Dribble_M3508_speed ,PID_POSITION ,&(u->param->Dribble_M3508_speed_param ));
+
u->go_cmd =u->param ->go_cmd ;
@@ -62,12 +71,19 @@ int8_t UP_UpdateFeedback(UP_t *u, const CAN_t *can, CMD_t *c) {
u->motorfeedback .Encoder .angle = can ->Oid.angle ;
u->motorfeedback .Encoder .ecd = can ->Oid.ecd ;
- for(int i=0;i<4;i++){
- u->motorfeedback .DJmotor_feedback[i].rpm =can ->motor .up_motor3508 .as_array [i].rotor_speed ;
- u->motorfeedback .DJmotor_feedback[i].ecd =can ->motor .up_motor3508.as_array [i].rotor_ecd ;
- DJ_processdata(&u->motorfeedback .DJmotor_feedback [i], MOTOR2006_ECD_TO_ANGLE);
- }
-
+ for(int i=0;i<4;i++){ //范围0x201--0x204
+ u->motorfeedback .DJmotor_feedback[i].id =i+CAN2_G3508_ID+1;
+ u->motorfeedback .DJmotor_feedback[i].rpm =can ->motor .up_dribble_motor3508 .as_array [i].rotor_speed ;
+ u->motorfeedback .DJmotor_feedback[i].ecd =can ->motor .up_dribble_motor3508.as_array [i].rotor_ecd ;
+ DJ_processdata(&u->motorfeedback .DJmotor_feedback [i], MOTOR3508_ECD_TO_ANGLE);
+ }
+ for(int i=0;i<2;i++){ //范围0x205--0x206
+ u->motorfeedback .DJmotor_feedback[i+4].id =i+CAN2_G3508_ID+4+1;
+ u->motorfeedback .DJmotor_feedback[i+4].rpm =can ->motor .up_shoot_motor3508 .as_array [i].rotor_speed ;
+ u->motorfeedback .DJmotor_feedback[i+4].ecd =can ->motor .up_shoot_motor3508.as_array [i].rotor_ecd ;
+ DJ_processdata(&u->motorfeedback .DJmotor_feedback [i+4], MOTOR2006_ECD_TO_ANGLE);
+ }
+
u->cmd =c;
return 0;
@@ -106,10 +122,17 @@ int8_t DJ_Angle_Control(UP_t *u,int id,DJmotor_feedback_t *f,pid_type_def *Angle
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;
+ u->final_out .DJfinal_out [id-CAN2_G3508_ID-1]=delta_speed;
+ return 0;
+}
+int8_t DJ_Speed_Control(UP_t *u,int id,DJmotor_feedback_t *f,pid_type_def *Speed_pid,fp32 target_speed)
+{
+
+ fp32 delta_speed;
+ delta_speed = PID_calc(Speed_pid , f->rpm , target_speed);
+ u->final_out .DJfinal_out [id-CAN2_G3508_ID-1]=delta_speed;
return 0;
}
-
int8_t VESC_M5065_Control(UP_t *u,fp32 speed)
{
u->motor_target .VESC_5065_M1_rpm =speed;
@@ -174,21 +197,33 @@ 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_Angle_Control(u,1,&u->motorfeedback .DJmotor_feedback[0] ,
+ DJ_Speed_Control(u,0x201,&u->motorfeedback .DJmotor_feedback[0] ,&u->pid .Dribble_M3508_speed,u->motor_target .Dribble_M3508_speed);
+ DJ_Speed_Control(u,0x202,&u->motorfeedback .DJmotor_feedback[1] ,&u->pid .Dribble_M3508_speed,u->motor_target .Dribble_M3508_speed);
+ DJ_Speed_Control(u,0x203,&u->motorfeedback .DJmotor_feedback[2] ,&u->pid .Dribble_M3508_speed,u->motor_target .Dribble_M3508_speed);
+ 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,2,&u->motorfeedback .DJmotor_feedback[1] ,
- &u->pid .Pitch_M2006_angle ,
- &u->pid .Pitch_M2006_speed ,
- u->motor_target .Pitch_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 );
+ u->final_out .DJfinal_out [5]=PID_calc (&(u->pid .Pitch_Angle_M2006_speed ),
+ u->motorfeedback .Encoder.angle,u->motor_target .Shoot_Pitch_angle);
+
GO_SendData(u,u->motor_target .go_shoot,5 );
for(int i=0;i<4;i++){
- out ->motor_UP3508.as_array[i]=u->final_out.DJfinal_out [i] ;
+ out ->motor_UP3508_Dribble.as_array[i]=u->final_out.DJfinal_out [i] ;
}
-
+ for(int i=0;i<2;i++){
+ out ->motor_UP3508_shoot.as_array[i]=u->final_out.DJfinal_out [i+4] ;
+ }
out ->chassis5065 .erpm [0]= u->final_out .final_VESC_5065_M1out ;
out ->chassis5065 .erpm [1]= -u->final_out .final_VESC_5065_M2out ;
@@ -220,6 +255,8 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
is_pitch=0;
}
u->motor_target .Shoot_M2006_angle =u->PitchContext .PitchConfig .m2006_init_angle ;
+ u->motor_target .Shoot_Pitch_angle=u->PitchContext.PitchConfig.Pitch_angle;
+
u->PitchContext .PitchState = PITCH_PREPARE; //状态更新,开始夹球
// /*运球*/
@@ -245,10 +282,11 @@ int8_t UP_control(UP_t *u,CAN_Output_t *out,CMD_t *c)
break ;
case UP_Adjust:
u->PitchContext.PitchConfig.go1_init_position += c->Vx ;
- u->PitchContext.PitchConfig.m2006_Screw_init += c->Vy;
-
+// u->PitchContext.PitchConfig.m2006_Screw_init = c->Vy;
+ u->PitchContext.PitchConfig.Pitch_angle += c->Vy/100;
+
u->motor_target .go_shoot=u->PitchContext.PitchConfig.go1_init_position;
- u->motor_target .Pitch_M2006_angle=u->PitchContext.PitchConfig.m2006_Screw_init;
+// u->motor_target .Pitch_M2006_angle=u->PitchContext.PitchConfig.m2006_Screw_init;
break ;
case Dribble:
{
@@ -342,30 +380,14 @@ int8_t Pitch_Adjust(UP_t *u, CAN_Output_t *out,CMD_t *c)
{
u->PitchContext.PitchConfig.go1_init_position += c->Vx ;
- u->PitchContext.PitchConfig.m2006_Screw_init += c->Vy;
+ u->PitchContext.PitchConfig.Pitch_angle += c->Vy;
+ u->motor_target .Shoot_Pitch_angle=u->PitchContext.PitchConfig.Pitch_angle;
+
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/User/Module/up.h b/User/Module/up.h
index efd0b09..b394340 100644
--- a/User/Module/up.h
+++ b/User/Module/up.h
@@ -56,6 +56,7 @@ typedef struct {
fp32 go1_init_position; // GO电机触发位置,0,初始位置
fp32 go1_release_threshold; // go上升去合并扳机,扳机位置
fp32 m2006_Screw_init;
+ fp32 Pitch_angle;
} PitchConfig_t;
/* 投球控制上下文 */
@@ -122,7 +123,15 @@ typedef struct
pid_param_t Shoot_M2006_angle_param;
pid_param_t Pitch_M2006_speed_param;
- pid_param_t Pitch_M2006_angle_param;
+ 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;//平移用的角度环
+
DribbleConfig_t DribbleConfig_Config;
PitchConfig_t PitchConfig_Config;
@@ -134,7 +143,7 @@ typedef struct
{
fp32 ecd;
fp32 rpm;
-
+ uint8_t id;
fp32 orig_angle;
fp32 last_angle;
int32_t round_cnt;
@@ -151,10 +160,7 @@ typedef struct{
DribbleContext_t DribbleContext;
/*投篮过程*/
PitchContext_t PitchContext;
-
-
- UP_Imu_t pos088;
-
+
CMD_t *cmd;
struct{
@@ -166,15 +172,12 @@ typedef struct{
GO_MotorData_t *go_data;//存放go电机数据
- DJmotor_feedback_t DJmotor_feedback[4];
+ DJmotor_feedback_t DJmotor_feedback[6];
struct {
uint32_t ecd;
float angle;
-
- }Encoder;
-
-
+ }Encoder;
}motorfeedback;
@@ -188,7 +191,10 @@ typedef struct{
fp32 Pitch_M2006_angle;
fp32 go_shoot;
+ fp32 Dribble_M3508_speed;//运球转速
+ fp32 Dribble_translate_M3508_angle;//平移用的3508转动角度
+ fp32 Shoot_Pitch_angle;
}motor_target;
struct{
@@ -203,6 +209,14 @@ typedef struct{
pid_type_def Pitch_M2006_angle;
pid_type_def Pitch_M2006_speed;
+ pid_type_def Pitch_Angle_M2006_speed;
+
+ pid_type_def Dribble_M3508_speed;//三摩擦用的速度环
+
+ pid_type_def Dribble_translate_M3508_speed;//平移用的速度环
+ pid_type_def Dribble_translate_M3508_angle;//平移用的角度环
+
+
}pid;
GO_MotorCmd_t go_cmd;
@@ -212,7 +226,7 @@ typedef struct{
/*经PID计算后的实际发送给电机的实时输出值*/
struct
{
- fp32 DJfinal_out[4];
+ fp32 DJfinal_out[6];
fp32 final_VESC_5065_M1out;
fp32 final_VESC_5065_M2out;
@@ -236,6 +250,8 @@ 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 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 Pitch_Process(UP_t *u, CAN_Output_t *out,CMD_t *c);
diff --git a/User/device/can_use.c b/User/device/can_use.c
index c6e47c2..6ebb56e 100644
--- a/User/device/can_use.c
+++ b/User/device/can_use.c
@@ -12,11 +12,13 @@
#define CAN_MOTOR_CUR_RES (16384)
-//#define CAN_GM6020_CTRL_ID_BASE (0x1ff) //禁用
#define CAN_PITCH6020_CTRL_ID (0x2ff)
#define CAN_G3508_CTRL_ALL_CHASSIS_ID (0x200)
-#define CAN_G3508_CTRL_ALL_UP_ID (0x1ff)
+
+/*CAN2上有6个大疆电机*/
+#define CAN_G3508_CTRL_ALL_UP_SHOOT_ID (0x1ff)
+#define CAN_G3508_CTRL_ALL_UP_Dribble_ID (0x200)
#define CAN_VESC_CTRL_ID_BASE (0x300)
@@ -118,13 +120,12 @@ static void CAN_CAN2RxFifoMsgPendingCallback(void) {
raw_rx2.hcan =BSP_CAN_GetHandle(BSP_CAN_2);
osMessageQueuePut(gcan->msgq_raw, &raw_rx2, 0, 0);
}
-
/* Exported functions ------------------------------------------------------- */
int8_t CAN_Init(CAN_t *can, const CAN_Params_t *param) {
if (can == NULL) return DEVICE_ERR_NULL;
- can->msgq_raw = osMessageQueueNew(12, sizeof(CAN_RawRx_t), NULL);
-
+ can->msgq_raw = osMessageQueueNew(32, sizeof(CAN_RawRx_t), NULL);
+
can->param = param;
CAN_FilterTypeDef can_filter = {0};
@@ -175,42 +176,14 @@ void CAN_Encoder_Control(CAN_t *can)
HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(can->param->encoder),&raw_tx.tx_header,raw_tx.tx_data,&(can->mailbox.up ));
}
-int8_t CAN_DJIMotor_Control(CAN_MotorGroup_e group, CAN_Output_t *output,
+ int8_t CAN_DJIMotor_Control(CAN_MotorGroup_e group, CAN_Output_t *output,
CAN_t *can) {
if (output == NULL) return DEVICE_ERR_NULL;
- int16_t motor1, motor2, motor3, motor4, motor5, motor6, motor7;
+ int16_t motor1, motor2, motor3, motor4;
switch (group) {
-// case CAN_MOTOR_CHASSIS6020: //(总线0x1ff的6020禁用,怕和3508冲突)
-// motor1 =
-// (int16_t)(output->chassis6020.named.m1);
-// motor2 =
-// (int16_t)(output->chassis6020.named.m2);
-// motor3 =
-// (int16_t)(output->chassis6020.named.m3);
-// motor4 =
-// (int16_t)(output->chassis6020.named.m4);
-
-// raw_tx.tx_header.StdId = CAN_GM6020_CTRL_ID_BASE;
-// raw_tx.tx_header.IDE = CAN_ID_STD;
-// raw_tx.tx_header.RTR = CAN_RTR_DATA;
-// raw_tx.tx_header.DLC = CAN_MOTOR_TX_BUF_SIZE;
-
-// raw_tx.tx_data[0] = (uint8_t)((motor1 >> 8) & 0xFF);
-// raw_tx.tx_data[1] = (uint8_t)(motor1 & 0xFF);
-// raw_tx.tx_data[2] = (uint8_t)((motor2 >> 8) & 0xFF);
-// raw_tx.tx_data[3] = (uint8_t)(motor2 & 0xFF);
-// raw_tx.tx_data[4] = (uint8_t)((motor3 >> 8) & 0xFF);
-// raw_tx.tx_data[5] = (uint8_t)(motor3 & 0xFF);
-// raw_tx.tx_data[6] = (uint8_t)((motor4 >> 8) & 0xFF);
-// raw_tx.tx_data[7] = (uint8_t)(motor4 & 0xFF);
-
-// HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(can->param->chassis6020),
-// &raw_tx.tx_header, raw_tx.tx_data,
-// &(can->mailbox.chassis));
-// break;
case CAN_MOTOR_CHASSIS3508:
motor1 =
(int16_t)(output->motor_CHASSIS3508.named.m1);
@@ -239,17 +212,17 @@ int8_t CAN_DJIMotor_Control(CAN_MotorGroup_e group, CAN_Output_t *output,
&raw_tx.tx_header, raw_tx.tx_data,
&(can->mailbox.chassis));
break;
- case CAN_MOTOR_UP3508:
+ case CAN_MOTOR_UP3508_Dribble:
motor1 =
- (int16_t)(output->motor_UP3508.named.m1);
+ (int16_t)(output->motor_UP3508_Dribble.named.m1);
motor2 =
- (int16_t)(output->motor_UP3508.named.m2);
+ (int16_t)(output->motor_UP3508_Dribble.named.m2);
motor3 =
- (int16_t)(output->motor_UP3508.named.m3);
+ (int16_t)(output->motor_UP3508_Dribble.named.m3);
motor4 =
- (int16_t)(output->motor_UP3508.named.m4);
+ (int16_t)(output->motor_UP3508_Dribble.named.m4);
- raw_tx.tx_header.StdId =CAN_G3508_CTRL_ALL_UP_ID;
+ raw_tx.tx_header.StdId =CAN_G3508_CTRL_ALL_UP_Dribble_ID;
raw_tx.tx_header.IDE = CAN_ID_STD;
raw_tx.tx_header.RTR = CAN_RTR_DATA;
raw_tx.tx_header.DLC = CAN_MOTOR_TX_BUF_SIZE;
@@ -263,35 +236,39 @@ int8_t CAN_DJIMotor_Control(CAN_MotorGroup_e group, CAN_Output_t *output,
raw_tx.tx_data[6] = (uint8_t)((motor4 >> 8) & 0xFF);
raw_tx.tx_data[7] = (uint8_t)(motor4 & 0xFF);
- HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(can->param->motor_UP3508),
+ HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(can->param->motor_UP3508_Dribble),
&raw_tx.tx_header, raw_tx.tx_data,
&(can->mailbox.up));
break;
- case CAN_MOTOR_PITCH6020:
- motor5 =
- (int16_t)(output->pitch6020.named.m1);
- motor6 =
- (int16_t)(output->pitch6020.named.m2);
- motor7 =
- (int16_t)(output->pitch6020.named.m3);
- raw_tx.tx_header.StdId = CAN_PITCH6020_CTRL_ID;
+ case CAN_MOTOR_UP3508_SHOOT:
+ motor1 =
+ (int16_t)(output->motor_UP3508_shoot.named.m1);
+ motor2 =
+ (int16_t)(output->motor_UP3508_shoot.named.m2);
+ motor3 =
+ (int16_t)(output->motor_UP3508_shoot.named.m3);
+ motor4 =
+ (int16_t)(output->motor_UP3508_shoot.named.m4);
+
+ raw_tx.tx_header.StdId =CAN_G3508_CTRL_ALL_UP_SHOOT_ID;
raw_tx.tx_header.IDE = CAN_ID_STD;
raw_tx.tx_header.RTR = CAN_RTR_DATA;
raw_tx.tx_header.DLC = CAN_MOTOR_TX_BUF_SIZE;
-
- raw_tx.tx_data[0] = (uint8_t)((motor5 >> 8) & 0xFF);
- raw_tx.tx_data[1] = (uint8_t)(motor5 & 0xFF);
- raw_tx.tx_data[2] = (uint8_t)((motor6 >> 8) & 0xFF);
- raw_tx.tx_data[3] = (uint8_t)(motor6 & 0xFF);
- raw_tx.tx_data[4] = (uint8_t)((motor7 >> 8) & 0xFF);
- raw_tx.tx_data[5] = (uint8_t)(motor7 & 0xFF);
- raw_tx.tx_data[6] = 0;
- raw_tx.tx_data[7] = 0;
-
- HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(can->param->pitch6020),
+
+ raw_tx.tx_data[0] = (uint8_t)((motor1 >> 8) & 0xFF);
+ raw_tx.tx_data[1] = (uint8_t)(motor1 & 0xFF);
+ raw_tx.tx_data[2] = (uint8_t)((motor2 >> 8) & 0xFF);
+ raw_tx.tx_data[3] = (uint8_t)(motor2 & 0xFF);
+ raw_tx.tx_data[4] = (uint8_t)((motor3 >> 8) & 0xFF);
+ raw_tx.tx_data[5] = (uint8_t)(motor3 & 0xFF);
+ raw_tx.tx_data[6] = (uint8_t)((motor4 >> 8) & 0xFF);
+ raw_tx.tx_data[7] = (uint8_t)(motor4 & 0xFF);
+
+ HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(can->param->motor_UP3508_shoot),
&raw_tx.tx_header, raw_tx.tx_data,
- &(can->mailbox.chassis));
- break;
+ &(can->mailbox.up));
+ break;
+
default:
break;
@@ -379,16 +356,6 @@ int8_t CAN_StoreMsg(CAN_t *can, CAN_RawRx_t *can_rx) {
// 处理CAN1消息
if (can_rx->hcan == BSP_CAN_GetHandle(BSP_CAN_1)) {
switch (can_rx->rx_header.StdId) {
- case CAN_G6020_AgvM1:
- case CAN_G6020_AgvM2:
- case CAN_G6020_AgvM3:
- case CAN_G6020_AgvM4:
- // 存储消息到对应的电机结构体中
- index = can_rx->rx_header.StdId - CAN_G6020_AgvM1;
- can->recive_flag |= 1 << (index);
- CAN_DJIMotor_Decode(&(can->motor.chassis6020.as_array[index]), can_rx->rx_data);
- break;
-
case CAN_CHASSIS_M3508_M1_ID:
case CAN_CHASSIS_M3508_M2_ID:
case CAN_CHASSIS_M3508_M3_ID:
@@ -408,30 +375,35 @@ int8_t CAN_StoreMsg(CAN_t *can, CAN_RawRx_t *can_rx) {
// 处理CAN2消息
if (can_rx->hcan == BSP_CAN_GetHandle(BSP_CAN_2)) {
switch (can_rx->rx_header.StdId) {
- case CAN_G6020_Pitch:
- // 存储消息到对应的电机结构体中
- index = can_rx->rx_header.StdId - CAN_G6020_Pitch;
- can->recive_flag |= 1 << (index);
- CAN_DJIMotor_Decode(&(can->motor.pit6020.as_array[index]), can_rx->rx_data);
- detect_hook(PITCH6020_TOE + index);
- break;
case CAN_UP_M3508_M1_ID:
case CAN_UP_M3508_M2_ID:
case CAN_UP_M3508_M3_ID:
case CAN_UP_M3508_M4_ID:
+
// 存储消息到对应的电机结构体中
index = can_rx->rx_header.StdId - CAN_UP_M3508_M1_ID;
- can->recive_flag |= 1 << (index);
- CAN_DJIMotor_Decode(&(can->motor.up_motor3508.as_array[index]), can_rx->rx_data);
+ can->recive_flag |= 1 << ((index+4));
+ CAN_DJIMotor_Decode(&(can->motor.up_dribble_motor3508.as_array[index]), can_rx->rx_data);
detect_hook(CHASSIS3508M1_TOE + index);
break;
+ case CAN_UP_M3508_M5_ID:
+ case CAN_UP_M3508_M6_ID:
+
+
+ // 存储消息到对应的电机结构体中
+ index = can_rx->rx_header.StdId - CAN_UP_M3508_M5_ID;
+ can->recive_flag |= 1 << ((index+8));
+ 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;
+
break ;
default:
diff --git a/User/device/can_use.h b/User/device/can_use.h
index e6f1993..8bdfe47 100644
--- a/User/device/can_use.h
+++ b/User/device/can_use.h
@@ -9,29 +9,19 @@ typedef enum {
CAN_CHASSIS_M3508_M2_ID = 0x202, /* 2 */
CAN_CHASSIS_M3508_M3_ID = 0x203, /* 3 */
CAN_CHASSIS_M3508_M4_ID = 0x204, /* 4 */
+
+ CAN_UP_M3508_M1_ID = 0x201, /* 1 */
+ CAN_UP_M3508_M2_ID = 0x202, /* 2 */
+ CAN_UP_M3508_M3_ID = 0x203, /* 3 */
+ CAN_UP_M3508_M4_ID = 0x204, /* 4 */
- /**/
- CAN_G6020_AgvM1 =0x205,
- CAN_G6020_AgvM2 =0x206,
- CAN_G6020_AgvM3 =0x207,
- CAN_G6020_AgvM4 =0x208,
-
- CAN_UP_M3508_M1_ID = 0x205, /* 1 */
- CAN_UP_M3508_M2_ID = 0x206, /* 2 */
- CAN_UP_M3508_M3_ID = 0x207, /* 3 */
- CAN_UP_M3508_M4_ID = 0x208, /* 4 */
+ CAN_UP_M3508_M5_ID = 0x205, /* 1 */
+ CAN_UP_M3508_M6_ID = 0x206, /* 2 */
CAN_SICK_ID=0x301,
CAN_Encoder_ID=0x01,
- CAN_G6020_Pitch =0x209,
-
- // CAN_VESC5065_M1 =0x211, //vesc的数据指令使用了扩展id,[0:7]为驱动器id,[8:15]为帧类型
- // CAN_VESC5065_M2 =0x212,
- // CAN_VESC5065_M3 =0x213,
- // CAN_VSEC5065_M4 =0x214,
-
CAN_VESC5065_M1_MSG1 =0x90b, //vesc的数据回传使用了扩展id,[0:7]为驱动器id,[8:15]为帧类型
CAN_VESC5065_M2_MSG1 =0x90c,
CAN_VESC5065_M3_MSG1 =0x90d,
@@ -46,10 +36,12 @@ typedef enum {
typedef enum {
- CAN_MOTOR_PITCH6020,
CAN_MOTOR_5065,
CAN_MOTOR_CHASSIS3508,
- CAN_MOTOR_UP3508,
+
+ CAN_MOTOR_UP3508_SHOOT,
+ CAN_MOTOR_UP3508_Dribble,
+
CAN_MOTOR_GROUT_NUM,
} CAN_MotorGroup_e;
@@ -85,11 +77,10 @@ typedef union{
}Vesc_ByteGet;
typedef struct {
-// CAN_DJIOutput_t chassis6020;
CAN_VescOutput_t chassis5065;
CAN_DJIOutput_t motor_CHASSIS3508;
- CAN_DJIOutput_t motor_UP3508;
- CAN_DJIOutput_t pitch6020;
+ CAN_DJIOutput_t motor_UP3508_shoot;
+ CAN_DJIOutput_t motor_UP3508_Dribble;
} CAN_Output_t;
@@ -107,11 +98,12 @@ typedef struct {
} CAN_RawTx_t;
typedef struct {
-// BSP_CAN_t chassis6020;//禁用
BSP_CAN_t chassis5065;
BSP_CAN_t motor_CHASSIS3508;
- BSP_CAN_t motor_UP3508;
- BSP_CAN_t pitch6020;
+ BSP_CAN_t motor_UP3508_shoot;
+ BSP_CAN_t motor_UP3508_Dribble;
+
+
BSP_CAN_t sick;
BSP_CAN_t encoder;
@@ -147,7 +139,7 @@ typedef union {
CAN_MotorFeedback_t m3;
CAN_MotorFeedback_t m4;
} named;
-} CAN_ChassisMotor_t;
+} CAN_Data_Motor_t;
typedef union {
CAN_MotorFeedback_t as_array[4];
@@ -161,11 +153,14 @@ typedef union {
typedef struct {
- CAN_ChassisMotor_t chassis6020;
- CAN_ChassisMotor_t chassis5065;
- CAN_ChassisMotor_t up_motor3508;
- CAN_ChassisMotor_t chassis_motor3508;
- CAN_ChassisMotor_t pit6020;
+ CAN_Data_Motor_t chassis6020;
+ CAN_Data_Motor_t chassis5065;
+ /*1是指用来运球的,2用来扳机和俯仰*/
+ CAN_Data_Motor_t up_shoot_motor3508;
+ CAN_Data_Motor_t up_dribble_motor3508;
+
+ CAN_Data_Motor_t chassis_motor3508;
+ CAN_Data_Motor_t pit6020;
} CAN_Motor_t;
@@ -178,8 +173,7 @@ typedef struct {
const CAN_Params_t *param;
struct {
uint32_t chassis;
- uint32_t up;
-
+ uint32_t up;
} mailbox;
osMessageQueueId_t msgq_raw;
diff --git a/User/task/can_task.c b/User/task/can_task.c
index c21e9cf..fcfc4ca 100644
--- a/User/task/can_task.c
+++ b/User/task/can_task.c
@@ -56,19 +56,20 @@ const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_CAN;
osMessageQueueReset(task_runtime.msgq.can.feedback.UP_CAN_feedback );
osMessageQueuePut(task_runtime.msgq.can.feedback.UP_CAN_feedback , &can, 0, 0);
/*电机控制*/
- if (osMessageQueueGet(task_runtime.msgq.can.output.pitch6020,
- &(can_out.pitch6020),0,0) == osOK) {
- CAN_DJIMotor_Control(CAN_MOTOR_PITCH6020,&can_out,&can);
- }
+ //底盘4个
if (osMessageQueueGet(task_runtime.msgq.can.output.chassis3508,
&(can_out.motor_CHASSIS3508), 0, 0) == osOK) {
CAN_DJIMotor_Control(CAN_MOTOR_CHASSIS3508,&can_out,&can);
}
- if (osMessageQueueGet(task_runtime.msgq.can.output.up3508,
- &(can_out.motor_UP3508), 0, 0) == osOK) {
- CAN_DJIMotor_Control(CAN_MOTOR_UP3508,&can_out,&can);
+ //上层运球4个,发射2个
+ if (osMessageQueueGet(task_runtime.msgq.can.output.up_dribble_3508,
+ &(can_out.motor_UP3508_Dribble), 0, 0) == osOK) {
+ CAN_DJIMotor_Control(CAN_MOTOR_UP3508_Dribble,&can_out,&can);
+ }
+ if (osMessageQueueGet(task_runtime.msgq.can.output.up_shoot_3508,
+ &(can_out.motor_UP3508_shoot), 0, 0) == osOK) {
+ CAN_DJIMotor_Control(CAN_MOTOR_UP3508_SHOOT,&can_out,&can);
}
-
tick += delay_tick; /* 计算下一个唤醒时刻 */
osDelayUntil(tick); /* 运行结束,等待下一个周期唤醒 */
}
diff --git a/User/task/chassis_task.c b/User/task/chassis_task.c
index be1d133..40f6485 100644
--- a/User/task/chassis_task.c
+++ b/User/task/chassis_task.c
@@ -88,12 +88,6 @@ void Task_Chassis(void *argument)
osMessageQueueReset(task_runtime.msgq.can.output.chassis3508);//清空队列
osMessageQueuePut(task_runtime.msgq.can.output.chassis3508, &out.motor_CHASSIS3508, 0, 0); //发送数据
- osMessageQueueReset(task_runtime.msgq.can.output.pitch6020);
- osMessageQueuePut(task_runtime.msgq.can.output.pitch6020, &out.pitch6020, 0, 0);
-
- osMessageQueueReset(task_runtime.msgq.can.output.pitch6020 );
- osMessageQueuePut(task_runtime.msgq.can.output.pitch6020 , &out.pitch6020, 0, 0);
-
vofa_send[0] = chassis.vofa_send[0];
vofa_send[1] = chassis.vofa_send[1];
vofa_send[2] = chassis.vofa_send[2];
diff --git a/User/task/init.c b/User/task/init.c
index e63b787..4f20970 100644
--- a/User/task/init.c
+++ b/User/task/init.c
@@ -59,9 +59,9 @@ void Task_Init(void *argument) {
osMessageQueueNew(2u, sizeof(CAN_t), NULL);
task_runtime.msgq.can.output.chassis3508 =
osMessageQueueNew(2u, sizeof(CAN_DJIOutput_t), NULL);
- task_runtime.msgq.can.output.up3508 =
+ task_runtime.msgq.can.output.up_shoot_3508 =
osMessageQueueNew(2u, sizeof(CAN_DJIOutput_t), NULL);
- task_runtime.msgq.can.output.pitch6020 =
+ task_runtime.msgq.can.output.up_dribble_3508 =
osMessageQueueNew(2u, sizeof(CAN_DJIOutput_t), NULL);
diff --git a/User/task/up_task.c b/User/task/up_task.c
index 506576d..c784f32 100644
--- a/User/task/up_task.c
+++ b/User/task/up_task.c
@@ -71,13 +71,6 @@ void Task_up(void *argument)
osDelay(1);
-
- /*imu数据获取*/
- osMessageQueueGet(task_runtime.msgq.imu.eulr, &UP.pos088.imu_eulr, NULL, 0);
-
- osMessageQueueGet(task_runtime.msgq.imu.gyro, &UP.pos088.bmi088.gyro,NULL, 0);
-
- osMessageQueueGet(task_runtime.msgq.imu.accl, &UP.pos088.bmi088.accl,NULL, 0);
/*can上设备数据获取*/
osMessageQueueGet(task_runtime.msgq.can.feedback.UP_CAN_feedback, &can, NULL, 0);
@@ -91,8 +84,11 @@ void Task_up(void *argument)
- osMessageQueueReset(task_runtime.msgq.can.output.up3508 );//清空队列
- osMessageQueuePut(task_runtime.msgq.can.output.up3508, &UP_CAN_out.motor_UP3508 , 0, 0); //发送数据
+ osMessageQueueReset(task_runtime.msgq.can.output.up_dribble_3508 );//运球
+ osMessageQueuePut(task_runtime.msgq.can.output.up_dribble_3508, &UP_CAN_out.motor_UP3508_Dribble , 0, 0);
+ osMessageQueueReset(task_runtime.msgq.can.output.up_shoot_3508 );//发射
+ osMessageQueuePut(task_runtime.msgq.can.output.up_shoot_3508, &UP_CAN_out.motor_UP3508_shoot , 0, 0);
+
osMessageQueuePut(task_runtime.msgq.can.output.shoot5065 ,&UP_CAN_out.chassis5065, 0, 0);
diff --git a/User/task/user_task.h b/User/task/user_task.h
index 2108081..928f2ef 100644
--- a/User/task/user_task.h
+++ b/User/task/user_task.h
@@ -78,9 +78,8 @@ typedef struct {
osMessageQueueId_t shoot5065;
osMessageQueueId_t chassis3508;
- osMessageQueueId_t pitch6020;
- osMessageQueueId_t up3508;
-
+ osMessageQueueId_t up_dribble_3508;
+ osMessageQueueId_t up_shoot_3508;
} output;
struct {
/*均包括所有数据,选择调用*/