diff --git a/Core/Inc/stm32f4xx_it.h b/Core/Inc/stm32f4xx_it.h
index 2c650e5..de1767c 100644
--- a/Core/Inc/stm32f4xx_it.h
+++ b/Core/Inc/stm32f4xx_it.h
@@ -69,6 +69,7 @@ void CAN2_RX0_IRQHandler(void);
void CAN2_RX1_IRQHandler(void);
void OTG_FS_IRQHandler(void);
void DMA2_Stream5_IRQHandler(void);
+void DMA2_Stream6_IRQHandler(void);
void DMA2_Stream7_IRQHandler(void);
void USART6_IRQHandler(void);
/* USER CODE BEGIN EFP */
diff --git a/Core/Src/dma.c b/Core/Src/dma.c
index 4c8e202..16a09df 100644
--- a/Core/Src/dma.c
+++ b/Core/Src/dma.c
@@ -59,6 +59,9 @@ void MX_DMA_Init(void)
/* DMA2_Stream5_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn);
+ /* DMA2_Stream6_IRQn interrupt configuration */
+ HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 5, 0);
+ HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn);
/* DMA2_Stream7_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);
diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c
index 05c6ecb..c681352 100644
--- a/Core/Src/stm32f4xx_it.c
+++ b/Core/Src/stm32f4xx_it.c
@@ -69,6 +69,7 @@ extern DMA_HandleTypeDef hdma_usart1_tx;
extern DMA_HandleTypeDef hdma_usart1_rx;
extern DMA_HandleTypeDef hdma_usart3_rx;
extern DMA_HandleTypeDef hdma_usart6_rx;
+extern DMA_HandleTypeDef hdma_usart6_tx;
extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart6;
/* USER CODE BEGIN EV */
@@ -418,6 +419,20 @@ void DMA2_Stream5_IRQHandler(void)
/* USER CODE END DMA2_Stream5_IRQn 1 */
}
+/**
+ * @brief This function handles DMA2 stream6 global interrupt.
+ */
+void DMA2_Stream6_IRQHandler(void)
+{
+ /* USER CODE BEGIN DMA2_Stream6_IRQn 0 */
+
+ /* USER CODE END DMA2_Stream6_IRQn 0 */
+ HAL_DMA_IRQHandler(&hdma_usart6_tx);
+ /* USER CODE BEGIN DMA2_Stream6_IRQn 1 */
+
+ /* USER CODE END DMA2_Stream6_IRQn 1 */
+}
+
/**
* @brief This function handles DMA2 stream7 global interrupt.
*/
diff --git a/Core/Src/usart.c b/Core/Src/usart.c
index 82d84f0..f133fad 100644
--- a/Core/Src/usart.c
+++ b/Core/Src/usart.c
@@ -31,6 +31,7 @@ DMA_HandleTypeDef hdma_usart1_tx;
DMA_HandleTypeDef hdma_usart1_rx;
DMA_HandleTypeDef hdma_usart3_rx;
DMA_HandleTypeDef hdma_usart6_rx;
+DMA_HandleTypeDef hdma_usart6_tx;
/* USART1 init function */
@@ -103,7 +104,7 @@ void MX_USART6_UART_Init(void)
/* USER CODE END USART6_Init 1 */
huart6.Instance = USART6;
- huart6.Init.BaudRate = 115200;
+ huart6.Init.BaudRate = 4000000;
huart6.Init.WordLength = UART_WORDLENGTH_8B;
huart6.Init.StopBits = UART_STOPBITS_1;
huart6.Init.Parity = UART_PARITY_NONE;
@@ -278,6 +279,24 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart6_rx);
+ /* USART6_TX Init */
+ hdma_usart6_tx.Instance = DMA2_Stream6;
+ hdma_usart6_tx.Init.Channel = DMA_CHANNEL_5;
+ hdma_usart6_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_usart6_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_usart6_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_usart6_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+ hdma_usart6_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+ hdma_usart6_tx.Init.Mode = DMA_NORMAL;
+ hdma_usart6_tx.Init.Priority = DMA_PRIORITY_LOW;
+ hdma_usart6_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
+ if (HAL_DMA_Init(&hdma_usart6_tx) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart6_tx);
+
/* USART6 interrupt Init */
HAL_NVIC_SetPriority(USART6_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USART6_IRQn);
@@ -352,6 +371,7 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
/* USART6 DMA DeInit */
HAL_DMA_DeInit(uartHandle->hdmarx);
+ HAL_DMA_DeInit(uartHandle->hdmatx);
/* USART6 interrupt Deinit */
HAL_NVIC_DisableIRQ(USART6_IRQn);
diff --git a/MDK-ARM/R2.uvoptx b/MDK-ARM/R2.uvoptx
index b9480f8..7c29790 100644
--- a/MDK-ARM/R2.uvoptx
+++ b/MDK-ARM/R2.uvoptx
@@ -165,6 +165,101 @@
1
dr16,0x0A
+
+ 3
+ 1
+ UP_t,0x0A
+
+
+ 4
+ 1
+ UP,0x0A
+
+
+ 5
+ 1
+ can,0x0A
+
+
+ 6
+ 1
+ up_cmd,0x0A
+
+
+ 7
+ 1
+ rc_ctrl
+
+
+ 8
+ 1
+ up_cmd
+
+
+ 9
+ 1
+ cmd,0x0A
+
+
+ 10
+ 1
+ ctrl,0x0A
+
+
+ 11
+ 1
+ ctrl_up,0x0A
+
+
+ 12
+ 1
+ task_runtime,0x0A
+
+
+ 13
+ 1
+ can,0x0A
+
+
+ 14
+ 1
+ can_rx,0x0A
+
+
+ 15
+ 1
+ can_out,0x0A
+
+
+ 16
+ 1
+ gcan
+
+
+ 17
+ 1
+ raw_tx,0x0A
+
+
+ 18
+ 1
+ raw_rx2,0x0A
+
+
+ 19
+ 1
+ can_rx,0x0A
+
+
+ 20
+ 1
+ can_out
+
+
+ 21
+ 1
+ UP_CAN_out,0x0A
+
0
@@ -252,7 +347,7 @@
Application/User/Core
- 0
+ 1
0
0
0
diff --git a/MDK-ARM/R2/R2.axf b/MDK-ARM/R2/R2.axf
new file mode 100644
index 0000000..3d40118
Binary files /dev/null and b/MDK-ARM/R2/R2.axf differ
diff --git a/R2.ioc b/R2.ioc
index 85412d8..1e268a9 100644
--- a/R2.ioc
+++ b/R2.ioc
@@ -28,7 +28,8 @@ Dma.Request2=USART3_RX
Dma.Request3=USART6_RX
Dma.Request4=USART1_TX
Dma.Request5=USART1_RX
-Dma.RequestsNb=6
+Dma.Request6=USART6_TX
+Dma.RequestsNb=7
Dma.SPI1_RX.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.SPI1_RX.0.FIFOMode=DMA_FIFOMODE_DISABLE
Dma.SPI1_RX.0.Instance=DMA2_Stream2
@@ -89,6 +90,16 @@ Dma.USART6_RX.3.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART6_RX.3.PeriphInc=DMA_PINC_DISABLE
Dma.USART6_RX.3.Priority=DMA_PRIORITY_VERY_HIGH
Dma.USART6_RX.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
+Dma.USART6_TX.6.Direction=DMA_MEMORY_TO_PERIPH
+Dma.USART6_TX.6.FIFOMode=DMA_FIFOMODE_DISABLE
+Dma.USART6_TX.6.Instance=DMA2_Stream6
+Dma.USART6_TX.6.MemDataAlignment=DMA_MDATAALIGN_BYTE
+Dma.USART6_TX.6.MemInc=DMA_MINC_ENABLE
+Dma.USART6_TX.6.Mode=DMA_NORMAL
+Dma.USART6_TX.6.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
+Dma.USART6_TX.6.PeriphInc=DMA_PINC_DISABLE
+Dma.USART6_TX.6.Priority=DMA_PRIORITY_LOW
+Dma.USART6_TX.6.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
FREERTOS.INCLUDE_pcTaskGetTaskName=1
FREERTOS.INCLUDE_uxTaskGetStackHighWaterMark2=1
FREERTOS.INCLUDE_vTaskCleanUpResources=1
@@ -177,6 +188,7 @@ NVIC.DMA2_Stream1_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DMA2_Stream2_IRQn=true\:5\:0\:true\:false\:true\:false\:false\:true\:true
NVIC.DMA2_Stream3_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DMA2_Stream5_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
+NVIC.DMA2_Stream6_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DMA2_Stream7_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.EXTI0_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
diff --git a/User/Module/Chassis.c b/User/Module/Chassis.c
index 1ed3fe0..8d720c2 100644
--- a/User/Module/Chassis.c
+++ b/User/Module/Chassis.c
@@ -21,10 +21,10 @@
static int8_t Chassis_SetCtrl(Chassis_t *c,CMD_t *ctrl){
if (c == NULL) return CHASSIS_ERR_NULL; /*主结构体不能为空 */
- if (ctrl->CMD_CtrlType== c->ctrl && ctrl->CMD_mode == c->mode) return CHASSIS_OK; /*模式未改变直接返回*/
+ if (ctrl->CMD_CtrlType== c->chassis_ctrl.ctrl && ctrl->CMD_mode == c->chassis_ctrl.mode) return CHASSIS_OK; /*模式未改变直接返回*/
//此处源代码处做了pid的reset 待添加
- c->ctrl =ctrl->CMD_CtrlType ;
- c->mode =ctrl->CMD_mode ;
+ c->chassis_ctrl.ctrl =ctrl->CMD_CtrlType ;
+ c->chassis_ctrl.mode =ctrl->CMD_mode ;
return CHASSIS_OK;
} //设置控制模式
@@ -37,8 +37,8 @@ int8_t Chassis_UpdateFeedback(Chassis_t *c, const CAN_t *can) {
if (can == NULL) return CHASSIS_ERR_NULL;
for (uint8_t i = 0; i < 4; i++)
{
- c->motorfeedback.rotor_rpm3508[i] = can->motor.motor3508.as_array[i].rotor_speed;
- c->motorfeedback.rotor_current3508[i] = can->motor.motor3508.as_array[i].torque_current;
+ c->motorfeedback.rotor_rpm3508[i] = can->motor.chassis_motor3508.as_array[i].rotor_speed;
+ c->motorfeedback.rotor_current3508[i] = can->motor.chassis_motor3508.as_array[i].torque_current;
}
@@ -124,26 +124,28 @@ int8_t Chassis_Control(Chassis_t *c,CMD_t *ctrl,CAN_Output_t *out)
//此处对imu加滤波做修正
c->pos088.bmi088.filtered_gyro.z =LowPassFilter2p_Apply(&(c->filled[0]),c->pos088.bmi088.gyro.z);
- switch (c->ctrl)
+ switch (c->chassis_ctrl .ctrl)
{
- case RCcontrol: //手动控制
+ case RCcontrol: //手动控制
/*
在cmd里对数据进行处理 包括方向和油门
6000为全向轮的倍率,遥控器坐标系和机器人坐标系不同*/
+ if(c->chassis_ctrl .mode != Pitch){
c->move_vec.Vw = ctrl->Vw*6000;
c->move_vec.Vx = ctrl->Vy*6000;
c->move_vec.Vy = ctrl->Vx*6000;
+ }
break;
case AUTO : //在自动模式下
- switch(c->mode ){
+ switch(c->chassis_ctrl.mode ){
- case AUTO_NAVI: //自动雷达
+ case AUTO_NAVI: //自动雷达
// //这套是全向轮的方向,一定要注意这里的xy方向
c->move_vec.Vw =ctrl->cmd_MID360 .posw *1000 ;
c->move_vec.Vy =-ctrl->cmd_MID360.posy *1000 ;
@@ -210,6 +212,7 @@ int8_t Chassis_Control(Chassis_t *c,CMD_t *ctrl,CAN_Output_t *out)
}
+
//电机速度限幅
abs_limit_fp(&c->move_vec.Vx,6000.0f);
diff --git a/User/Module/Chassis.h b/User/Module/Chassis.h
index 138cde6..31a6dd8 100644
--- a/User/Module/Chassis.h
+++ b/User/Module/Chassis.h
@@ -118,9 +118,12 @@ typedef struct{
const Chassis_Param_t *param; //一些固定的参数
ChassisImu_t pos088; //088的实时姿态
+ struct{
+
CMD_CtrlType_t ctrl;
- CMD_mode_t mode;
-
+ CMD_mode_t mode;
+
+ }chassis_ctrl;
ChassisMove_Vec move_vec; //由控制任务决定
struct{
diff --git a/User/Module/config.c b/User/Module/config.c
index b4acbaf..8be6541 100644
--- a/User/Module/config.c
+++ b/User/Module/config.c
@@ -124,6 +124,8 @@ static const ConfigParam_t param ={
.chassis5065 = BSP_CAN_1,
.sick = BSP_CAN_2,
+ .encoder=BSP_CAN_2,
+
},
};
diff --git a/User/Module/up.c b/User/Module/up.c
index 43b1812..bcb2dca 100644
--- a/User/Module/up.c
+++ b/User/Module/up.c
@@ -61,8 +61,8 @@ int8_t UP_UpdateFeedback(UP_t *u, const CAN_t *can, CMD_t *c) {
for(int i=0;i<4;i++){
- 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 ;
+ 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);
}
@@ -122,7 +122,6 @@ int8_t VESC_M5065_Control(UP_t *u,fp32 speed)
-
/*go电机控制*/
int8_t GO_SendData(UP_t *u, float pos, float limit)
@@ -130,17 +129,17 @@ int8_t GO_SendData(UP_t *u, float pos, float limit)
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;
+// GO_MotorData_t *GO_calibration;//校准前,原始数据
+ u->motorfeedback .go_data = 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; // 前馈力矩
@@ -181,7 +180,7 @@ int8_t ALL_Motor_Control(UP_t *u,CAN_Output_t *out)
&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 );
+ GO_SendData(u,u->motor_target .go_shoot,5 );
for(int i=0;i<4;i++){
@@ -218,21 +217,54 @@ 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 .Shoot_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);//夹球,0夹1开
+// RELAY2_TOGGLE (0);//球,0接1收
//
break;
case Pitch :
- if (u->PitchContext .PitchState ==PITCH_PREPARE) //首次启动
+ if (u->PitchContext .PitchState ==PITCH_PREPARE)
{
u->PitchContext .PitchState=PITCH_START;//置标志位用于启动投篮
}
-
+ Pitch_Process(u,out,c);
break ;
+ case Dribble:
+ {
+ /*夹球 -> 3508 升起 ,同时go2翻转 -> 到位置后,继电器开,放球,同时3508降,go2翻回->接球,收 */
+
+ if(u->DribbleContext.DribbleState== Dribble_PREPARE){
+
+ u->DribbleContext .DribbleState =STATE_GRAB_BALL;
+ }
+// Dribble_Process(u,out);
+
+
+ }break ;
+ case Dribbl_transfer:
+ break ;
+// Dribbl_transfer_a(u,out);
+ }
+ break;
+
+
+ default:
+ break;
+ }
+
return 0;
@@ -240,9 +272,65 @@ 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;
}
+ switch(u->PitchContext .PitchState){
+
+ case PITCH_START:
+ u->motor_target .go_shoot = u->PitchContext .PitchConfig .go1_release_threshold;
+
+ if(u->motorfeedback .go_data ->Pos < -209){ //检测go位置到达最上面,这里的检测条件可以更改
+ u->motor_target .Shoot_M2006_angle = u->PitchContext .PitchConfig .m2006_trigger_angle ;//设置2006角度,0
+
+ u->PitchContext .PitchState=PITCH_PULL_TRIGGER;
+}//更改标志位
+
+ break ;
+ case PITCH_PULL_TRIGGER:
+
+
+ if(u->motorfeedback .DJmotor_feedback [0].total_angle >-1) //当2006的总角度小于1,可以认为已经勾上,误差为1
+ {
+ u->motor_target .go_shoot = go1_position;//go下拉
+ u->motor_target .Pitch_M2006_angle = M2006_Screw_position;//丝杠上的2006
+ go1_position = go1_position + c->Vx ;
+ M2006_Screw_position=M2006_Screw_position+ c->Vy;
+
+
+ }
+
+ break ;
+
+
+
+
+ }
+
+return 0;
+
+}
@@ -251,3 +339,130 @@ 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降
+////
+//// 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 cc81c4f..54ce955 100644
--- a/User/Module/up.h
+++ b/User/Module/up.h
@@ -138,7 +138,7 @@ typedef struct
fp32 orig_angle;
fp32 last_angle;
int32_t round_cnt;
- uint16_t init_cnt;
+ int init_cnt;
fp32 total_angle;
}DJmotor_feedback_t;
@@ -228,6 +228,7 @@ 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 Pitch_Process(UP_t *u, CAN_Output_t *out,CMD_t *c);
#endif
diff --git a/User/device/GO_M8010_6_Driver.c b/User/device/GO_M8010_6_Driver.c
index 626c84b..3138f39 100644
--- a/User/device/GO_M8010_6_Driver.c
+++ b/User/device/GO_M8010_6_Driver.c
@@ -102,7 +102,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;
}
diff --git a/User/device/GO_M8010_6_Driver.h b/User/device/GO_M8010_6_Driver.h
index d6b418e..15ffbdc 100644
--- a/User/device/GO_M8010_6_Driver.h
+++ b/User/device/GO_M8010_6_Driver.h
@@ -107,10 +107,12 @@ 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 );
+
+
#endif /*__GO_M8010_6_H */
diff --git a/User/device/can_use.c b/User/device/can_use.c
index 5d48677..1d22015 100644
--- a/User/device/can_use.c
+++ b/User/device/can_use.c
@@ -30,9 +30,11 @@
#define CAN_M3508_MAX_ABS_CUR (20)
#define CAN_M2006_MAX_ABS_CUR (10)
-static CAN_RawRx_t raw_rx1;//原始的can数据
-static CAN_RawRx_t raw_rx2;
-CAN_RawTx_t raw_tx;
+#define CAN_ENCODER_RESOLUTION (32768) //欧艾迪编码器分辨率
+
+ CAN_RawRx_t raw_rx1;//原始的can数据
+ CAN_RawRx_t raw_rx2;
+ CAN_RawTx_t raw_tx;
/*用于can原始数据,传入消息队列*/
@@ -48,7 +50,7 @@ static void CAN_DJIMotor_Decode(CAN_MotorFeedback_t *feedback,
feedback->rotor_speed = (int16_t)((raw[2] << 8) | raw[3]);
feedback->temp = raw[6];
- feedback->rotor_ecd = raw_ecd / (float)CAN_MOTOR_ENC_RES * 360.0f;
+ feedback->rotor_ecd = raw_ecd ;
feedback->torque_current =
raw_current * CAN_GM6020_MAX_ABS_CUR / (float)CAN_MOTOR_CUR_RES;
}
@@ -61,6 +63,22 @@ static void CAN_Sick_Receive(CAN_SickFeedback_t *feedback,
feedback->raw_dis[3]= (uint16_t)((raw[6] << 8) | raw[7]);
}
+void CAN_Encoder_Decode(CAN_EncoderFeedback_t *feedback,
+ const uint8_t *raw) {
+ if (feedback == NULL || raw == NULL) return;
+ switch(raw[1])//判断编码器id
+ {
+ case 0x01:
+
+ switch(raw[2])//判断指令id
+ {
+ case 0x01:
+ feedback->ecd =raw[3]|raw[4]<<8|raw[5]<<16|raw[6]<<24;//接收编码器值
+ feedback->angle=feedback->ecd*360/CAN_ENCODER_RESOLUTION;
+ break;
+ }
+ }
+}
static void CAN_VescMotor_Decode_1(CAN_MotorFeedback_t *feedback,
const uint8_t *raw)
{
@@ -89,6 +107,7 @@ static void CAN_CAN1RxFifoMsgPendingCallback(void) {
HAL_CAN_GetRxMessage(BSP_CAN_GetHandle(BSP_CAN_1), CAN_RX_FIFO0,
&raw_rx1.rx_header, raw_rx1.rx_data);
raw_rx1.hcan =BSP_CAN_GetHandle(BSP_CAN_1);
+
osMessageQueuePut(gcan->msgq_raw, &raw_rx1, 0, 0);
}
@@ -104,7 +123,7 @@ static void CAN_CAN2RxFifoMsgPendingCallback(void) {
int8_t CAN_Init(CAN_t *can, const CAN_Params_t *param) {
if (can == NULL) return DEVICE_ERR_NULL;
- can->msgq_raw = osMessageQueueNew(32, sizeof(CAN_RawRx_t), NULL);
+ can->msgq_raw = osMessageQueueNew(12, sizeof(CAN_RawRx_t), NULL);
can->param = param;
@@ -141,7 +160,21 @@ int8_t CAN_Init(CAN_t *can, const CAN_Params_t *param) {
gcan = can;
return DEVICE_OK;
}
+//用来问答接收来自欧艾迪编码器的数据
+void CAN_Encoder_Control(CAN_t *can)
+{
+ raw_tx.tx_header.StdId = 0x01;
+ raw_tx.tx_header.IDE = CAN_ID_STD;
+ raw_tx.tx_header.DLC = 4;
+ raw_tx.tx_header.RTR = CAN_RTR_DATA;//˽ߝ֡
+ raw_tx.tx_data[0] = 0x04;
+ raw_tx.tx_data[1] = 0x01;
+ raw_tx.tx_data[2] = 0x01;
+ raw_tx.tx_data[3] = 0x00;
+
+ 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,
CAN_t *can) {
if (output == NULL) return DEVICE_ERR_NULL;
@@ -363,7 +396,7 @@ int8_t CAN_StoreMsg(CAN_t *can, CAN_RawRx_t *can_rx) {
// 存储消息到对应的电机结构体中
index = can_rx->rx_header.StdId - CAN_CHASSIS_M3508_M1_ID;
can->recive_flag |= 1 << (index);
- CAN_DJIMotor_Decode(&(can->motor.motor3508.as_array[index]), can_rx->rx_data);
+ CAN_DJIMotor_Decode(&(can->motor.chassis5065.as_array[index]), can_rx->rx_data);
detect_hook(CHASSIS3508M1_TOE + index);
break;
@@ -389,7 +422,7 @@ int8_t CAN_StoreMsg(CAN_t *can, CAN_RawRx_t *can_rx) {
// 存储消息到对应的电机结构体中
index = can_rx->rx_header.StdId - CAN_UP_M3508_M1_ID;
can->recive_flag |= 1 << (index);
- CAN_DJIMotor_Decode(&(can->motor.motor3508.as_array[index]), can_rx->rx_data);
+ CAN_DJIMotor_Decode(&(can->motor.up_motor3508.as_array[index]), can_rx->rx_data);
detect_hook(CHASSIS3508M1_TOE + index);
break;
@@ -397,6 +430,9 @@ int8_t CAN_StoreMsg(CAN_t *can, CAN_RawRx_t *can_rx) {
// 存储消息到sickfed结构体中
CAN_Sick_Receive(&(can->sickfed), can_rx->rx_data);
break;
+ case CAN_Encoder_ID:
+ CAN_Encoder_Decode(&(can->Oid),can_rx->rx_data);
+ break ;
default:
break;
diff --git a/User/device/can_use.h b/User/device/can_use.h
index 182db2b..e6f1993 100644
--- a/User/device/can_use.h
+++ b/User/device/can_use.h
@@ -23,6 +23,8 @@ typedef enum {
CAN_SICK_ID=0x301,
+ CAN_Encoder_ID=0x01,
+
CAN_G6020_Pitch =0x209,
// CAN_VESC5065_M1 =0x211, //vesc的数据指令使用了扩展id,[0:7]为驱动器id,[8:15]为帧类型
@@ -111,6 +113,8 @@ typedef struct {
BSP_CAN_t motor_UP3508;
BSP_CAN_t pitch6020;
BSP_CAN_t sick;
+ BSP_CAN_t encoder;
+
} CAN_Params_t;
@@ -127,6 +131,13 @@ typedef struct {
uint16_t raw_dis[4];
int changed_dis[4];
}CAN_SickFeedback_t;
+/* encoder编码器反馈信息 */
+typedef struct {
+
+ uint32_t ecd;
+ float angle;
+
+}CAN_EncoderFeedback_t;
typedef union {
CAN_MotorFeedback_t as_array[4];
@@ -152,7 +163,8 @@ typedef union {
typedef struct {
CAN_ChassisMotor_t chassis6020;
CAN_ChassisMotor_t chassis5065;
- CAN_ChassisMotor_t motor3508;
+ CAN_ChassisMotor_t up_motor3508;
+ CAN_ChassisMotor_t chassis_motor3508;
CAN_ChassisMotor_t pit6020;
} CAN_Motor_t;
@@ -161,6 +173,7 @@ typedef struct {
uint32_t recive_flag;
CAN_Motor_t motor;
+ CAN_EncoderFeedback_t Oid;
CAN_SickFeedback_t sickfed;
const CAN_Params_t *param;
struct {
@@ -186,5 +199,9 @@ int8_t CAN_VESC_Control(int id,CAN_MotorGroup_e group, CAN_Output_t *output,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) ;
#endif
diff --git a/User/device/cmd.c b/User/device/cmd.c
index 0a1f114..d73c2f7 100644
--- a/User/device/cmd.c
+++ b/User/device/cmd.c
@@ -162,25 +162,23 @@ int8_t CMD_ParseRC(CMD_t *cmd,const CMD_RC_t *rc) {
else if(rc->sw_l==CMD_SW_UP)
{
cmd ->CMD_CtrlType =RCcontrol;
- if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_mode =Pitch; //左上,右上,投篮,设置好的
- if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左上,右中,无模式
- if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Pitch_HAND; //左上,右上,手动调整
+ if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_mode =Pitch; //左上,右上,投篮,设置好的
+
+ if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左上,右中,无模式
+
+ if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =Normal; //左上,右上,手动调整
}
else if(rc->sw_l==CMD_SW_MID)
{
-
- if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_CtrlType =MID_NAVI;; //左中,右上,雷达
- if(rc->sw_r ==CMD_SW_MID)
- {
- cmd ->CMD_CtrlType =RCcontrol;
- cmd ->CMD_mode =Normal; //左中,右中,无模式
- }
- if(rc->sw_r ==CMD_SW_DOWN)
- {
- cmd ->CMD_mode =Normal; //左中,右下,无模式
- cmd ->CMD_CtrlType =RCcontrol;
- }
+
+ cmd ->CMD_CtrlType =AUTO;
+ if(rc->sw_r ==CMD_SW_UP) cmd ->CMD_mode =AUTO_NAVI; //左中,右中,雷达
+
+ if(rc->sw_r ==CMD_SW_MID) cmd ->CMD_mode =Normal; //左中,右中,无模式
+
+ if(rc->sw_r ==CMD_SW_DOWN) cmd ->CMD_mode =AUTO_PICK; //左中,右下,视觉
+
}
else if(rc->sw_l==CMD_SW_DOWN)
{
diff --git a/User/device/cmd.h b/User/device/cmd.h
index 7e80722..986e80d 100644
--- a/User/device/cmd.h
+++ b/User/device/cmd.h
@@ -9,8 +9,6 @@
typedef enum{
RCcontrol,//遥控器控制,左按键上,控制上层
- MID_NAVI,//雷达导航
- PICK_t,
AUTO,
RELAXED,//异常模式
@@ -24,11 +22,10 @@ typedef enum{
AUTO_PICK,
Dribble , //运球
- Pitch, //投篮
- /*视觉辅助下的投篮*/
- Pitch_HAND,
+ Pitch, //投篮,底盘锁定
- Dribbl_transfer
+
+ Dribbl_transfer
}CMD_mode_t;
typedef struct {
uint8_t status_fromnuc;
diff --git a/User/task/can_task.c b/User/task/can_task.c
index d557f43..c21e9cf 100644
--- a/User/task/can_task.c
+++ b/User/task/can_task.c
@@ -43,14 +43,18 @@ const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_CAN;
while (osMessageQueueGet(can.msgq_raw, &can_rx, 0, 0)==osOK)
{
CAN_StoreMsg(&can, &can_rx);
- }
- //一问一答sick数据指令
- CAN_Sick_Control(&can);
+ }
+
+ //一问一答sick数据指令
+// CAN_Sick_Control(&can);
+ CAN_Encoder_Control(&can);
+
/*can设备数据存入队列*/
- osMessageQueueReset(task_runtime.msgq.can.feedback.CAN_feedback );
- osMessageQueuePut(task_runtime.msgq.can.feedback.CAN_feedback , &can, 0, 0);
-
+ osMessageQueueReset(task_runtime.msgq.can.feedback.CHASSIS_CAN_feedback );
+ osMessageQueuePut(task_runtime.msgq.can.feedback.CHASSIS_CAN_feedback , &can, 0, 0);
+ 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) {
@@ -60,7 +64,7 @@ const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_CAN;
&(can_out.motor_CHASSIS3508), 0, 0) == osOK) {
CAN_DJIMotor_Control(CAN_MOTOR_CHASSIS3508,&can_out,&can);
}
- if (osMessageQueueGet(task_runtime.msgq.can.output.chassis3508,
+ if (osMessageQueueGet(task_runtime.msgq.can.output.up3508,
&(can_out.motor_UP3508), 0, 0) == osOK) {
CAN_DJIMotor_Control(CAN_MOTOR_UP3508,&can_out,&can);
}
diff --git a/User/task/chassis_task.c b/User/task/chassis_task.c
index d9f8c87..be1d133 100644
--- a/User/task/chassis_task.c
+++ b/User/task/chassis_task.c
@@ -67,10 +67,11 @@ void Task_Chassis(void *argument)
osMessageQueueGet(task_runtime.msgq.imu.accl, &chassis.pos088.bmi088.accl,NULL, 0);
/*can上设备数据获取*/
- osMessageQueueGet(task_runtime.msgq.can.feedback.CAN_feedback, &can, NULL, 0);
+ osMessageQueueGet(task_runtime.msgq.can.feedback.CHASSIS_CAN_feedback, &can, NULL, 0);
/*底盘控制信息获取,目前dji遥控器*/
- osMessageQueueGet(task_runtime.msgq.cmd.cmd_ctrl_t,&ctrl, NULL, 0);
+
+ osMessageQueueGet(task_runtime.msgq.cmd.CHASSIS_cmd_ctrl_t,&ctrl, NULL, 0);
/*锁定RTOS(实时操作系统)内核,防止任务切换,直到 osKernelUnlock() 被调用*/
osKernelLock();
diff --git a/User/task/cmd_task.c b/User/task/cmd_task.c
index 23df6f0..651baa9 100644
--- a/User/task/cmd_task.c
+++ b/User/task/cmd_task.c
@@ -12,7 +12,6 @@ CMD_NUC_t Nuc;
static CMD_t cmd;
static CMD_RC_t rc_ctrl;
static CMD_NUC_t Nuc;
-static CMD_ACTION_t cmd_ops_out;
#endif
@@ -53,8 +52,10 @@ void Task_cmd(void *argument){
osKernelUnlock(); /* 同上 解锁RTOS内核 */
/*将需要与其他任务共享的数据放到消息队列里 此处主要分享给底盘 后续会添加和上层机构的通信 */
- osMessageQueueReset(task_runtime.msgq.cmd.cmd_ctrl_t);
- osMessageQueuePut(task_runtime.msgq.cmd.cmd_ctrl_t,&cmd,0,0);
+ osMessageQueueReset(task_runtime.msgq.cmd.CHASSIS_cmd_ctrl_t);
+ osMessageQueuePut(task_runtime.msgq.cmd.CHASSIS_cmd_ctrl_t,&cmd,0,0);
+ osMessageQueueReset(task_runtime.msgq.cmd.UP_cmd_ctrl_t);
+ osMessageQueuePut(task_runtime.msgq.cmd.UP_cmd_ctrl_t,&cmd,0,0);
tick += delay_tick; /*计算下一个唤醒时刻*/
osDelayUntil(tick); /*绝对延时 等待下一个唤醒时刻 */
diff --git a/User/task/init.c b/User/task/init.c
index e06a809..7300d1a 100644
--- a/User/task/init.c
+++ b/User/task/init.c
@@ -54,13 +54,15 @@ void Task_Init(void *argument) {
/* 消息队列 */
/* can */
- task_runtime.msgq.can.feedback.CAN_feedback =
- osMessageQueueNew(2u, sizeof(CAN_t), NULL);
-
-
+
+ task_runtime.msgq.can.feedback.UP_CAN_feedback =
+ osMessageQueueNew(2u, sizeof(CAN_t), NULL);
+ task_runtime.msgq.can.feedback.CHASSIS_CAN_feedback =
+ 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 =
+ osMessageQueueNew(2u, sizeof(CAN_DJIOutput_t), NULL);
task_runtime.msgq.can.output.pitch6020 =
osMessageQueueNew(2u, sizeof(CAN_DJIOutput_t), NULL);
@@ -77,8 +79,12 @@ void Task_Init(void *argument) {
/*cmd */
task_runtime.msgq.cmd.raw.rc =
osMessageQueueNew(3u, sizeof(CMD_RC_t), NULL);
- task_runtime.msgq.cmd.cmd_ctrl_t =
+
+ task_runtime.msgq.cmd.UP_cmd_ctrl_t =
osMessageQueueNew(3u, sizeof(CMD_t), NULL);
+ task_runtime.msgq.cmd.CHASSIS_cmd_ctrl_t =
+ osMessageQueueNew(3u, sizeof(CMD_t), NULL);
+
task_runtime.msgq.cmd.raw.nuc =
osMessageQueueNew(3u,sizeof(CMD_NUC_t), NULL);
diff --git a/User/task/up_task.c b/User/task/up_task.c
index 7769574..506576d 100644
--- a/User/task/up_task.c
+++ b/User/task/up_task.c
@@ -57,16 +57,6 @@ void Task_up(void *argument)
task_runtime.stack_water_mark.up = osThreadGetStackSpace(osThreadGetId());
#endif
UP_UpdateFeedback(&UP, &can,&up_cmd) ;
-// GM6020_control(&UP, 100) ;
-// UP_M3508_speed(&UP, 500);
-
-// UP_angle_control(&UP,0,M2006);
-//
-//
-// VESC_M5065_Control(&UP, 20000);
-
-
-//
UP_control(&UP,&UP_CAN_out,&up_cmd);
// UP.motor_target .go_shoot =aaa;
@@ -89,10 +79,10 @@ void Task_up(void *argument)
osMessageQueueGet(task_runtime.msgq.imu.accl, &UP.pos088.bmi088.accl,NULL, 0);
/*can上设备数据获取*/
- osMessageQueueGet(task_runtime.msgq.can.feedback.CAN_feedback, &can, NULL, 0);
+ osMessageQueueGet(task_runtime.msgq.can.feedback.UP_CAN_feedback, &can, NULL, 0);
- osMessageQueueGet(task_runtime.msgq.cmd .cmd_ctrl_t , &up_cmd, NULL, 0);
-
+ osMessageQueueGet(task_runtime.msgq.cmd.UP_cmd_ctrl_t,&up_cmd, NULL, 0);
+
/*锁定RTOS(实时操作系统)内核,防止任务切换,直到 osKernelUnlock() 被调用*/
osKernelLock();
diff --git a/User/task/user_task.c b/User/task/user_task.c
index bbf54ea..569ce05 100644
--- a/User/task/user_task.c
+++ b/User/task/user_task.c
@@ -7,6 +7,9 @@
对于内存分配的一些理论规则:
此处堆栈存放的都是一些局部变量和全局变量,需要根据线程自身的需求大小进行设定。
+
+ 涉及上下层的消息队列,不使用多个任务读取同一消息队列的方式
+ 建立各自使用的消息队列,避免影响,涉及cmd控制,can消息
*/
/* Includes ----------------------------------------------------------------- */
@@ -30,11 +33,6 @@ const osThreadAttr_t attr_chassis = {
.priority = osPriorityAboveNormal,
.stack_size = 512 * 4,
};
-//const osThreadAttr_t attr_r12ds = {
-// .name = "r12ds",
-// .priority = osPriorityRealtime,
-// .stack_size = 128 * 4,
-//};
const osThreadAttr_t attr_can = {
.name = "can",
diff --git a/User/task/user_task.h b/User/task/user_task.h
index db66cb3..02fdf1a 100644
--- a/User/task/user_task.h
+++ b/User/task/user_task.h
@@ -64,7 +64,13 @@ typedef struct {
}raw;
- osMessageQueueId_t cmd_ctrl_t;
+
+ /*控制分离*/
+ osMessageQueueId_t UP_cmd_ctrl_t;
+ osMessageQueueId_t CHASSIS_cmd_ctrl_t;
+
+
+
osMessageQueueId_t status;
} cmd;
/* can任务放入、读取,电机或电容的输入输出 */
@@ -78,8 +84,12 @@ typedef struct {
} output;
struct {
- osMessageQueueId_t CAN_feedback;//包括底盘,云台6020,3508,5065,sick,can上设备数据
+ /*均包括所有数据,选择调用*/
+ osMessageQueueId_t UP_CAN_feedback;//上层
+ osMessageQueueId_t CHASSIS_CAN_feedback;//底盘
+
} feedback;
+ osMessageQueueId_t msg_raw;
} can;
} msgq;