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;//暂时还没用到