我为Beaglebone编写了一个设备驱动程序,它简单地旋转我的28BJY-48步进电机,通过ULN2003A板连接。一切工作正常,电机旋转,但我发现有必要使用msleep(1)后,每个引脚切换到高电机“捕获”信号。如果我让循环在没有任何睡眠时间的情况下运行,马达就不会发生任何变化。
我想做的是加快马达的转动速度。
我的逻辑是,信号太快,马达无法响应。我知道信号是发送的,因为发光二极管与电机线圈串联起来了。
我已经阅读了Elegoo 在这里找到供参考提供的数据表和说明。
为了便于理解,我附上了接线图:

我已将P8的下列GPIOs指定为控件:
GPIO11 - IN1 - BLUE wire (coil 4)
GPIO12 - IN2 - PINK wire (coil 3)
GPIO15 - IN3 - YELLOW wire (coil 2)
GPIO16 - IN4 - ORANGE wire (coil 1)我控制GPIOs的方式是使用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个引脚到高引脚?我的代码在设置另一个高点之前先设置一个引脚低。我想知道我能否一步一步地做到这两件事。我好像搞不懂这点。
发布于 2017-12-17 19:45:21
经过进一步的回顾和研究,我发现问题不在于电压、电机或电路板,而在于我的代码本身。
根据这个链接我发现睡眠的最低限度是20毫秒左右。任何低于20 my (在我的例子中,1ms)将运行在20 my。因此,实现<20 of延迟的适当功能如下:
usleep_range()使用了1000到2000的范围,以更快的旋转速度给了我很好的结果.然而,当我握着马达时,我觉得它跳了几步,虽然眼睛看不见它。我认为这要么是电压故障,要么是电动机的限制。需要进一步分析,以排除跳过的原因。
我仍然在玩这个范围,以确定什么是最佳的非跳跃范围。
udelay()也能工作,但是系统似乎冻结在某些永久循环中,并且需要硬重新启动。需要进一步的分析,以确定到底是什么导致系统挂起后,完成旋转循环。
https://stackoverflow.com/questions/47841965
复制相似问题