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