嵌入式学习日常中使用的基本都舵机,今天我带大家认识一款新的电机--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);

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐