
铭牌参数
-
57HD5401... :开头的 "57" 代表电机的法兰盘尺寸是
。
-
1.8° :步进角 。意思是 STM32 每给一个脉冲,电机就精准转动
。电机转一整圈
需要
个脉冲。
-
3.0A :额定电流 。这非常重要,意味着你选用的驱动器,输出电流必须能达到或超过 3.0A,否则电机没力气,夹持器剪不动东西
驱动器:DM542 或 DM556 数字步进电机驱动器
第一步:连线
AUBOS → TM32 → 驱动器 → 步进电机
1. AUBO 机械臂 ──> STM32 控制板(输入信号)
-
AUBO Tool DO0 (夹持) ──> 光耦隔离(24V转3.3V) ──> STM32 GPIO (如 PB0)
-
AUBO Tool DO1 (剪切) ──> 光耦隔离(24V转3.3V) ──> STM32 GPIO (如 PB1)
-
AUBO Tool DO2 (复位) ──> 光耦隔离(24V转3.3V) ──> STM32 GPIO (如 PB2)
-
AUBO Tool DO3 (停止) ──> 光耦隔离(24V转3.3V) ──> STM32 GPIO (如 PB3)
-
AUBO Tool GND ──> 连到光耦模块的 24V 地
2. STM32 控制板 ──> 步进驱动器(共阴极接法)
最常用的共阴极接法(驱动器的信号负极全部拧在一起接 STM32 的 GND)
|----------------------|----------------|------------------------|
| STM32 侧连接引脚 | 驱动器控制端口 | 功能说明 |
| STM32 的 定时器 PWM 输出引脚 | PUL+ (or CLK+) | 脉冲信号:给一个脉冲,电机转一步 |
| STM32 GND | PUL-和DIR- | 拧在一起接控制板地 |
| STM32 GPIO 引脚 | DIR+ (or CW+) | 方向信号:高电平顺时针,低电平逆时针 |
3. 驱动器 ──> 57步进电机 & 电源
电机出来的四根线(红、黄、绿、蓝)和供电电源接到驱动器标有 Power/Motor 的端口上:
| 驱动器端口 | 连接目标 | 说明 |
|---|---|---|
| V+ | 外接直流电源正极(建议 24V - 36V) | 别接 5V,步进电机在高电压下才有力气 |
| GND | 外接直流电源负极 | 电源地 |
| A+ | 电机 红线(通常) | 电机 A 相正(若反转,对调 A+ A- 即可) |
| A- | 电机 绿线(通常) | 电机 A 相负 |
| B+ | 电机 黄线(通常) | 电机 B 相正 |
| B- | 电机 蓝线(通常) | 电机 B 相负 |
确定电机的 A/B 相:用万用表测电阻,有阻值的两根线是一组(比如红绿通,它们就是 A+/A-;黄蓝通,它们就是 B+/B-)
第二步:STM32 控制逻辑
对于步进电机来说,它无法直接反馈电流或扭矩
cpp
// ==================== 底层步进电机驱动函数 ====================
// 设定方向:0为张开(OPEN),1为闭合(CLOSE)
void motor_set_dir(uint8_t dir) {
if (dir == 0) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // DIR低电平
} else {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // DIR高电平
}
}
// 让步进电机走 1 步 (通过翻转引脚产生一个脉冲)
// speed_delay 越小,脉冲越快,电机转速越高
void motor_step(uint32_t speed_delay) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
delay_us(speed_delay);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
delay_us(speed_delay);
}
// ==================== 四个核心动作 ====================
// 1. 夹持动作 (使用中等速度,靠力传感器或最大步数限制停止)
void clamp_action()
{
state = CLAMPING;
motor_set_dir(1); // 设为闭合方向
uint32_t steps_taken = 0;
const uint32_t MAX_CLAMP_STEPS = 5000; // 安全上限步数,防止死卡
while (state == CLAMPING)
{
// 走一步
motor_step(200); // 延迟200us,速度适中
steps_taken++;
// 读取传感器 (完全保留你博客的逻辑)
float force = read_force_sensor();
if (force > FORCE_LIMIT) {
// 抓紧了,停止
state = IDLE;
break;
}
if (steps_taken >= MAX_CLAMP_STEPS) {
// 没抓到东西,但机械结构到头了,停止
state = IDLE;
break;
}
if (READ_STOP_CMD()) { // 收到急停
stop_action();
break;
}
}
}
// 2. 剪切动作 (高速度、大力量,强行走到设定的剪切脉冲终点)
void cut_action()
{
state = CUTTING;
motor_set_dir(1); // 设为闭合方向
uint32_t steps_taken = 0;
// 根据剪刀结构算好:剪断需要步进电机走多少步(例如转3圈 = 200步/圈 * 3 = 600步)
const uint32_t CUT_END_STEPS = 3000;
while (state == CUTTING)
{
motor_step(100); // 延迟100us,高速强力剪切
steps_taken++;
if (steps_taken >= CUT_END_STEPS) {
// 剪切完成
state = IDLE;
// 剪完自动复位
reset_action();
break;
}
if (READ_STOP_CMD()) {
stop_action();
break;
}
}
}
// 3. 复位动作 (反转,直到撞到物理限位开关 HOME_SWITCH 停止)
void reset_action()
{
state = RESETTING;
motor_set_dir(0); // 设为打开方向
// 只要没压到复位限位开关,就一直往回转
while (!READ_CLAMP_HOME_SWITCH())
{
motor_step(200); // 中速复位
if (READ_STOP_CMD()) {
stop_action();
return;
}
}
// 撞到开关,停止电机,复位完成
state = IDLE;
}
// 4. 停止动作 (立刻切断所有控制)
void stop_action()
{
state = STOPPED;
// 步进电机停止发送脉冲即为停止
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
// 如果驱动器接了 ENA (使能) 引脚,可以给使能信号让电机完全断电完全松开
// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
error_flag = EMERGENCY_STOP;
}
第三步:调试上电顺序
为了防止机械剪刀在上电瞬间乱晃打伤人或损坏结构,请务必遵循以下调试顺序:
-
首次测试脱开机械连杆:先把电机从红色的 3D 打印剪刀座上拆下来(只让电机光轴转),防止代码写错导致连杆疯狂对撞死卡。
-
测试方向 :运行
clamp_action(),观察电机是顺时针转还是逆时针转。如果方向反了,不需要改代码 ,直接把电机接线里的A+和A-对调一下即可。 -
标定步数与速度:
-
逐步调整
motor_step(speed_delay)里的延迟时间。如果电机发出呜呜声但不转,说明速度给太快了(步进电机启动需要高载荷慢速),把延迟加大(如改为 300 或 500)。 -
手动数一下夹爪从完全张开到闭合,电机一共转了多少圈,乘以每圈的脉冲数,填入代码里的
MAX_CLAMP_STEPS和CUT_END_STEPS。
-
-
装回连杆联调:确信限位开关(Home Switch)和力传感器能正常触发停止后,再把电机装回红色机构上进行整体测试。