42线步进电机驱动
·
嵌入式学习日常中使用的基本都舵机,今天我带大家认识一款新的电机--42线步进电机,这个步进电机需要配置驱动板使用
- 步进电机
- 基本结构:由定子和转子组成,定子上有多个绕组,转子通常为永磁体或齿状结构。
- 驱动方式:通过按一定顺序给定子绕组通电,产生旋转磁场,吸引转子一步步转动。每输入一个脉冲信号,电机就转动一个固定的角度(称为 “步距角”),如 1.8°、0.9° 等。
- 转动特性:转动是开环控制,不依赖反馈信号,转动角度与脉冲数量成正比,转速与脉冲频率相关。
- 控制信号:主要通过脉冲信号的频率和数量控制转速和转角,需搭配驱动器使用,驱动器将脉冲信号转换为绕组的通电顺序。
- 精度控制:步距角决定了基本精度,若需要更高精度,可通过细分驱动技术(将一个步距角细分为多个微步)实现。
- 灵活性:可实现连续旋转,常用于需要精确控制角度和位移的场景,但需要外部控制系统(如 PLC、单片机)发送脉冲。
- 步进电机
- 3D 打印机:控制喷头和平台的移动,通过精确的脉冲控制实现毫米级的位移。
- 数控机床:用于坐标轴的进给运动,配合滚珠丝杠将旋转运动转化为直线运动,保证加工精度。
- 自动化生产线:传送带上的定位、分拣机构等,需要根据脉冲信号精确控制移动距离。
- 机器人关节(部分场景):如需要连续旋转或大角度转动的关节,搭配减速器使用。
z
直接上代码 (宏定义的GPIO都需要设置推挽输出)
#include "motor.h"
#include "stm32u5xx_hal.h"
#define MOTOR_PIN_1 GPIO_PIN_11
#define MOTOR_PIN_2 GPIO_PIN_4
#define MOTOR_PIN_3 GPIO_PIN_12
#define MOTOR_PIN_4 GPIO_PIN_15
#define MOTOR_PORT_1 GPIOA
#define MOTOR_PORT_2 GPIOA
#define MOTOR_PORT_3 GPIOB
#define MOTOR_PORT_4 GPIOB
void Motor_One(uint8_t dir, uint16_t speed)
{
if(dir == 0)
{
HAL_GPIO_WritePin(MOTOR_PORT_1, MOTOR_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(MOTOR_PORT_2, MOTOR_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_3, MOTOR_PIN_3, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_4, MOTOR_PIN_4, GPIO_PIN_RESET);
if(speed > 0) HAL_Delay(speed);
HAL_GPIO_WritePin(MOTOR_PORT_2, MOTOR_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(MOTOR_PORT_1, MOTOR_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_3, MOTOR_PIN_3, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_4, MOTOR_PIN_4, GPIO_PIN_RESET);
if(speed > 0) HAL_Delay(speed);
HAL_GPIO_WritePin(MOTOR_PORT_3, MOTOR_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(MOTOR_PORT_1, MOTOR_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_2, MOTOR_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_4, MOTOR_PIN_4, GPIO_PIN_RESET);
if(speed > 0) HAL_Delay(speed);
HAL_GPIO_WritePin(MOTOR_PORT_4, MOTOR_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(MOTOR_PORT_1, MOTOR_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_2, MOTOR_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_3, MOTOR_PIN_3, GPIO_PIN_RESET);
if(speed > 0) HAL_Delay(speed);
}
else
{
HAL_GPIO_WritePin(MOTOR_PORT_4, MOTOR_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(MOTOR_PORT_1, MOTOR_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_2, MOTOR_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_3, MOTOR_PIN_3, GPIO_PIN_RESET);
if(speed > 0) HAL_Delay(speed);
HAL_GPIO_WritePin(MOTOR_PORT_3, MOTOR_PIN_3, GPIO_PIN_SET);
HAL_GPIO_WritePin(MOTOR_PORT_1, MOTOR_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_2, MOTOR_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_4, MOTOR_PIN_4, GPIO_PIN_RESET);
if(speed > 0) HAL_Delay(speed);
HAL_GPIO_WritePin(MOTOR_PORT_2, MOTOR_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(MOTOR_PORT_1, MOTOR_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_3, MOTOR_PIN_3, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_4, MOTOR_PIN_4, GPIO_PIN_RESET);
if(speed > 0) HAL_Delay(speed);
HAL_GPIO_WritePin(MOTOR_PORT_1, MOTOR_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(MOTOR_PORT_2, MOTOR_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_3, MOTOR_PIN_3, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_4, MOTOR_PIN_4, GPIO_PIN_RESET);
if(speed > 0) HAL_Delay(speed);
}
}
void Motor_Stop(void)
{
HAL_GPIO_WritePin(MOTOR_PORT_1, MOTOR_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_2, MOTOR_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_3, MOTOR_PIN_3, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_PORT_4, MOTOR_PIN_4, GPIO_PIN_RESET);
}
void Motor_Rotate_Steps(uint8_t dir, uint16_t speed, uint32_t steps)
{
for(uint32_t i = 0; i < steps; i++) {
Motor_One(dir, speed);
}
Motor_Stop();
}
void Rotate_To(int target_dir, uint16_t speed)
{
int diff=(target_dir-current_direction+360)%360;
uint8_t rotation_dir=1;
if(diff>180)
{
diff=360-diff;
rotation_dir=0;
}
else if(diff==0)
{
return;
}
uint32_t steps=(uint32_t)(diff*STEPS_PER_DEGREE);
for(uint32_t i=0;i<steps;i++)
{
Motor_One(rotation_dir,speed);
}
Motor_Stop();
current_direction=target_dir;
}
// 顺时针旋转到 90 度
Rotate_To(90, 10);
HAL_Delay(1000); // 延时 1 秒
// 逆时针旋转到 0 度
Rotate_To(0, 10);
HAL_Delay(1000);
// 顺时针旋转 180 度(从 0 到 180)
Rotate_To(180, 10);
HAL_Delay(1000);
更多推荐
所有评论(0)