可用三摩擦

This commit is contained in:
ws 2025-04-20 20:38:16 +08:00
parent f0931e76d2
commit a609af6ba4
7 changed files with 138 additions and 60 deletions

View File

@ -94,7 +94,7 @@ void MX_GPIO_Init(void)
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = KEY_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);

View File

@ -279,16 +279,16 @@ void USART1_IRQHandler(void)
/**
* @brief This function handles USART3 global interrupt.
*/
//void USART3_IRQHandler(void)
//{
// /* USER CODE BEGIN USART3_IRQn 0 */
// void USART3_IRQHandler(void)
// {
// /* USER CODE BEGIN USART3_IRQn 0 */
// /* USER CODE END USART3_IRQn 0 */
// HAL_UART_IRQHandler(&huart3);
// /* USER CODE BEGIN USART3_IRQn 1 */
// /* USER CODE END USART3_IRQn 0 */
// HAL_UART_IRQHandler(&huart3);
// /* USER CODE BEGIN USART3_IRQn 1 */
// /* USER CODE END USART3_IRQn 1 */
//}
// /* USER CODE END USART3_IRQn 1 */
// }
/**
* @brief This function handles DMA2 stream1 global interrupt.

View File

@ -188,44 +188,71 @@
<Ww>
<count>7</count>
<WinNumber>1</WinNumber>
<ItemText>ball,0x0A</ItemText>
<ItemText>cnt1,0x0A</ItemText>
</Ww>
<Ww>
<count>8</count>
<WinNumber>1</WinNumber>
<ItemText>cnt1,0x0A</ItemText>
<ItemText>cmd_fromnuc</ItemText>
</Ww>
<Ww>
<count>9</count>
<WinNumber>1</WinNumber>
<ItemText>cmd_fromnuc</ItemText>
<ItemText>nucbuf</ItemText>
</Ww>
<Ww>
<count>10</count>
<WinNumber>1</WinNumber>
<ItemText>nucbuf</ItemText>
<ItemText>nucData</ItemText>
</Ww>
<Ww>
<count>11</count>
<WinNumber>1</WinNumber>
<ItemText>nucData</ItemText>
<ItemText>send,0x0A</ItemText>
</Ww>
<Ww>
<count>12</count>
<WinNumber>1</WinNumber>
<ItemText>send,0x0A</ItemText>
<ItemText>speed1,0x0A</ItemText>
</Ww>
<Ww>
<count>13</count>
<WinNumber>1</WinNumber>
<ItemText>speed1,0x0A</ItemText>
<ItemText>abc,0x0A</ItemText>
</Ww>
<Ww>
<count>14</count>
<WinNumber>1</WinNumber>
<ItemText>\\R1_shooter\../User/task/ballTask.cpp\ball,0x0A</ItemText>
</Ww>
<Ww>
<count>15</count>
<WinNumber>1</WinNumber>
<ItemText>speedm,0x0A</ItemText>
</Ww>
<Ww>
<count>16</count>
<WinNumber>1</WinNumber>
<ItemText>abc,0x0A</ItemText>
</Ww>
<Ww>
<count>17</count>
<WinNumber>1</WinNumber>
<ItemText>flag,0x0A</ItemText>
</Ww>
<Ww>
<count>18</count>
<WinNumber>1</WinNumber>
<ItemText>ball_state,0x0A</ItemText>
</Ww>
</WatchWindow1>
<WatchWindow2>
<Ww>
<count>0</count>
<WinNumber>2</WinNumber>
<ItemText>ball,0x0A</ItemText>
</Ww>
</WatchWindow2>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>
@ -1060,7 +1087,7 @@
<Group>
<GroupName>User/task</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>

View File

@ -174,8 +174,9 @@ NVIC.USART1_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.USART3_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.USART6_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
PA0-WKUP.GPIOParameters=GPIO_PuPd,GPIO_Label
PA0-WKUP.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI
PA0-WKUP.GPIO_Label=KEY
PA0-WKUP.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING
PA0-WKUP.GPIO_PuPd=GPIO_PULLUP
PA0-WKUP.Locked=true
PA0-WKUP.Signal=GPXTI0

View File

@ -7,12 +7,16 @@ extern RC_ctrl_t rc_ctrl;
extern int key;
// 定义状态机变量
BallState_t currentBallState = BALL_IDLE;
BallState_t currentState1 = BALL_IDLE; // 当前状态
uint32_t startTime = 0; // 用于记录延时的起始时间
int speedm=0;
#define MOTOR_SPEED 1000
const fp32 Ball:: M3508_speed_PID[3] = {5, 0, 0};
//PE11 气缸
//三摩擦轮运球!!!
Ball ::Ball()
@ -45,46 +49,90 @@ void Ball ::Spin(float speed)
}
CAN_cmd_200(result[MOTOR_1],result[MOTOR_2],result[MOTOR_3],0,&hcan1);
osDelay(1);
}
int flag =0;
int ball_state = 0;
void Ball::ballHadling(void)
{
if (key > 0) // 检测按键是否被按下
ball_state =HAL_GPIO_ReadPin(up_ball_GPIO_Port, up_ball_Pin);//有球 0 无球 1
switch (currentState1)
{
if (key % 2 == 1) // key 为奇数,摩擦轮正转
case BALL_IDLE:
HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET);
if (key > 0) // 检测按键是否被按下
{
Spin(5000); // 正转
speedm=-4000;
currentState1 = BALL_FORWARD; // 切换到正转状态
}
else if (key % 2 == 0) // key 为偶数,摩擦轮反转
break;
case BALL_FORWARD:
if ( hand_Motor[MOTOR_1]->speed_rpm > 3980&&hand_Motor[MOTOR_1]->speed_rpm <= 4010&&
hand_Motor[MOTOR_2]->speed_rpm <= -3980&&hand_Motor[MOTOR_2]->speed_rpm >= -4010&&
hand_Motor[MOTOR_3]->speed_rpm <= -3980&&hand_Motor[MOTOR_2]->speed_rpm >= -4010 )
{
Spin(-5000); // 反转
HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_SET);// 打开气缸
currentState1 = BALL_DROP; // 切换到球下落状态
}
break;
case BALL_DROP:
if (ball_state == 1)
{
osDelay(200); // 延时50ms
speedm=2500;
currentState1 = BALL_REVERSE; // 切换到反转状态
}
break;
case BALL_REVERSE:
if (ball_state == 0)
{
flag=2;
speedm=0;
currentState1 = BALL_CLOSE; // 切换到完成状态
}
break;
case BALL_CLOSE:
osDelay(200); // 延时50ms
if (flag == 2)
{
if(ball_state == 0)
{
HAL_GPIO_WritePin(CLOSE_GPIO_Port, CLOSE_Pin, GPIO_PIN_RESET);
currentState1 = BALL_FINISH; // 切换到完成状态
}
}
break;
case BALL_FINISH:
osDelay(200); // 延时50ms
key = 0; // 重置按键状态
flag=0;
speedm=0;
currentState1 = BALL_IDLE; // 回到空闲状态
break;
default:
currentState1 = BALL_IDLE; // 默认回到空闲状态
break;
}
}
// void Ball::ballHadling(void)
// {
// static bool isReversed = false; // 静态变量,记录当前摩擦轮状态,初始为正转
void Ball::Send_control()
{
CAN_cmd_200(result[MOTOR_1],result[MOTOR_2],result[MOTOR_3],0,&hcan1);
// if (key > 0) // 检测按键是否被按下
// {
// key = 0; // 重置按键状态,防止重复触发
}
// if (isReversed)
// {
// // 当前为反转,切换为正转
// Spin(MOTOR_SPEED); // 正转
// isReversed = false;
// }
// else
// {
// // 当前为正转,切换为反转
// Spin(-MOTOR_SPEED); // 反转
// isReversed = true;
// }
// }
// }

View File

@ -9,12 +9,12 @@
// 定义状态枚举
typedef enum {
BALL_IDLE, // 空闲状态
BALL_RELEASE, // 下球气缸弹出,爪子张开
BALL_JOINT_REVERSE, // 关节电机反转置水平位置
BALL_FALLING, // 球加速落下
BALL_WAIT_BOUNCE, // 等待光电检测反弹
BALL_NET_CLOSE // 收网状态
BALL_IDLE, // 空闲状态
BALL_FORWARD, // 正转状态
BALL_DROP, // 球下落状态
BALL_REVERSE, // 反转状态
BALL_CLOSE, // 关闭状态
BALL_FINISH // 完成状态
} BallState_t;
typedef enum
@ -35,14 +35,15 @@ public:
Ball();
void Spin(float speed);
void ballHadling(void);
void Send_control(void);
void ballStateMachine(void);
int16_t result[MOTOR_NUM];
motor_measure_t *hand_Motor[MOTOR_NUM];
private:
int up_ball_state; //上球状态 0:无球 1:有球
motor_measure_t *hand_Motor[MOTOR_NUM];
//三个摩擦轮
static const float M3508_speed_PID[3];
static const float M3508_angle_PID[3];

View File

@ -10,6 +10,7 @@ Ball ball;
int abc=0;
int c30=0;
int speed1=500;
extern int speedm;
void FunctionBall(void *argument)
{
@ -17,16 +18,16 @@ void FunctionBall(void *argument)
const uint32_t delay_tick = osKernelGetTickFreq() / TASK_FREQ_BALL;
uint32_t tick = osKernelGetTickCount();
while(1)
{
#ifdef DEBUG
task_struct.stack_water_mark.ball = osThreadGetStackSpace(osThreadGetId());
#endif
abc=HAL_GPIO_ReadPin(STOP_GPIO_Port, STOP_Pin);
ball.ballHadling(); // 处理摩擦轮转动
// ball.Spin(speed1);
osDelay(3);
abc=HAL_GPIO_ReadPin(up_ball_GPIO_Port, up_ball_Pin);
ball.ballHadling(); // 处理摩擦轮转动
ball.Spin(speedm);
ball.Send_control();
tick += delay_tick; /* 计算下一个唤醒时刻 */
osDelayUntil(tick);