倔强青铜铜 2025-01-23 12:25 采纳率: 76.5%
浏览 20
已结题

为什么我的步进电机会先反转后正转

为什么我的步进电机会先反转后正转?使用stm32驱动28byj步进电机就成这样了

img


电机代码

void Motor_RotateByStep(RotDirection direction, uint32_t step, uint16_t Delay_Time_xms)
{
    for (uint32_t i = 0; i < step; i ++)
    {
        if (direction == Foreward)    // 电机正传
        {
            StepNum ++;
            if (StepNum > 4)
            {
                StepNum = 1;
            }
        }
        else if (direction == Reversal)    // 电机反转
        {
            StepNum --;
            if (StepNum < 1)
            {
                StepNum = 4;
            }
        }
        Motor_SingleStep(StepNum, Delay_Time_xms);
    }
    Motor_Stop();
    return;
    
}

void Motor_SingleStep(uint8_t Step_Num, uint16_t Delay_Time_xms)
{
    switch(Step_Num)
    {
        case 1:        // A
            GPIO_WriteBit(Motor_port1, Motor_A1, Bit_SET);
            GPIO_WriteBit(Motor_port1, Motor_B1 | Motor_C1 | Motor_D1, Bit_RESET);
        
        break;
        case 2:        // B
            GPIO_WriteBit(Motor_port1, Motor_B1, Bit_SET);    
            GPIO_WriteBit(Motor_port1, Motor_A1 | Motor_C1 | Motor_D1, Bit_RESET);
        break;            
        case 3:        // C
            GPIO_WriteBit(Motor_port1, Motor_C1, Bit_SET);    
            GPIO_WriteBit(Motor_port1, Motor_A1 | Motor_B1 | Motor_D1, Bit_RESET);
        break;
        case 4:        // D
            GPIO_WriteBit(Motor_port1, Motor_D1, Bit_SET);
            GPIO_WriteBit(Motor_port1, Motor_A1 | Motor_B1 | Motor_C1, Bit_RESET);
        break;
        default: break;
    }
    delay_ms(Delay_Time_xms);    // 延时,控制电机速度
    //Motor_Stop();                // 断电,防止电机过热
}

主函数

    KEY_Init();
    Motor_Init();
    SysTick_Init();
    Motor_RotateByStep(Foreward ,2,10000);    
  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2025-01-23 12:35
    关注

    中午好🌞🌞🌞
    本答案参考通义千问

    根据你的描述和提供的代码,步进电机在开始时会反转然后才正转。这可能是由于StepNum的初始值设置不当或者在Motor_RotateByStep函数中没有正确处理方向变化。让我们逐步分析问题并提出解决方案。

    分析问题

    1. StepNum的初始值

      • StepNum变量用于跟踪当前步进电机的状态。如果StepNum的初始值不正确,可能会导致电机在开始时的行为不符合预期。
    2. StepNum的更新逻辑

      • Motor_RotateByStep函数中,StepNum在正转和反转时的更新逻辑可能存在问题。例如,当directionReversal时,StepNum递减,但如果StepNum已经为1,则将其设置为4。这可能导致电机在某些情况下出现反转行为。

    解决方案

    1. 确保StepNum的初始值正确

      • 确保在初始化时将StepNum设置为正确的初始值。通常,步进电机的初始状态应该是第一步(即StepNum为1)。
    2. 调整StepNum的更新逻辑

      • 修改StepNum的更新逻辑,以确保在正转和反转时都能正确地移动到下一个或上一个步骤。

    修改后的代码

    // 初始化StepNum
    uint8_t StepNum = 1;
    
    void Motor_RotateByStep(RotDirection direction, uint32_t step, uint16_t Delay_Time_xms)
    {
        for (uint32_t i = 0; i < step; i++)
        {
            if (direction == Foreward)    // 电机正传
            {
                StepNum = (StepNum % 4) + 1; // 确保StepNum在1到4之间循环
            }
            else if (direction == Reversal)    // 电机反转
            {
                StepNum = (StepNum - 2) % 4 + 1; // 确保StepNum在1到4之间循环
            }
            Motor_SingleStep(StepNum, Delay_Time_xms);
        }
        Motor_Stop();
        return;
    }
    
    void Motor_SingleStep(uint8_t Step_Num, uint16_t Delay_Time_xms)
    {
        switch (Step_Num)
        {
            case 1:        // A
                GPIO_WriteBit(Motor_port1, Motor_A1, Bit_SET);
                GPIO_WriteBit(Motor_port1, Motor_B1 | Motor_C1 | Motor_D1, Bit_RESET);
                break;
            case 2:        // B
                GPIO_WriteBit(Motor_port1, Motor_B1, Bit_SET);
                GPIO_WriteBit(Motor_port1, Motor_A1 | Motor_C1 | Motor_D1, Bit_RESET);
                break;
            case 3:        // C
                GPIO_WriteBit(Motor_port1, Motor_C1, Bit_SET);
                GPIO_WriteBit(Motor_port1, Motor_A1 | Motor_B1 | Motor_D1, Bit_RESET);
                break;
            case 4:        // D
                GPIO_WriteBit(Motor_port1, Motor_D1, Bit_SET);
                GPIO_WriteBit(Motor_port1, Motor_A1 | Motor_B1 | Motor_C1, Bit_RESET);
                break;
            default:
                break;
        }
        delay_ms(Delay_Time_xms);    // 延时,控制电机速度
        //Motor_Stop();                // 断电,防止电机过热
    }
    

    说明

    • StepNum初始化:在全局范围内初始化StepNum为1。
    • StepNum更新逻辑
      • 正转时,使用 (StepNum % 4) + 1 确保StepNum在1到4之间循环。
      • 反转时,使用 (StepNum - 2) % 4 + 1 确保StepNum在1到4之间循环。

    通过这些修改,可以确保步进电机在正转和反转时都能按照预期顺序移动。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月31日
  • 已采纳回答 1月23日
  • 创建了问题 1月23日