diff --git a/MDK-ARM/.vscode/keil-assistant.log b/MDK-ARM/.vscode/keil-assistant.log index 3322765..1a2d8ef 100644 --- a/MDK-ARM/.vscode/keil-assistant.log +++ b/MDK-ARM/.vscode/keil-assistant.log @@ -36,3 +36,7 @@ [info] Log at : 2025/6/17|19:06:14|GMT+0800 +[info] Log at : 2025/6/19|13:29:28|GMT+0800 + +[info] Log at : 2025/6/19|17:34:46|GMT+0800 + diff --git a/MDK-ARM/.vscode/uv4.log b/MDK-ARM/.vscode/uv4.log index fe4818c..f0584ac 100644 --- a/MDK-ARM/.vscode/uv4.log +++ b/MDK-ARM/.vscode/uv4.log @@ -1,10 +1,4 @@ *** Using Compiler 'V5.06 update 7 (build 960)', folder: 'D:\keil\ARM\ARMCC\Bin' Build target 'R1' -compiling shoot.cpp... -compiling ballTask.cpp... -compiling ball.cpp... -linking... -Program Size: Code=30080 RO-data=1828 RW-data=268 ZI-data=32660 -FromELF: creating hex file... "R1\R1.axf" - 0 Error(s), 0 Warning(s). -Build Time Elapsed: 00:00:07 +Build Time Elapsed: 00:00:01 diff --git a/MDK-ARM/.vscode/uv4.log.lock b/MDK-ARM/.vscode/uv4.log.lock index ab2e63f..0c8da1b 100644 --- a/MDK-ARM/.vscode/uv4.log.lock +++ b/MDK-ARM/.vscode/uv4.log.lock @@ -1 +1 @@ -2025/6/16 19:22:49 \ No newline at end of file +2025/6/18 17:18:51 \ No newline at end of file diff --git a/MDK-ARM/R1.uvoptx b/MDK-ARM/R1.uvoptx index 630d47e..b25b103 100644 --- a/MDK-ARM/R1.uvoptx +++ b/MDK-ARM/R1.uvoptx @@ -193,12 +193,22 @@ 7 1 - aaa,0x0A + abc,0x0A 8 1 - wzcsb,0x0A + ball_state,0x0A + + + 9 + 1 + triggerCount,0x0A + + + 10 + 1 + last_ball_state,0x0A diff --git a/MDK-ARM/README.md b/MDK-ARM/README.md new file mode 100644 index 0000000..5264b48 --- /dev/null +++ b/MDK-ARM/README.md @@ -0,0 +1,25 @@ +# R1_up + +r1上层 + +## 外设 + ++ CAN1 + + 扳机2006 id:0x201 ++ CAN2 + + 小米电机 id:1 ++ UART + + uart1 波特率4000000 id:2 + + uart6 nuc + + uart3 遥控器接收 ++ GPIO + + PI6运球光电 + + PE13 爪气缸 + + PE14 砸气缸 + +## 遥控器 + +## 待解决 + ++ 用了将运球和伸缩绑定到一起 ++ 串口收数加个滤波 diff --git a/User/module/ball.cpp b/User/module/ball.cpp index 46c1f7f..17ade79 100644 --- a/User/module/ball.cpp +++ b/User/module/ball.cpp @@ -12,13 +12,13 @@ extern int key; //伸缩 #define M_SPEED 4000 #define I_ANGLE1 180 -#define I_ANGLE2 -75 +#define I_ANGLE2 -73.5 #define O_ANGLE1 340 -#define O_ANGLE2 -240 +#define O_ANGLE2 -239 -const fp32 Ball:: Extend_speed_PID[3] = { 40, 0.0, 0.1}; -const fp32 Ball:: Extend_angle_PID[3]= { 25, 0.1, 0}; +const fp32 Ball:: Extend_speed_PID[3] = { 50, 0.0, 0.1}; +const fp32 Ball:: Extend_angle_PID[3]= { 50, 0.3, 0}; //PE11 气缸 @@ -33,11 +33,11 @@ Ball ::Ball() Extern_Motor[0]->type = GM6020; Extern_Motor[1]->type = GM6020; - PID_init(&extend_speed_pid[0],PID_POSITION,Extend_speed_PID,10000, 2000); + PID_init(&extend_speed_pid[0],PID_POSITION,Extend_speed_PID,20000, 2000); PID_init(&extend_angle_pid[0],PID_POSITION,Extend_angle_PID,20000, 1000); - PID_init(&extend_speed_pid[1],PID_POSITION,Extend_speed_PID,10000, 2000); - PID_init(&extend_angle_pid[1],PID_POSITION,Extend_angle_PID,20000, 1000); + PID_init(&extend_speed_pid[1],PID_POSITION,Extend_speed_PID,15000, 5000); + PID_init(&extend_angle_pid[1],PID_POSITION,Extend_angle_PID,15000, 5000); e_result[0] = 0; e_result[1] = 0; @@ -127,7 +127,7 @@ void Ball::ballDown(void) void Ball::ball_control() { - ball_state = HAL_GPIO_ReadPin(up_ball_GPIO_Port, up_ball_Pin); // 读取光电状态(有球 0,无球 1) + ball_state = HAL_GPIO_ReadPin(up_ball_GPIO_Port, up_ball_Pin); // 读取光电状态(有球 1,无球 0) Move_Extend(); @@ -145,11 +145,11 @@ void Ball::ball_control() break; case UP2: - ballHadling(); + ballDown(); break; case DOWN2: - ballDown(); + ballHadling(); break; @@ -181,7 +181,7 @@ void Ball::ballHadling(void) case BALL_IDLE: HAL_GPIO_WritePin(PAW_GPIO_Port, PAW_Pin, GPIO_PIN_RESET); //确保爪气缸关闭 HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 - if (key > 0 ||rc_key == UP2) // 检测按键是否被按下 + if (key > 0 ||rc_key == DOWN2) // 检测按键是否被按下 { key = 0; // 重置按键状态 triggerCount = 0; // 重置触发计数 @@ -224,7 +224,7 @@ void Ball::ballHadling(void) case BALL_CLOSE: if (triggerCount == 2) // 确保是第二次触发 { - osDelay(100); // 延时去抖 + osDelay(50); HAL_GPIO_WritePin(PAW_GPIO_Port, PAW_Pin, GPIO_PIN_RESET); // 闭合气缸爪子 currentState1 = BALL_FINISH; // 切换到反转状态 } diff --git a/User/module/shoot.cpp b/User/module/shoot.cpp index ff5f0c9..bd3e98b 100644 --- a/User/module/shoot.cpp +++ b/User/module/shoot.cpp @@ -20,8 +20,9 @@ NUC_t nuc_v; //B键 sw[3]👆 200 开 👇1800 关 //左旋钮 sw[4] 👈 200 👉1800 -const fp32 Shoot:: M2006_speed_PID[3] = {5, 0, 0}; -const fp32 Shoot:: M2006_angle_PID[3] = { 25, 0, 0.1}; +//尽量别动这组pid +const fp32 Shoot:: M2006_speed_PID[3] = {5, 0, 0.01}; +const fp32 Shoot:: M2006_angle_PID[3] = { 25, 0.1, 0}; #define INIT_POS -130 #define TOP_POS -210 @@ -38,8 +39,8 @@ Shoot::Shoot() //扳机初始化 trigger_Motor= get_motor_point(0);//id 201 trigger_Motor->type=M2006; - PID_init(&speed_pid,PID_POSITION,M2006_speed_PID,3000, 2000);//pid初始化 - PID_init(&angle_pid,PID_POSITION,M2006_angle_PID,3000, 2000);//pid初始化 + PID_init(&speed_pid,PID_POSITION,M2006_speed_PID,5000, 2000);//pid初始化 + PID_init(&angle_pid,PID_POSITION,M2006_angle_PID,5000, 2000);//pid初始化 t_speedSet = 0; result = 0; @@ -174,12 +175,11 @@ void Shoot::shoot_control() { switch (mode_key) { case VSION: + fire_pos = distance; // 视觉拟合的力 switch (rc_key) { case DOWN1: - control_pos = INIT_POS; // 默认中间挡位位置 - //fire_pos = control_pos + knob_increment; // 根据旋钮值调整发射位置 - fire_pos = distance; // 视觉拟合的力 + control_pos = INIT_POS; // 默认中间挡位位置 go1.Pos = fire_pos; // 设置蓄力电机位置 t_posSet = Tigger_ZERO; // 扳机松开 @@ -209,12 +209,15 @@ void Shoot::shoot_control() { } break; case TEST: + //实时可调蓄力位置 + fire_pos = INIT_POS + knob_increment; // 根据旋钮值调整发射位置 + switch (rc_key) { case DOWN1: control_pos = INIT_POS; // 默认中间挡位位置 //fire_pos = control_pos + knob_increment; // 根据旋钮值调整发射位置 - fire_pos = control_pos + knob_increment; // 根据旋钮值调整发射位置 + //fire_pos = control_pos + knob_increment; // 根据旋钮值调整发射位置 go1.Pos = fire_pos; // 设置蓄力电机位置 t_posSet = Tigger_ZERO; // 扳机松开 @@ -288,27 +291,12 @@ void Shoot :: shoot_Current() if (feedback.fd_gopos >= fire_pos - GO_ERROR && feedback.fd_gopos <= fire_pos + GO_ERROR) { BSP_Buzzer_Start(); BSP_Buzzer_Set(1,5000); - // see_you_again(); //currentState = SHOOT_WAIT; // 等待发射信号 //在拨杆切换时触发了 } } break; - // case SHOOT_WAIT: - // // 等待发射信号 - // if (trigger_key == SHOOT) { - // currentState = SHOOT_FIRE; // 切换到发射状态 - // } - // break; - // case SHOOT_FIRE: - // // 发射逻辑 - // t_posSet = Tigger_ZERO; // 扳机扣动 - // if (t_posSet <= 50) { // 假设250度为发射完成角度 - // currentState = SHOOT_IDLE; // 切换到空闲状态 - // is_hooked = false; // 重置钩子状态 - // } - // break; default: currentState = SHOOT_IDLE; // 默认回到空闲状态 @@ -319,10 +307,17 @@ void Shoot :: shoot_Current() void Shoot::RemoveError() { currentState = SHOOT_IDLE; control_pos = TOP_POS; - go1.Pos = control_pos; - if(feedback.fd_gopos >= control_pos - 0.5f && feedback.fd_gopos <= control_pos + 0.5f) + if (feedback.fd_gopos >= control_pos - 0.5f&& feedback.fd_gopos<= control_pos + 0.5f) { t_posSet = Tigger_ZERO; is_hooked = false; } + if(trigger_Motor->total_angle>=Tigger_ZERO-10) + { + //认为完全松开 + control_pos=INIT_POS; + + } + + go1.Pos = control_pos; } diff --git a/User/task/ballTask.cpp b/User/task/ballTask.cpp index a66feb4..7bf6427 100644 --- a/User/task/ballTask.cpp +++ b/User/task/ballTask.cpp @@ -34,6 +34,7 @@ void FunctionBall(void *argument) ball.ball_control(); // 控制球的动作 + tick += delay_tick; /* 计算下一个唤醒时刻 */ osDelayUntil(tick);