Beaglebone Black GPIO 控制 运行 步进电机非常慢。我怎样才能提高速度?

Beaglebone Black GPIO control running stepper motor very slowly. How can I improve speed?

我已经为 Beaglebone Black 编写了一个设备驱动程序,它可以简单地旋转通过 ULN2003A 板连接的 28BJY-48 步进电机。一切正常,电机旋转,但我发现有必要在每个引脚切换到高电平后使用 msleep(1) 以使电机向 "capture" 信号。如果我让循环 运行 没有任何睡眠时间,电机什么也不会发生。

我想做的是加快电机旋转速度。

我的逻辑是信号太快,电机反应不过来。我知道信号正在发送,因为与电机线圈串联的 LED 灯亮了。

我已经阅读了Elegoo提供的数据sheet和说明found here for referene

为了便于理解,附上接线图:

我已经分配了P8的以下GPIO作为控制:

GPIO11 - IN1 - BLUE wire (coil 4)
GPIO12 - IN2 - PINK wire (coil 3)
GPIO15 - IN3 - YELLOW wire (coil 2)
GPIO16 - IN4 - ORANGE wire (coil 1)

我控制 GPIO 的方法是使用 ioremap()

这里是控制电机的代码部分:

static ssize_t motor_rotate(int i) { //0 rotates right, 1 rotates left
    int c = 0;

    motor_stop();

    while(c < 2000) 
    {   
        *gpio_dataout_addr |= PIN11;
        //msleep(1);
        *gpio_dataout_addr &= (0xFFFFFFFF ^ PIN16);
        *gpio_dataout_addr |= PIN12;
        //msleep(1);
        *gpio_dataout_addr &= (0xFFFFFFFF ^ PIN11);
        *gpio_dataout_addr |= PIN15;
        //msleep(1);
        *gpio_dataout_addr &= (0xFFFFFFFF ^ PIN12);
        *gpio_dataout_addr |= PIN16;
        //msleep(1);
        *gpio_dataout_addr &= (0xFFFFFFFF ^ PIN15);

        c++;
    }

    motor_stop();

    return 0;   
}

static ssize_t motor_stop(void){
    *gpio_dataout_addr &= (0xFFFFFFFF ^ (PIN11 | PIN12 | PIN15 | PIN16));

    return 0;
}

我的电机连接到独立于 Beaglebone 的 5v 电源。对正确方向的任何帮助或指示表示赞赏。

附带说明一下,有没有办法同时将 2 个引脚设置为低电平并将 2 个引脚设置为高电平?我的代码在设置另一个高之前将一个引脚设置为低电平。我想知道我是否可以一步完成。我似乎无法弄清楚。

经过进一步的审查和研究,我发现问题不在于电压、电机或电路板,而在于我的代码本身。

As per this link 我发现 msleep 的最小限制约为 20ms。任何低于 20 毫秒(在我的例子中是 1 毫秒)的东西都将是 运行 在 20 毫秒。因此,实现 <20 毫秒延迟的正确函数将是以下之一:

usleep_range(),使用 1000-2000 的范围,我得到了一个很好的结果,旋转速度更快。然而,在握住电机时,我感觉它跳过了几步,尽管肉眼看不见。我认为这是电压故障或电机限制。需要进一步分析以排除导致跳过的原因。

我还在研究这个范围以找出最佳的非跳跃范围。

udelay() 也有效,但系统似乎在某个永久循环中冻结,需要硬重启。需要进一步分析以找出究竟是什么导致系统在轮换循环完成后挂起。