Beaglebone Black GPIO控制运行步进电机的速度非常慢。如何提高速度?

时间:2017-12-16 02:18:08

标签: c module beagleboneblack gpio stepper

我为Beaglebone Black编写了一个设备驱动程序,只需旋转通过ULN2003A板连接的28BJY-48步进电机。一切正常,电机旋转,但我发现必须在每个引脚切换到高电平后使用msleep(1),以便电机“捕获”#34;信号。如果我让循环运行没有任何睡眠时间,电机没有任何反应。

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

我的逻辑是信号太快,电机无法响应。我知道正在发送信号,因为与电机线圈串联的LED亮起。

我已阅读Elegoo found here for referene提供的数据表和说明。

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

我已将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个引脚设置为LOW,2个设置为HIGH?在设置另一个高电平之前,我的代码将一个引脚设我想知道我是否可以一步到位。我似乎无法解决这个问题。

1 个答案:

答案 0 :(得分:0)

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

As per this link我发现msleep的最小限制约为20ms。任何低于20毫秒(在我的情况下,1毫秒)的任何​​东西都将在20毫秒运行。因此,实现<20ms延迟的适当功能将是以下之一:

usleep_range(),使用1000-2000的范围,通过更快的旋转产生了良好的结果。然而,在握住马达的同时,我觉得它跳了几步,虽然看不见。我认为这可能是电压故障或电机限制。需要进一步分析以排除导致跳绳的原因。

我仍在使用此范围来确定最佳非跳跃范围范围。

udelay()也可以,但是系统似乎在一些永久循环中冻结,需要硬重启。需要进一步分析以确定在完成旋转循环后究竟导致系统挂起的原因。