Add cylinder control and material 1 picking function: 1. Add PG8 pin for cylinder control (close=1, open=0) 2. Fix material positions distances 3. Fix material 3 direction (right) 4. Add Machine_PickMaterial1() function 5. Auto execute picking after reaching center in main.c

This commit is contained in:
yankun
2026-02-09 14:50:45 +08:00
parent 069097a0b9
commit 4f62d6e58d
3 changed files with 564 additions and 470 deletions

View File

@@ -1,135 +1,153 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/** /**
****************************************************************************** ******************************************************************************
* @file : machine.h * @file : machine.h
* @brief : LK540 Machine Stepper Motor Control Header * @brief : LK540 Machine Stepper Motor Control Header
* 步进电机控制模块头文件 * 步进电机控制模块头文件
****************************************************************************** ******************************************************************************
* @attention * @attention
* *
* Copyright (c) 2026 STMicroelectronics. * Copyright (c) 2026 STMicroelectronics.
* All rights reserved. * All rights reserved.
* *
****************************************************************************** ******************************************************************************
*/ */
/* USER CODE END Header */ /* USER CODE END Header */
#ifndef __MACHINE_H #ifndef __MACHINE_H
#define __MACHINE_H #define __MACHINE_H
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "main.h" #include "main.h"
/* Exported types ------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/
/** /**
* @brief 步进电机方向枚举 * @brief 步进电机方向枚举
*/ */
typedef enum typedef enum
{ {
MOTOR_DIR_CW = 0, /* 向左移动 (Clockwise) */ MOTOR_DIR_CW = 0, /* 向左移动 (Clockwise) */
MOTOR_DIR_CCW = 1 /* 向右移动 (Counter Clockwise) */ MOTOR_DIR_CCW = 1 /* 向右移动 (Counter Clockwise) */
} Motor_DirectionTypeDef; } Motor_DirectionTypeDef;
/* Exported constants --------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/
/* 电机参数定义 */ /* 电机参数定义 */
#define MOTOR_PULSE_PER_MM 5.33f /* 每毫米脉冲数 */ #define MOTOR_PULSE_PER_MM 5.33f /* 每毫米脉冲数 */
#define MOTOR_ORIGIN_DISTANCE 215.0f /* 原点距离 (mm) */ #define MOTOR_ORIGIN_DISTANCE 215.0f /* 原点距离 (mm) */
#define MOTOR_MATERIAL1_DISTANCE 192.4f /* 1#料距离 (mm) */ #define MOTOR_MATERIAL1_DISTANCE 192.4f /* 1#料距离 (mm) */
#define MOTOR_MATERIAL2_DISTANCE 65.4f /* 2#料距离 (mm) */ #define MOTOR_MATERIAL2_DISTANCE 65.4f /* 2#料距离 (mm) */
#define MOTOR_MATERIAL3_DISTANCE 61.6f /* 3#料距离 (mm) */ #define MOTOR_MATERIAL3_DISTANCE 61.6f /* 3#料距离 (mm) */
#define MOTOR_MATERIAL4_DISTANCE 188.6f /* 4#料距离 (mm) */ #define MOTOR_MATERIAL4_DISTANCE 188.6f /* 4#料距离 (mm) */
/* GPIO引脚定义 */ /* GPIO引脚定义 */
#define MOTOR_ORIGIN_PIN_PORT GPIOB #define MOTOR_ORIGIN_PIN_PORT GPIOB
#define MOTOR_ORIGIN_PIN GPIO_PIN_3 #define MOTOR_ORIGIN_PIN GPIO_PIN_3
#define MOTOR_LIMIT_PIN_PORT GPIOG #define MOTOR_LIMIT_PIN_PORT GPIOG
#define MOTOR_LIMIT_PIN GPIO_PIN_15 #define MOTOR_LIMIT_PIN GPIO_PIN_15
#define MOTOR_DIR_PIN_PORT GPIOD #define MOTOR_DIR_PIN_PORT GPIOD
#define MOTOR_DIR_PIN GPIO_PIN_7 #define MOTOR_DIR_PIN GPIO_PIN_7
#define MOTOR_STEP_PIN_PORT GPIOG #define MOTOR_STEP_PIN_PORT GPIOG
#define MOTOR_STEP_PIN GPIO_PIN_9 #define MOTOR_STEP_PIN GPIO_PIN_9
/* Exported macro ------------------------------------------------------------*/ #define CYLINDER_PIN_PORT GPIOG
#define CYLINDER_PIN GPIO_PIN_8
/* Exported functions prototypes ---------------------------------------------*/
/** /* Exported macro ------------------------------------------------------------*/
* @brief 检测步进电机是否在原点
* @retval 1: 在原点, 0: 不在原点 /* Exported functions prototypes ---------------------------------------------*/
*/ /**
uint8_t Machine_IsAtOrigin(void); * @brief 检测步进电机是否在原点
* @retval 1: 在原点, 0: 不在原点
/** */
* @brief 检测步进电机是否在临界点(限位传感器) uint8_t Machine_IsAtOrigin(void);
* @retval 1: 在临界点, 0: 不在临界点
*/ /**
uint8_t Machine_IsAtLimit(void); * @brief 检测步进电机是否在临界点(限位传感器)
* @retval 1: 在临界点, 0: 不在临界点
/** */
* @brief 设置步进电机方向 uint8_t Machine_IsAtLimit(void);
* @param dir: 方向 (MOTOR_DIR_CW: 向左, MOTOR_DIR_CCW: 向右)
* @retval None /**
*/ * @brief 设置步进电机方向
void Machine_SetDirection(Motor_DirectionTypeDef dir); * @param dir: 方向 (MOTOR_DIR_CW: 向左, MOTOR_DIR_CCW: 向右)
* @retval None
/** */
* @brief 步进电机移动一步 void Machine_SetDirection(Motor_DirectionTypeDef dir);
* @note 产生一个脉冲信号电机移动一步1/5.33 mm
* @retval None /**
*/ * @brief 控制气缸状态
void Machine_Step(void); * @param state: 状态 (0: 张开, 1: 闭合)
* @note PG8为0表示张开1表示闭合
/** * @retval None
* @brief 步进电机移动到原点 */
* @note 一直向左移动直到检测到原点传感器PB3为0 void Machine_SetCylinder(uint8_t state);
* 如果检测到限位传感器PG15为0则停止并返回错误
* @retval 0: 成功到达原点, 1: 到达限位点(错误) /**
*/ * @brief 步进电机移动一步
uint8_t Machine_MoveToOrigin(void); * @note 产生一个脉冲信号电机移动一步1/5.33 mm
* @retval None
/** */
* @brief 步进电机从原点移动到中心点 void Machine_Step(void);
* @note 从原点传感器位置向右移动215.0mm到达中心点
* @retval 0: 成功, 1: 失败(到达限位点) /**
*/ * @brief 步进电机移动到原点
uint8_t Machine_MoveToCenter(void); * @note 一直向左移动直到检测到原点传感器PB3为0
* 如果检测到限位传感器PG15为0则停止并返回错误
/** * @retval 0: 成功到达原点, 1: 到达限位点(错误)
* @brief 步进电机从中心点移动到1#料位置 */
* @note 从原点215.0mm向左移动22.6mm到达1#料192.4mm uint8_t Machine_MoveToOrigin(void);
* @retval 0: 成功, 1: 失败(到达限位点)
*/ /**
uint8_t Machine_MoveToMaterial1(void); * @brief 步进电机从原点移动到中心点
* @note 从原点传感器位置向右移动215.0mm到达中心点
/** * @retval 0: 成功, 1: 失败(到达限位点)
* @brief 步进电机从中心点移动到2#料位置 */
* @note 从原点215.0mm向左移动149.6mm到达2#料65.4mm uint8_t Machine_MoveToCenter(void);
* @retval 0: 成功, 1: 失败(到达限位点)
*/ /**
uint8_t Machine_MoveToMaterial2(void); * @brief 步进电机从中心点移动到1#料位置
* @note 从中心点向左移动192.4mm到达1#料
/** * @retval 0: 成功, 1: 失败(到达限位点)
* @brief 步进电机从中心点移动到3#料位置 */
* @note 从原点215.0mm向右移动153.4mm到达3#料61.6mm uint8_t Machine_MoveToMaterial1(void);
* @retval 0: 成功, 1: 失败(到达限位点)
*/ /**
uint8_t Machine_MoveToMaterial3(void); * @brief 步进电机从中心点移动到2#料位置
* @note 从中心点向左移动65.4mm到达2#料
/** * @retval 0: 成功, 1: 失败(到达限位点)
* @brief 步进电机从中心点移动到4#料位置 */
* @note 从原点215.0mm向右移动26.4mm到达4#料188.6mm uint8_t Machine_MoveToMaterial2(void);
* @retval 0: 成功, 1: 失败(到达限位点)
*/ /**
uint8_t Machine_MoveToMaterial4(void); * @brief 步进电机从中心点移动到3#料位置
* @note 从中心点向右移动61.6mm到达3#料
#ifdef __cplusplus * @retval 0: 成功, 1: 失败(到达限位点)
} */
#endif uint8_t Machine_MoveToMaterial3(void);
#endif /* __MACHINE_H */ /**
* @brief 步进电机从中心点移动到4#料位置
* @note 从中心点向右移动188.6mm到达4#料
* @retval 0: 成功, 1: 失败(到达限位点)
*/
uint8_t Machine_MoveToMaterial4(void);
/**
* @brief 从中心点移动到1#料位置并取料,然后返回中心点放料
* @note 完整的取料流程移动到1#料 -> 闭合气缸 -> 返回中心点 -> 张开气缸
* @retval 0: 成功, 1: 失败(移动失败)
*/
uint8_t Machine_PickMaterial1(void);
#ifdef __cplusplus
}
#endif
#endif /* __MACHINE_H */

View File

@@ -1,331 +1,392 @@
/* USER CODE BEGIN Header */ /* USER CODE BEGIN Header */
/** /**
****************************************************************************** ******************************************************************************
* @file : machine.c * @file : machine.c
* @brief : LK540 Machine Stepper Motor Control Implementation * @brief : LK540 Machine Stepper Motor Control Implementation
* 步进电机控制模块实现 * 步进电机控制模块实现
****************************************************************************** ******************************************************************************
* @attention * @attention
* *
* Copyright (c) 2026 STMicroelectronics. * Copyright (c) 2026 STMicroelectronics.
* All rights reserved. * All rights reserved.
* *
****************************************************************************** ******************************************************************************
*/ */
/* USER CODE END Header */ /* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "machine.h" #include "machine.h"
/* Private includes ----------------------------------------------------------*/ /* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */ /* USER CODE BEGIN Includes */
/* USER CODE END Includes */ /* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */ /* USER CODE BEGIN PTD */
/* USER CODE END PTD */ /* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */ /* USER CODE BEGIN PD */
/* 步进脉冲时序参数(微秒) */ /* 步进脉冲时序参数(微秒) */
#define STEP_PULSE_HIGH_TIME_US 10 /* 脉冲高电平时间 */ #define STEP_PULSE_HIGH_TIME_US 10 /* 脉冲高电平时间 */
#define STEP_PULSE_LOW_TIME_US 10 /* 脉冲低电平时间 */ #define STEP_PULSE_LOW_TIME_US 10 /* 脉冲低电平时间 */
/* 移动相关参数 */ /* 移动相关参数 */
#define MAX_STEPS_TO_ORIGIN 50000 /* 移动到原点的最大步数(防止无限循环) */ #define MAX_STEPS_TO_ORIGIN 50000 /* 移动到原点的最大步数(防止无限循环) */
#define STEP_DELAY_US 100 /* 每步之间的延时(微秒) */ #define STEP_DELAY_US 100 /* 每步之间的延时(微秒) */
/* 各料位相对于点的距离mm */ /* 各料位相对于中心点的距离mm */
#define DISTANCE_TO_MATERIAL1 22.6f /* 215.0 - 192.4 = 22.6mm (向左) */ #define DISTANCE_TO_MATERIAL1 192.4f /* 从中心点向左移动192.4mm */
#define DISTANCE_TO_MATERIAL2 149.6f /* 215.0 - 65.4 = 149.6mm (向左) */ #define DISTANCE_TO_MATERIAL2 65.4f /* 从中心点向左移动65.4mm */
#define DISTANCE_TO_MATERIAL3 153.4f /* 215.0 - 61.6 = 153.4mm (向右) */ #define DISTANCE_TO_MATERIAL3 61.6f /* 从中心点向右移动61.6mm */
#define DISTANCE_TO_MATERIAL4 26.4f /* 215.0 - 188.6 = 26.4mm (向右) */ #define DISTANCE_TO_MATERIAL4 188.6f /* 从中心点向右移动188.6mm */
/* USER CODE END PD */ /* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */ /* USER CODE BEGIN PM */
/* USER CODE END PM */ /* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */ /* USER CODE BEGIN PV */
/* USER CODE END PV */ /* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */ /* USER CODE BEGIN PFP */
static void DelayUs(uint32_t us); static void DelayUs(uint32_t us);
static uint32_t Machine_MmToSteps(float mm); static uint32_t Machine_MmToSteps(float mm);
static uint8_t Machine_MoveSteps(Motor_DirectionTypeDef dir, uint32_t steps); static uint8_t Machine_MoveSteps(Motor_DirectionTypeDef dir, uint32_t steps);
/* USER CODE END PFP */ /* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/ /* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */ /* USER CODE BEGIN 0 */
/** /**
* @brief 微秒级延时函数 * @brief 微秒级延时函数
* @param us: 延时时间(微秒) * @param us: 延时时间(微秒)
* @note 基于系统时钟的简单延时72MHz系统时钟下 * @note 基于系统时钟的简单延时72MHz系统时钟下
* 考虑循环开销使用约60个周期/微秒 * 考虑循环开销使用约60个周期/微秒
* @retval None * @retval None
*/ */
static void DelayUs(uint32_t us) static void DelayUs(uint32_t us)
{ {
uint32_t i; uint32_t i;
/* 72MHz时钟考虑循环开销约60个周期/微秒 */ /* 72MHz时钟考虑循环开销约60个周期/微秒 */
for (i = 0; i < us * 60; i++) for (i = 0; i < us * 60; i++)
{ {
__NOP(); __NOP();
} }
} }
/** /**
* @brief 将毫米距离转换为步数 * @brief 将毫米距离转换为步数
* @param mm: 距离(毫米) * @param mm: 距离(毫米)
* @retval 步数 * @retval 步数
*/ */
static uint32_t Machine_MmToSteps(float mm) static uint32_t Machine_MmToSteps(float mm)
{ {
/* 每毫米5.33个脉冲,向上取整 */ /* 每毫米5.33个脉冲,向上取整 */
return (uint32_t)(mm * MOTOR_PULSE_PER_MM + 0.5f); return (uint32_t)(mm * MOTOR_PULSE_PER_MM + 0.5f);
} }
/** /**
* @brief 步进电机移动指定步数 * @brief 步进电机移动指定步数
* @param dir: 移动方向 * @param dir: 移动方向
* @param steps: 移动步数 * @param steps: 移动步数
* @retval 0: 成功, 1: 失败(到达限位点) * @retval 0: 成功, 1: 失败(到达限位点)
*/ */
static uint8_t Machine_MoveSteps(Motor_DirectionTypeDef dir, uint32_t steps) static uint8_t Machine_MoveSteps(Motor_DirectionTypeDef dir, uint32_t steps)
{ {
uint32_t i; uint32_t i;
/* 设置方向 */ /* 设置方向 */
Machine_SetDirection(dir); Machine_SetDirection(dir);
DelayUs(STEP_DELAY_US); DelayUs(STEP_DELAY_US);
/* 移动指定步数 */ /* 移动指定步数 */
for (i = 0; i < steps; i++) for (i = 0; i < steps; i++)
{ {
/* 检查限位传感器 */ /* 检查限位传感器 */
if (Machine_IsAtLimit()) if (Machine_IsAtLimit())
{ {
return 1; /* 到达限位点,返回错误 */ return 1; /* 到达限位点,返回错误 */
} }
/* 移动一步 */ /* 移动一步 */
Machine_Step(); Machine_Step();
DelayUs(STEP_DELAY_US); DelayUs(STEP_DELAY_US);
} }
return 0; /* 成功 */ return 0; /* 成功 */
} }
/* USER CODE END 0 */ /* USER CODE END 0 */
/* Exported functions --------------------------------------------------------*/ /* Exported functions --------------------------------------------------------*/
/** /**
* @brief 检测步进电机是否在原点 * @brief 检测步进电机是否在原点
* @note PB3状态为0表示检测到步进电机在原点 * @note PB3状态为0表示检测到步进电机在原点
* @retval 1: 在原点, 0: 不在原点 * @retval 1: 在原点, 0: 不在原点
*/ */
uint8_t Machine_IsAtOrigin(void) uint8_t Machine_IsAtOrigin(void)
{ {
GPIO_PinState pinState; GPIO_PinState pinState;
/* 读取PB3引脚状态 */ /* 读取PB3引脚状态 */
pinState = HAL_GPIO_ReadPin(MOTOR_ORIGIN_PIN_PORT, MOTOR_ORIGIN_PIN); pinState = HAL_GPIO_ReadPin(MOTOR_ORIGIN_PIN_PORT, MOTOR_ORIGIN_PIN);
/* PB3为0表示在原点 */ /* PB3为0表示在原点 */
return (pinState == GPIO_PIN_RESET) ? 1 : 0; return (pinState == GPIO_PIN_RESET) ? 1 : 0;
} }
/** /**
* @brief 检测步进电机是否在临界点(限位传感器) * @brief 检测步进电机是否在临界点(限位传感器)
* @note PG15状态为0表示检测到步进电机到达临界点不能再前进了 * @note PG15状态为0表示检测到步进电机到达临界点不能再前进了
* @retval 1: 在临界点, 0: 不在临界点 * @retval 1: 在临界点, 0: 不在临界点
*/ */
uint8_t Machine_IsAtLimit(void) uint8_t Machine_IsAtLimit(void)
{ {
GPIO_PinState pinState; GPIO_PinState pinState;
/* 读取PG15引脚状态 */ /* 读取PG15引脚状态 */
pinState = HAL_GPIO_ReadPin(MOTOR_LIMIT_PIN_PORT, MOTOR_LIMIT_PIN); pinState = HAL_GPIO_ReadPin(MOTOR_LIMIT_PIN_PORT, MOTOR_LIMIT_PIN);
/* PG15为0表示在临界点 */ /* PG15为0表示在临界点 */
return (pinState == GPIO_PIN_RESET) ? 1 : 0; return (pinState == GPIO_PIN_RESET) ? 1 : 0;
} }
/** /**
* @brief 设置步进电机方向 * @brief 设置步进电机方向
* @param dir: 方向 * @param dir: 方向
* MOTOR_DIR_CW (0): 向左移动 (CW - Clockwise) * MOTOR_DIR_CW (0): 向左移动 (CW - Clockwise)
* MOTOR_DIR_CCW (1): 向右移动 (CCW - Counter Clockwise) * MOTOR_DIR_CCW (1): 向右移动 (CCW - Counter Clockwise)
* @note PD7为0表示向左1表示向右 * @note PD7为0表示向左1表示向右
* @retval None * @retval None
*/ */
void Machine_SetDirection(Motor_DirectionTypeDef dir) void Machine_SetDirection(Motor_DirectionTypeDef dir)
{ {
GPIO_PinState pinState; GPIO_PinState pinState;
/* 根据方向设置PD7引脚状态 */ /* 根据方向设置PD7引脚状态 */
/* CW(0) = 向左 = GPIO_PIN_RESET, CCW(1) = 向右 = GPIO_PIN_SET */ /* CW(0) = 向左 = GPIO_PIN_RESET, CCW(1) = 向右 = GPIO_PIN_SET */
pinState = (dir == MOTOR_DIR_CW) ? GPIO_PIN_RESET : GPIO_PIN_SET; pinState = (dir == MOTOR_DIR_CW) ? GPIO_PIN_RESET : GPIO_PIN_SET;
/* 设置方向引脚 */ /* 设置方向引脚 */
HAL_GPIO_WritePin(MOTOR_DIR_PIN_PORT, MOTOR_DIR_PIN, pinState); HAL_GPIO_WritePin(MOTOR_DIR_PIN_PORT, MOTOR_DIR_PIN, pinState);
} }
/** /**
* @brief 步进电机移动一步 * @brief 控制气缸状态
* @note 产生一个脉冲信号,电机移动一步 * @param state: 状态 (0: 张开, 1: 闭合)
* 移动1mm需要5.33个脉冲所以一步约等于1/5.33 mm * @note PG8为0表示张开1表示闭合
* 脉冲时序:低->高->低 * @retval None
* @retval None */
*/ void Machine_SetCylinder(uint8_t state)
void Machine_Step(void) {
{ GPIO_PinState pinState;
/* 确保步进引脚初始为低电平 */
HAL_GPIO_WritePin(MOTOR_STEP_PIN_PORT, MOTOR_STEP_PIN, GPIO_PIN_RESET); /* 根据状态设置PG8引脚状态 */
DelayUs(STEP_PULSE_LOW_TIME_US); /* 0 = 张开 = GPIO_PIN_RESET, 1 = 闭合 = GPIO_PIN_SET */
pinState = (state == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET;
/* 产生高电平脉冲 */
HAL_GPIO_WritePin(MOTOR_STEP_PIN_PORT, MOTOR_STEP_PIN, GPIO_PIN_SET); /* 设置气缸控制引脚 */
DelayUs(STEP_PULSE_HIGH_TIME_US); HAL_GPIO_WritePin(CYLINDER_PIN_PORT, CYLINDER_PIN, pinState);
}
/* 恢复低电平 */
HAL_GPIO_WritePin(MOTOR_STEP_PIN_PORT, MOTOR_STEP_PIN, GPIO_PIN_RESET); /**
DelayUs(STEP_PULSE_LOW_TIME_US); * @brief 步进电机移动一步
} * @note 产生一个脉冲信号,电机移动一步
* 移动1mm需要5.33个脉冲所以一步约等于1/5.33 mm
/** * 脉冲时序:低->高->低
* @brief 步进电机移动到原点 * @retval None
* @note 一直向左移动直到检测到原点传感器PB3为0 */
* 如果检测到限位传感器PG15为0则停止并返回错误 void Machine_Step(void)
* @retval 0: 成功到达原点, 1: 到达限位点(错误) {
*/ /* 确保步进引脚初始为低电平 */
uint8_t Machine_MoveToOrigin(void) HAL_GPIO_WritePin(MOTOR_STEP_PIN_PORT, MOTOR_STEP_PIN, GPIO_PIN_RESET);
{ DelayUs(STEP_PULSE_LOW_TIME_US);
uint32_t stepCount = 0;
/* 产生高电平脉冲 */
/* 设置方向为向左CW */ HAL_GPIO_WritePin(MOTOR_STEP_PIN_PORT, MOTOR_STEP_PIN, GPIO_PIN_SET);
Machine_SetDirection(MOTOR_DIR_CW); DelayUs(STEP_PULSE_HIGH_TIME_US);
DelayUs(STEP_DELAY_US);
/* 恢复低电平 */
/* 如果已经在原点,直接返回 */ HAL_GPIO_WritePin(MOTOR_STEP_PIN_PORT, MOTOR_STEP_PIN, GPIO_PIN_RESET);
if (Machine_IsAtOrigin()) DelayUs(STEP_PULSE_LOW_TIME_US);
{ }
return 0;
} /**
* @brief 步进电机移动到原点
/* 一直向左移动直到检测到原点 */ * @note 一直向左移动直到检测到原点传感器PB3为0
while (!Machine_IsAtOrigin()) * 如果检测到限位传感器PG15为0则停止并返回错误
{ * @retval 0: 成功到达原点, 1: 到达限位点(错误)
/* 检查限位传感器 */ */
if (Machine_IsAtLimit()) uint8_t Machine_MoveToOrigin(void)
{ {
return 1; /* 到达限位点,返回错误 */ uint32_t stepCount = 0;
}
/* 设置方向为向左CW */
/* 防止无限循环 */ Machine_SetDirection(MOTOR_DIR_CW);
if (stepCount++ > MAX_STEPS_TO_ORIGIN) DelayUs(STEP_DELAY_US);
{
return 1; /* 超时,返回错误 */ /* 如果已经在原点,直接返回 */
} if (Machine_IsAtOrigin())
{
/* 移动一步 */ return 0;
Machine_Step(); }
DelayUs(STEP_DELAY_US);
} /* 一直向左移动直到检测到原点 */
while (!Machine_IsAtOrigin())
return 0; /* 成功到达原点 */ {
} /* 检查限位传感器 */
if (Machine_IsAtLimit())
/** {
* @brief 步进电机从原点移动到中心点 return 1; /* 到达限位点,返回错误 */
* @note 从原点传感器位置向右移动215.0mm到达中心点 }
* @retval 0: 成功, 1: 失败(到达限位点)
*/ /* 防止无限循环 */
uint8_t Machine_MoveToCenter(void) if (stepCount++ > MAX_STEPS_TO_ORIGIN)
{ {
uint32_t steps; return 1; /* 超时,返回错误 */
}
/* 计算需要的步数215.0mm */
steps = Machine_MmToSteps(MOTOR_ORIGIN_DISTANCE); /* 移动一步 */
Machine_Step();
/* 向右移动 */ DelayUs(STEP_DELAY_US);
return Machine_MoveSteps(MOTOR_DIR_CCW, steps); }
}
return 0; /* 成功到达原点 */
/** }
* @brief 步进电机从中心点移动到1#料位置
* @note 从原点215.0mm向左移动22.6mm到达1#料192.4mm /**
* @retval 0: 成功, 1: 失败(到达限位点) * @brief 步进电机从原点移动到中心点
*/ * @note 从原点传感器位置向右移动215.0mm到达中心点
uint8_t Machine_MoveToMaterial1(void) * @retval 0: 成功, 1: 失败(到达限位点)
{ */
uint32_t steps; uint8_t Machine_MoveToCenter(void)
{
/* 计算需要的步数 */ uint32_t steps;
steps = Machine_MmToSteps(DISTANCE_TO_MATERIAL1);
/* 计算需要的步数215.0mm */
/* 向左移动 */ steps = Machine_MmToSteps(MOTOR_ORIGIN_DISTANCE);
return Machine_MoveSteps(MOTOR_DIR_CW, steps);
} /* 向右移动 */
return Machine_MoveSteps(MOTOR_DIR_CCW, steps);
/** }
* @brief 步进电机从中心点移动到2#料位置
* @note 从原点215.0mm向左移动149.6mm到达2#料65.4mm /**
* @retval 0: 成功, 1: 失败(到达限位点) * @brief 步进电机从中心点移动到1#料位置
*/ * @note 从中心点向左移动192.4mm到达1#料
uint8_t Machine_MoveToMaterial2(void) * @retval 0: 成功, 1: 失败(到达限位点)
{ */
uint32_t steps; uint8_t Machine_MoveToMaterial1(void)
{
/* 计算需要的步数 */ uint32_t steps;
steps = Machine_MmToSteps(DISTANCE_TO_MATERIAL2);
/* 计算需要的步数 */
/* 向左移动 */ steps = Machine_MmToSteps(DISTANCE_TO_MATERIAL1);
return Machine_MoveSteps(MOTOR_DIR_CW, steps);
} /* 向左移动 */
return Machine_MoveSteps(MOTOR_DIR_CW, steps);
/** }
* @brief 步进电机从中心点移动到3#料位置
* @note 从原点215.0mm向右移动153.4mm到达3#料61.6mm /**
* @retval 0: 成功, 1: 失败(到达限位点) * @brief 步进电机从中心点移动到2#料位置
*/ * @note 从中心点向左移动65.4mm到达2#料
uint8_t Machine_MoveToMaterial3(void) * @retval 0: 成功, 1: 失败(到达限位点)
{ */
uint32_t steps; uint8_t Machine_MoveToMaterial2(void)
{
/* 计算需要的步数 */ uint32_t steps;
steps = Machine_MmToSteps(DISTANCE_TO_MATERIAL3);
/* 计算需要的步数 */
/* 向右移动 */ steps = Machine_MmToSteps(DISTANCE_TO_MATERIAL2);
return Machine_MoveSteps(MOTOR_DIR_CCW, steps);
} /* 向左移动 */
return Machine_MoveSteps(MOTOR_DIR_CW, steps);
/** }
* @brief 步进电机从中心点移动到4#料位置
* @note 从原点215.0mm向右移动26.4mm到达4#料188.6mm /**
* @retval 0: 成功, 1: 失败(到达限位点) * @brief 步进电机从中心点移动到3#料位置
*/ * @note 从中心点向右移动61.6mm到达3#料
uint8_t Machine_MoveToMaterial4(void) * @retval 0: 成功, 1: 失败(到达限位点)
{ */
uint32_t steps; uint8_t Machine_MoveToMaterial3(void)
{
/* 计算需要的步数 */ uint32_t steps;
steps = Machine_MmToSteps(DISTANCE_TO_MATERIAL4);
/* 计算需要的步数 */
/* 向右移动 */ steps = Machine_MmToSteps(DISTANCE_TO_MATERIAL3);
return Machine_MoveSteps(MOTOR_DIR_CCW, steps);
} /* 向右移动 */
return Machine_MoveSteps(MOTOR_DIR_CCW, steps);
/* USER CODE BEGIN 1 */ }
/* USER CODE END 1 */ /**
* @brief 步进电机从中心点移动到4#料位置
* @note 从中心点向右移动188.6mm到达4#料
* @retval 0: 成功, 1: 失败(到达限位点)
*/
uint8_t Machine_MoveToMaterial4(void)
{
uint32_t steps;
/* 计算需要的步数 */
steps = Machine_MmToSteps(DISTANCE_TO_MATERIAL4);
/* 向右移动 */
return Machine_MoveSteps(MOTOR_DIR_CCW, steps);
}
/**
* @brief 从中心点移动到1#料位置并取料,然后返回中心点放料
* @note 1. 从中心点移动到1#料位置
* 2. 闭合气缸取料
* 3. 返回中心点
* 4. 张开气缸放料
* @retval 0: 成功, 1: 失败(移动失败)
*/
uint8_t Machine_PickMaterial1(void)
{
/* 从中心点移动到1#料位置 */
if (Machine_MoveToMaterial1() != 0)
{
return 1; /* 移动失败 */
}
/* 延时,确保到位 */
DelayUs(10000); /* 10ms延时 */
/* 闭合气缸取料 */
Machine_SetCylinder(1);
DelayUs(100000); /* 100ms延时确保气缸闭合完成 */
/* 从1#料位置返回中心点向左移动192.4mm,返回需要向右移动) */
{
uint32_t steps;
steps = Machine_MmToSteps(DISTANCE_TO_MATERIAL1);
if (Machine_MoveSteps(MOTOR_DIR_CCW, steps) != 0)
{
return 1; /* 返回失败 */
}
}
/* 延时,确保到位 */
DelayUs(10000); /* 10ms延时 */
/* 张开气缸放料 */
Machine_SetCylinder(0);
DelayUs(100000); /* 100ms延时确保气缸张开完成 */
return 0; /* 成功 */
}
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */

View File

@@ -22,7 +22,7 @@
/* Private includes ----------------------------------------------------------*/ /* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */ /* USER CODE BEGIN Includes */
#include "machine.h"
/* USER CODE END Includes */ /* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/
@@ -101,9 +101,14 @@ int main(void)
/* Power-on initialization: Move stepper motor to origin from any position */ /* Power-on initialization: Move stepper motor to origin from any position */
if (Machine_MoveToOrigin() == 0) if (Machine_MoveToOrigin() == 0)
{ {
/* 成功到达原点,移动到中心点(中心点就是原点位置) */ /* 成功到达原点,移动到中心点 */
/* Successfully reached origin, move to center (center is the origin position) */ /* Successfully reached origin, move to center */
Machine_MoveToCenter(); if (Machine_MoveToCenter() == 0)
{
/* 成功到达中心点执行1#料取料流程 */
/* Successfully reached center, execute material 1 picking process */
Machine_PickMaterial1();
}
} }
else else
{ {
@@ -224,6 +229,9 @@ static void MX_GPIO_Init(void)
/*Configure GPIO pin Output Level */ /*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_8, GPIO_PIN_RESET);
/*Configure GPIO pin : PD7 */ /*Configure GPIO pin : PD7 */
GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
@@ -238,6 +246,13 @@ static void MX_GPIO_Init(void)
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
/*Configure GPIO pin : PG8 */
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
/*Configure GPIO pin : PG15 */ /*Configure GPIO pin : PG15 */
GPIO_InitStruct.Pin = GPIO_PIN_15; GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Mode = GPIO_MODE_INPUT;