倔强青铜铜 2025-01-23 12:57 采纳率: 76.5%
浏览 7

stm32驱动28byj步进电机,但是转动角度很大

stm32驱动28byj步进电机,但是转动角度很大,一次脉冲就转了45°,两次反而132°,怎么控制呀

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条回答 默认 最新

  • CLLLLLLY 2025-01-23 13:00
    关注
    很高兴在 CSDN 上回答你的问题,本次回答使用 【豆包】让我们一起探讨,找到解决问题的最佳方案吧。
    以下是对该问题的分析与解决方法:

    问题分析

    • 角度偏差原因
      • 步距角与细分设置:28BYJ - 48型步进电机的步距角为5.625°/64(在无细分驱动情况下,单拍运行步距角为5.625°,如果是四拍运行,步距角为5.625° * 4 = 22.5°),如果一次脉冲转动了45°,很可能是电机的驱动方式或者代码中对步距角的控制出现了问题,没有正确设置细分。
      • 脉冲发送问题:代码中可能没有正确按照电机的驱动时序和步距角要求发送脉冲信号,导致电机转动角度异常。

    解决方法

    • 检查驱动电路和代码中的步距角设置
      • 细分设置:确认驱动芯片(如ULN2003A)是否支持细分功能,如果支持,检查是否正确设置了细分。例如,如果想要实现更小的步距角,可以在驱动芯片上设置细分模式,将步距角细分到更小的角度单位。
      • 代码调整:根据实际需要的步距角来调整代码中的步距角控制逻辑。比如,如果需要步距角为5.625°,则每次脉冲应该使电机转动5.625°对应的步数。
    • 检查脉冲发送逻辑
      • 时序控制:确保Motor_SingleStep函数中的脉冲发送时序与28BYJ - 48电机的驱动时序严格匹配。该电机通常采用四相八拍或四相四拍的驱动方式,需要按照正确的相序和时间间隔发送脉冲。
      • 脉冲计数与角度对应:检查Motor_RotateByStep函数中脉冲数量(step参数)与实际期望转动角度之间的对应关系。确保每一个step值都能准确对应到电机实际转动的角度。

    代码修改示例

    以下是基于上述分析对代码的修改建议:

    // 定义电机步距角(单位:度),这里假设为四相四拍驱动方式,步距角为5.625° * 4 = 22.5°
    #define STEP_ANGLE 22.5 
    
    // 电机转动指定角度函数
    void Motor_RotateByAngle(RotDirection direction, float angle, uint16_t Delay_Time_xms)
    {
        // 根据角度计算需要的步数
        uint32_t step = (uint32_t)(angle / STEP_ANGLE);
        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;
    }
    
    // 主函数中调用示例
    int main(void)
    {
        KEY_Init();
        Motor_Init();
        SysTick_Init();
        // 转动90度,可根据实际需求调整角度和延时时间
        Motor_RotateByAngle(Foreward, 90, 10000); 
        while(1);
    }
    

    通过上述修改,可以更准确地控制电机转动的角度,使其按照预期的步距角进行转动。同时,也需要确保硬件连接和驱动芯片的设置正确无误。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月23日