Beaglebone Black GPIO控制运行步进电机的速度非常慢。我怎样才能提高速度?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Beaglebone Black GPIO控制运行步进电机的速度非常慢。我怎样才能提高速度?相关的知识,希望对你有一定的参考价值。
我为Beaglebone Black编写了一个设备驱动程序,只需旋转通过ULN2003A板连接的28BJY-48步进电机。一切正常,电机旋转,但我发现在每个引脚切换到HIGH后电机“捕获”信号后需要使用msleep(1)
。如果我让循环运行没有任何睡眠时间电机没有任何反应。
我想做的是加快电机旋转。
我的逻辑是信号太快而电机无法响应。我知道正在发送信号,因为与电机线圈串联的LED亮起。
我已阅读Elegoo 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个引脚设置为LOW,2个设置为HIGH?在设置另一个高电平之前,我的代码将一个引脚设我想知道我是否可以一步到位。我似乎无法弄清楚这一点。
经过进一步的审查和研究后,我发现问题不在于电压,电机或电路板,而在于我的代码本身。
As per this link我发现msleep的最小限制约为20ms。任何低于20毫秒(在我的情况下,1毫秒)的任何东西都将在20毫秒运行。因此,实现<20ms延迟的正确功能将是以下之一:
usleep_range()
,使用1000-2000的范围,通过更快的旋转使我获得了良好的结果。然而,在握住马达的同时,我觉得它跳了几步,虽然看不见。我认为这可能是电压故障或电机限制。需要进一步分析以排除导致跳绳的原因。
我仍在使用此范围来确定最佳非跳跃范围范围。
udelay()
也可以工作,但是系统似乎在一些永久循环中冻结并且需要硬重启。需要进一步分析以确定在完成旋转循环后究竟导致系统挂起的原因。
以上是关于Beaglebone Black GPIO控制运行步进电机的速度非常慢。我怎样才能提高速度?的主要内容,如果未能解决你的问题,请参考以下文章
Beaglebone Black–GPIO 开关 LED(三极管与继电器实验)
Beaglebone Black教程Beaglebone Black的引脚分配
当通过内核模块访问GPIO2和GPIO3时,为什么我会在Beaglebone Black上出现分段错误?