1

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

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

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

我已阅读 Elegoo 提供的数据表和说明,可在此处找到参考资料。

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

我已将 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 个引脚设置为高电平?我的代码在设置另一个高电平之前将一个引脚设置为低电平。我想知道我是否可以一步完成。我似乎无法弄清楚。

4

1 回答 1

0

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

根据此链接,我发现 msleep 的最小限制约为 20 毫秒。任何低于 20 毫秒(在我的情况下为 1 毫秒)的时间都将以 20 毫秒运行。因此,实现 <20ms 延迟的适当功能将是以下之一:

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

我仍在玩这个范围以找出最佳的非跳过范围范围。

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

于 2017-12-17T19:45:21.443 回答