diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 5cce73e..dcafb1f 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -79,6 +79,9 @@ void Error_Handler(void); #define CLOSE_GPIO_Port GPIOE #define DOWN_Pin GPIO_PIN_11 #define DOWN_GPIO_Port GPIOE +#define TEST_Pin GPIO_PIN_12 +#define TEST_GPIO_Port GPIOB +#define TEST_EXTI_IRQn EXTI15_10_IRQn /* USER CODE BEGIN Private defines */ diff --git a/Core/Inc/stm32f4xx_it.h b/Core/Inc/stm32f4xx_it.h index ffcab28..fd66d53 100644 --- a/Core/Inc/stm32f4xx_it.h +++ b/Core/Inc/stm32f4xx_it.h @@ -60,6 +60,7 @@ void EXTI9_5_IRQHandler(void); void TIM1_UP_TIM10_IRQHandler(void); void USART1_IRQHandler(void); void USART3_IRQHandler(void); +void EXTI15_10_IRQHandler(void); void DMA2_Stream1_IRQHandler(void); void DMA2_Stream2_IRQHandler(void); void DMA2_Stream3_IRQHandler(void); diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 9724fd8..a121508 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -93,6 +93,12 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + /*Configure GPIO pin : TEST_Pin */ + GPIO_InitStruct.Pin = TEST_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(TEST_GPIO_Port, &GPIO_InitStruct); + /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); @@ -100,6 +106,9 @@ void MX_GPIO_Init(void) HAL_NVIC_SetPriority(EXTI9_5_IRQn, 5, 0); HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); + HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); + } /* USER CODE BEGIN 2 */ diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c index 0e4a454..99c1020 100644 --- a/Core/Src/stm32f4xx_it.c +++ b/Core/Src/stm32f4xx_it.c @@ -292,6 +292,20 @@ void USART1_IRQHandler(void) // /* USER CODE END USART3_IRQn 1 */ //} +/** + * @brief This function handles EXTI line[15:10] interrupts. + */ +void EXTI15_10_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI15_10_IRQn 0 */ + + /* USER CODE END EXTI15_10_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(TEST_Pin); + /* USER CODE BEGIN EXTI15_10_IRQn 1 */ + + /* USER CODE END EXTI15_10_IRQn 1 */ +} + /** * @brief This function handles DMA2 stream1 global interrupt. */ diff --git a/MDK-ARM/.vscode/c_cpp_properties.json b/MDK-ARM/.vscode/c_cpp_properties.json index 05c8383..a97c0f7 100644 --- a/MDK-ARM/.vscode/c_cpp_properties.json +++ b/MDK-ARM/.vscode/c_cpp_properties.json @@ -3,26 +3,26 @@ { "name": "R1", "includePath": [ - "d:\\Desktop\\r1\\R1_up\\Core\\Inc", - "d:\\Desktop\\r1\\R1_up\\Drivers\\STM32F4xx_HAL_Driver\\Inc", - "d:\\Desktop\\r1\\R1_up\\Drivers\\STM32F4xx_HAL_Driver\\Inc\\Legacy", - "d:\\Desktop\\r1\\R1_up\\Middlewares\\Third_Party\\FreeRTOS\\Source\\include", - "d:\\Desktop\\r1\\R1_up\\Middlewares\\Third_Party\\FreeRTOS\\Source\\CMSIS_RTOS_V2", - "d:\\Desktop\\r1\\R1_up\\Middlewares\\Third_Party\\FreeRTOS\\Source\\portable\\RVDS\\ARM_CM4F", - "d:\\Desktop\\r1\\R1_up\\Drivers\\CMSIS\\Device\\ST\\STM32F4xx\\Include", - "d:\\Desktop\\r1\\R1_up\\Drivers\\CMSIS\\Include", - "d:\\Desktop\\r1\\R1_up\\User\\bsp", - "d:\\Desktop\\r1\\R1_up\\User\\module", - "d:\\Desktop\\r1\\R1_up\\User\\task", - "d:\\Desktop\\r1\\R1_up\\User\\lib", - "d:\\Desktop\\r1\\R1_up\\User\\device", + "d:\\Desktop\\r1\\运球\\Core\\Inc", + "d:\\Desktop\\r1\\运球\\Drivers\\STM32F4xx_HAL_Driver\\Inc", + "d:\\Desktop\\r1\\运球\\Drivers\\STM32F4xx_HAL_Driver\\Inc\\Legacy", + "d:\\Desktop\\r1\\运球\\Middlewares\\Third_Party\\FreeRTOS\\Source\\include", + "d:\\Desktop\\r1\\运球\\Middlewares\\Third_Party\\FreeRTOS\\Source\\CMSIS_RTOS_V2", + "d:\\Desktop\\r1\\运球\\Middlewares\\Third_Party\\FreeRTOS\\Source\\portable\\RVDS\\ARM_CM4F", + "d:\\Desktop\\r1\\运球\\Drivers\\CMSIS\\Device\\ST\\STM32F4xx\\Include", + "d:\\Desktop\\r1\\运球\\Drivers\\CMSIS\\Include", + "d:\\Desktop\\r1\\运球\\User\\bsp", + "d:\\Desktop\\r1\\运球\\User\\module", + "d:\\Desktop\\r1\\运球\\User\\task", + "d:\\Desktop\\r1\\运球\\User\\lib", + "d:\\Desktop\\r1\\运球\\User\\device", "D:\\keil\\ARM\\ARMCC\\include", "D:\\keil\\ARM\\ARMCC\\include\\rw", - "d:\\Desktop\\r1\\R1_up\\MDK-ARM", - "d:\\Desktop\\r1\\R1_up\\Core\\Src", - "d:\\Desktop\\r1\\R1_up\\Drivers\\STM32F4xx_HAL_Driver\\Src", - "d:\\Desktop\\r1\\R1_up\\Middlewares\\Third_Party\\FreeRTOS\\Source", - "d:\\Desktop\\r1\\R1_up\\Middlewares\\Third_Party\\FreeRTOS\\Source\\portable\\MemMang" + "d:\\Desktop\\r1\\运球\\MDK-ARM", + "d:\\Desktop\\r1\\运球\\Core\\Src", + "d:\\Desktop\\r1\\运球\\Drivers\\STM32F4xx_HAL_Driver\\Src", + "d:\\Desktop\\r1\\运球\\Middlewares\\Third_Party\\FreeRTOS\\Source", + "d:\\Desktop\\r1\\运球\\Middlewares\\Third_Party\\FreeRTOS\\Source\\portable\\MemMang" ], "defines": [ "USE_HAL_DRIVER", diff --git a/MDK-ARM/.vscode/keil-assistant.log b/MDK-ARM/.vscode/keil-assistant.log index 7ded289..81941b6 100644 --- a/MDK-ARM/.vscode/keil-assistant.log +++ b/MDK-ARM/.vscode/keil-assistant.log @@ -74,3 +74,11 @@ [info] Log at : 2025/6/25|19:23:57|GMT+0800 +[info] Log at : 2025/6/26|03:33:46|GMT+0800 + +[info] Log at : 2025/6/27|10:05:14|GMT+0800 + +[info] Log at : 2025/6/27|23:24:18|GMT+0800 + +[info] Log at : 2025/6/28|01:53:31|GMT+0800 + diff --git a/MDK-ARM/.vscode/uv4.log b/MDK-ARM/.vscode/uv4.log index f22d47c..6572ba7 100644 --- a/MDK-ARM/.vscode/uv4.log +++ b/MDK-ARM/.vscode/uv4.log @@ -1,10 +1,8 @@ *** Using Compiler 'V5.06 update 7 (build 960)', folder: 'D:\keil\ARM\ARMCC\Bin' Build target 'R1' -compiling shootTask.cpp... -compiling shoot.cpp... compiling ball.cpp... linking... -Program Size: Code=31644 RO-data=1832 RW-data=268 ZI-data=32252 +Program Size: Code=31208 RO-data=1832 RW-data=272 ZI-data=32248 FromELF: creating hex file... "R1\R1.axf" - 0 Error(s), 0 Warning(s). -Build Time Elapsed: 00:00:06 +Build Time Elapsed: 00:00:09 diff --git a/MDK-ARM/.vscode/uv4.log.lock b/MDK-ARM/.vscode/uv4.log.lock index ad9a215..0b3378b 100644 --- a/MDK-ARM/.vscode/uv4.log.lock +++ b/MDK-ARM/.vscode/uv4.log.lock @@ -1 +1 @@ -2025/6/26 3:22:31 \ No newline at end of file +2025/6/27 23:25:01 \ No newline at end of file diff --git a/MDK-ARM/R1.uvoptx b/MDK-ARM/R1.uvoptx index 59120d2..6d65eae 100644 --- a/MDK-ARM/R1.uvoptx +++ b/MDK-ARM/R1.uvoptx @@ -158,7 +158,7 @@ 0 1 - rc_ctrl + rc_ctrl,0x0A 1 @@ -185,6 +185,21 @@ 1 nuc_v + + 6 + 1 + test_exit,0x0A + + + 7 + 1 + ttttt1,0x0A + + + 8 + 1 + ball_exit,0x0A + @@ -952,7 +967,7 @@ User/device - 1 + 0 0 0 0 @@ -1044,7 +1059,7 @@ User/module - 1 + 0 0 0 0 @@ -1076,7 +1091,7 @@ User/task - 1 + 0 0 0 0 diff --git a/R1.ioc b/R1.ioc index cddf3c6..c570408 100644 --- a/R1.ioc +++ b/R1.ioc @@ -153,20 +153,21 @@ Mcu.Pin22=PD14 Mcu.Pin23=PA0-WKUP Mcu.Pin24=PE13 Mcu.Pin25=PE11 -Mcu.Pin26=PA7 -Mcu.Pin27=VP_CRC_VS_CRC -Mcu.Pin28=VP_FREERTOS_VS_CMSIS_V2 -Mcu.Pin29=VP_SYS_VS_Systick +Mcu.Pin26=PB12 +Mcu.Pin27=PA7 +Mcu.Pin28=VP_CRC_VS_CRC +Mcu.Pin29=VP_FREERTOS_VS_CMSIS_V2 Mcu.Pin3=PB3 -Mcu.Pin30=VP_TIM4_VS_ClockSourceINT -Mcu.Pin31=VP_TIM10_VS_ClockSourceINT +Mcu.Pin30=VP_SYS_VS_Systick +Mcu.Pin31=VP_TIM4_VS_ClockSourceINT +Mcu.Pin32=VP_TIM10_VS_ClockSourceINT Mcu.Pin4=PA14 Mcu.Pin5=PA13 Mcu.Pin6=PB7 Mcu.Pin7=PB6 Mcu.Pin8=PD0 Mcu.Pin9=PC11 -Mcu.PinsNb=32 +Mcu.PinsNb=33 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F407IGHx @@ -184,6 +185,7 @@ 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 +NVIC.EXTI15_10_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true NVIC.EXTI9_5_IRQn=true\:5\:0\:true\:false\:true\:false\:true\:true\:true NVIC.ForceEnableDMAVector=true NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false @@ -218,6 +220,12 @@ PA7.Signal=SPI1_MOSI PA9.Locked=true PA9.Mode=Asynchronous PA9.Signal=USART1_TX +PB12.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PB12.GPIO_Label=TEST +PB12.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING +PB12.GPIO_PuPd=GPIO_PULLDOWN +PB12.Locked=true +PB12.Signal=GPXTI12 PB3.GPIOParameters=GPIO_PuPd PB3.GPIO_PuPd=GPIO_PULLUP PB3.Mode=Full_Duplex_Master @@ -369,6 +377,8 @@ RCC.VCOOutputFreq_Value=336000000 RCC.VcooutputI2S=192000000 SH.GPXTI0.0=GPIO_EXTI0 SH.GPXTI0.ConfNb=1 +SH.GPXTI12.0=GPIO_EXTI12 +SH.GPXTI12.ConfNb=1 SH.GPXTI7.0=GPIO_EXTI7 SH.GPXTI7.ConfNb=1 SH.S_TIM10_CH1.0=TIM10_CH1,PWM Generation1 CH1 diff --git a/User/bsp/TopDefine.h b/User/bsp/TopDefine.h index 0f5be42..f3d472a 100644 --- a/User/bsp/TopDefine.h +++ b/User/bsp/TopDefine.h @@ -16,7 +16,7 @@ #endif -#define ONE_CONTROL 1 +#define ONE_CONTROL 0 diff --git a/User/bsp/gpio_it.c b/User/bsp/gpio_it.c index 9d81971..b191800 100644 --- a/User/bsp/gpio_it.c +++ b/User/bsp/gpio_it.c @@ -32,41 +32,41 @@ int8_t BSP_GPIO_RegisterCallback(uint16_t pin, void (*callback)(void)) { return BSP_OK; } -int8_t BSP_GPIO_EnableIRQ(uint16_t pin) { - switch (pin) { +// int8_t BSP_GPIO_EnableIRQ(uint16_t pin) { +// switch (pin) { - // case USER_KEY_Pin: - // HAL_NVIC_EnableIRQ(USER_KEY_EXTI_IRQn); - // break; +// case USER_KEY_Pin: +// HAL_NVIC_EnableIRQ(USER_KEY_EXTI_IRQn); +// break; - /* - case XXX_Pin: - HAL_NVIC_EnableIRQ(XXX_IRQn); - break; - */ +// /* +// case XXX_Pin: +// HAL_NVIC_EnableIRQ(XXX_IRQn); +// break; +// */ - default: - return BSP_ERR; - } - return BSP_OK; -} +// default: +// return BSP_ERR; +// } +// return BSP_OK; +// } -int8_t BSP_GPIO_DisableIRQ(uint16_t pin) { - switch (pin) { +// int8_t BSP_GPIO_DisableIRQ(uint16_t pin) { +// switch (pin) { - // case USER_KEY_Pin: - // HAL_NVIC_DisableIRQ(USER_KEY_EXTI_IRQn); - // break; +// // case USER_KEY_Pin: +// // HAL_NVIC_DisableIRQ(USER_KEY_EXTI_IRQn); +// // break; - /* - case XXX_Pin: - HAL_NVIC_EnableIRQ(XXX_IRQn); - break; - */ +// /* +// case XXX_Pin: +// HAL_NVIC_EnableIRQ(XXX_IRQn); +// break; +// */ - default: - return BSP_ERR; - } - return BSP_OK; -} +// default: +// return BSP_ERR; +// } +// return BSP_OK; +// } diff --git a/User/device/detect.c b/User/device/detect.c index 3c48a2b..2e2743f 100644 --- a/User/device/detect.c +++ b/User/device/detect.c @@ -3,6 +3,7 @@ #include "bsp_delay.h" int key=0; int ball_exit=0; +int test_exit=0; // 按键中断回调函数 void detect_exit(void) @@ -15,24 +16,35 @@ void detect_exit(void) void detect_ball(void) { - ball_exit++; // 按键按下时变量自增 + // ball_exit++; // 按键按下时变量自增 __HAL_GPIO_EXTI_CLEAR_IT(BALL_Pin); // 清除中断标志位 } +void detect_test(void) +{ + delay_ms(10); // 延时10ms + if(HAL_GPIO_ReadPin(TEST_GPIO_Port, TEST_Pin) == GPIO_PIN_RESET) + { + ball_exit++; + } + __HAL_GPIO_EXTI_CLEAR_IT(TEST_Pin); // 清除中断标志位 +} + void detect_init(void) { BSP_GPIO_RegisterCallback(KEY_Pin, detect_exit); BSP_GPIO_RegisterCallback(BALL_Pin, detect_ball); + BSP_GPIO_RegisterCallback(TEST_Pin, detect_test); - // 启用按键中断 - if (BSP_GPIO_EnableIRQ(KEY_Pin) != BSP_OK) { - // 错误处理 - } - if (BSP_GPIO_EnableIRQ(BALL_Pin) != BSP_OK) { - // 错误处理 - } + // // 启用按键中断 + // if (BSP_GPIO_EnableIRQ(KEY_Pin) != BSP_OK) { + // // 错误处理 + // } + // if (BSP_GPIO_EnableIRQ(BALL_Pin) != BSP_OK) { + // // 错误处理 + // } } diff --git a/User/module/ball.cpp b/User/module/ball.cpp index 534d011..61bd7ef 100644 --- a/User/module/ball.cpp +++ b/User/module/ball.cpp @@ -48,7 +48,11 @@ Ball ::Ball() // E键 sw[1] 👆 200 shoot 中 1000 stop sw[2]👇1800 // G键 sw[6]👆 200 中 1000 👇1800 // sw[5] 👆 200 👇1800 +// H键 sw[6] 👆200 👇1800 //左旋 sw[7] 200 --1800 + +int last_sw5 = 1800; // 上一次拨杆状态 + void Ball::rc_mode() { if(rc_ctrl.sw[6]==200) @@ -73,14 +77,17 @@ void Ball::rc_mode() extern_key=OUT; } - if(rc_ctrl.sw[5]==1800) - { - ready_key=SIDE; - } - if(rc_ctrl.sw[5]==200) - { - ready_key=0; //默认不准备 - } + // if (rc_ctrl.sw[5] == 200 && last_sw5 == 1800) // 只在1800->200的瞬间触发 + // { + // rc_key = DOWN2; + // } + // else + // { + // rc_key = 0; // 其他情况不触发 + // } + // last_sw5 = rc_ctrl.sw[5]; + + } void Ball::Send_control() @@ -115,11 +122,12 @@ void Ball::Move_Extend() void Ball::ball_control() { - ball_state = HAL_GPIO_ReadPin(up_ball_GPIO_Port, up_ball_Pin); // 读取光电状态(有球 1,无球 0) + ball_state = HAL_GPIO_ReadPin(up_ball_GPIO_Port, up_ball_Pin); // 读取光电状态(有球 0,无球 1) + //ball_state = HAL_GPIO_ReadPin(TEST_GPIO_Port, TEST_Pin); // 读取光电状态(有球 0,无球 1) Move_Extend(); - switch (rc_key){ + switch (rc_key){ case MIDDLE2: HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); //确保爪气缸关闭 HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 @@ -133,24 +141,202 @@ void Ball::ball_control() break; case UP2: - ballDown(); + //ballDown(); + //Close(); + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); //确保爪气缸关闭 + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 + if (currentState1 == BALL_FINISH) + { + currentState1 = BALL_IDLE; + } + else { + currentState1 = BALL_IDLE; // 默认回到空闲状态 + } break; + case DOWN2: + //Hadling(); + //exit_Handling(); ballHadling(); - //test_Handling(); + //test_up(); break; } + + + //ballHadling_two(); // 执行运球处理 Send_control(); } +void Ball::Close(void) +{ + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 确保爪气缸关闭 + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 + currentState1 = BALL_IDLE; // 回到空闲状态 +} + +void Ball::Hadling(void) +{ + switch (currentState1) + { + case BALL_IDLE: + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); //确保爪气缸关闭 + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); //确保下气缸关闭 + if (rc_key == DOWN2) + { + ball_exit = 0; // 进入流程时清零 + currentState1 = BALL_FORWARD; + } + break; + + case BALL_FORWARD: + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_SET); // 打开气缸爪子 + osDelay(5); + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_SET); // 打开下气缸 + currentState1 = BALL_DROP; // 切换到球下落状态 + break; + + case BALL_DROP: + osDelay(100); // 延时 100ms + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 关闭下气缸 + // 只响应第一次边沿 + if (ball_exit == 1) + { + currentState1 = BALL_FLAG; + } + break; + } +} + +void Ball::exit_Handling(void) +{ + switch (currentState1) + { + case BALL_IDLE: + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); //确保爪气缸关闭 + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); //确保下气缸关闭 + if (rc_key == DOWN2) + { + ball_exit = 0; // 进入流程时清零 + currentState1 = BALL_FORWARD; + } + break; + + case BALL_FORWARD: + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_SET); // 打开气缸爪子 + osDelay(5); + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_SET); // 打开下气缸 + currentState1 = BALL_DROP; // 切换到球下落状态 + break; + + case BALL_DROP: + osDelay(100); // 延时 100ms + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 关闭下气缸 + // 只响应第一次边沿 + if (ball_exit == 1) + { + currentState1 = BALL_FLAG; + } + break; + + case BALL_FLAG: + //osDelay(10); // 延时 10ms + // 只响应第二次边沿 + if (ball_exit == 3) + { + currentState1 = BALL_CLOSE; + } + break; + + case BALL_CLOSE: + osDelay(25); + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 闭合气缸爪子 + currentState1 = BALL_FINISH; // 切换到反转状态 + break; + + case BALL_FINISH: + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 确保气缸爪子闭合 + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 + ball_exit = 0; // 流程完成后清零 + break; + + default: + currentState1 = BALL_IDLE; // 默认回到空闲状态 + break; + } +} int ball_state = 0; int last_ball_state = 0; // 上一次的光电状态 + int step = 0; // 0:持球 1:击球 2:反弹 3:完全离开 + +void Ball::test_up(void) +{ + + switch (currentState1) + { + case BALL_IDLE: + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 确保爪气缸关闭 + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 + if (rc_key == DOWN2) // 检测按键是否被按下 + { + step = 0; + currentState1 = BALL_FORWARD; + } + break; + + case BALL_FORWARD: + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_SET); // 打开气缸爪子 + osDelay(5); + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_SET); // 打开下气缸 + currentState1 = BALL_DROP; // 切换到球下落状态 + break; + + case BALL_DROP: + osDelay(50); // 延时 100ms + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 关闭下气缸 + + // 步骤0:等待球离开(持球->无球) + if (step == 0 && ball_state == 1 && last_ball_state == 0) + { + step = 1; + } + // 步骤1:等待球反弹回来(无球->持球) + else if (step == 1 && ball_state == 0 && last_ball_state == 1) + { + step = 2; + } + // 步骤2:等待球完全上升离开(持球->无球) + else if (step == 2 && ball_state == 1 && last_ball_state == 0) + { + step = 3; + currentState1 = BALL_CLOSE; // 进入闭合气缸 + } + last_ball_state = ball_state; + break; + + case BALL_CLOSE: + //osDelay(25); + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 闭合气缸爪子 + currentState1 = BALL_FINISH; // 切换到完成状态 + break; + + case BALL_FINISH: + osDelay(50); // 延时 50ms + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 确保气缸爪子闭合 + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 + //currentState1 = BALL_IDLE; // 可选:回到空闲状态 + break; + + default: + currentState1 = BALL_IDLE; // 默认回到空闲状态 + break; + } +} void Ball::ballHadling(void) { @@ -162,8 +348,6 @@ void Ball::ballHadling(void) HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 if (rc_key == DOWN2) // 检测按键是否被按下 { - - currentState1 = BALL_FORWARD; } break; @@ -197,8 +381,7 @@ void Ball::ballHadling(void) break; case BALL_CLOSE: - - osDelay(25); + osDelay(100); HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 闭合气缸爪子 currentState1 = BALL_FINISH; // 切换到反转状态 break; @@ -220,6 +403,75 @@ void Ball::ballHadling(void) } + int runCount = 0; // 运球次数计数 + +void Ball::ballHadling_two(void) +{ + switch (currentState1) + { + case BALL_IDLE: + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); //确保爪气缸关闭 + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); //确保下气缸关闭 + if (rc_key == DOWN2) + { + runCount = 0; // 每次拨动重新计数 + currentState1 = BALL_FORWARD; + } + break; + + case BALL_FORWARD: + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_SET); // 打开气缸爪子 + osDelay(5); + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_SET); // 打开下气缸 + currentState1 = BALL_DROP; + break; + + case BALL_DROP: + osDelay(100); + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 关闭下气缸 + if (ball_state == 1 && last_ball_state == 0) // 球离开 + { + currentState1 = BALL_FLAG; + } + last_ball_state = ball_state; + break; + + case BALL_FLAG: + osDelay(10); + if (ball_state == 0 && last_ball_state == 1) // 球弹回 + { + currentState1 = BALL_CLOSE; + } + last_ball_state = ball_state; + break; + + case BALL_CLOSE: + osDelay(25); + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 闭合气缸爪子 + currentState1 = BALL_FINISH; + break; + + case BALL_FINISH: + osDelay(50); + HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET); // 确保气缸爪子闭合 + HAL_GPIO_WritePin(DOWN_GPIO_Port, DOWN_Pin, GPIO_PIN_RESET); // 确保下气缸关闭 + runCount++; + if (runCount < 2) + { + currentState1 = BALL_FORWARD; // 继续下一次运球 + } + else + { + currentState1 = BALL_IDLE; // 完成两次,回到空闲 + } + break; + + default: + currentState1 = BALL_IDLE; + break; + } +} + #endif diff --git a/User/module/ball.hpp b/User/module/ball.hpp index f92b606..02b77a1 100644 --- a/User/module/ball.hpp +++ b/User/module/ball.hpp @@ -55,8 +55,12 @@ public: void Move_Extend(void); void Idle_control(void); void rc_mode(void); - void test_Handling(void); + void ballHadling_two(void); void ball_control(void); + void exit_Handling(void); + void Hadling(void); + void Close(void); + void test_up(void); BallState_t currentState1; // 运球任务状态机 int flag_thread;//暂时还没用到