如何通过MATLAB将Arduino暂停1毫秒?


8

我已经可以使用以下代码行将MATLAB连接到我的Uno:a = arduino('COM4');通过以下软件包:Arduino的Matlab支持软件包

现在,MATLAB是我的主要脚本,它将同步所有组件(例如Arduino)。

我可以通过以下方式向我的步进电机发送脉冲:

void loop() {
    digitalWrite(2, HIGH);
    delay(1);
    digitalWrite(2, LOW);
    delay(1);
}

这样可以很好地工作,并使电动机每2毫秒移动一次。我的问题是我找不到通过MATLAB接口产生相同延迟的方法。我确实知道MATLAB具有pause()功能,但是当我在MATLAB中设置像这样的循环时:

a = arduino('COM4');
for m = 1:400
    a.digitalWrite(2, 1);
    pause(0.001);
    a.digitalWrite(2, 0);
    pause(0.001);
end

每个步骤花费的时间更长-每个步骤大约200毫秒。

在发送到Arduino的数字高/低之间创建停顿还有什么其他选择?如果我可以通过Arduino控制Matlab的结果,那就太好了。


听起来您需要像GRBL这样的东西。它是arduino板的独立程序,可解释命令语言并产生协调的步进电机运动。它主要用于CNC加工,但可以满足您的需求。
康纳·沃尔夫

Answers:


6

观察到的延迟增加是由于将命令从MATLAB发送到Arduino使其代码执行所请求的命令所花费的时间。您的情况是a.digitalWrite。因此,使用MATLAB的延迟,脉冲之间的实际时间为0.001暂停加上波特率时间乘以数据包大小,然后解码执行。

我建议不要采用MATLAB远程控制步进电机定时的解决方案。由于这种潜在的耦合将是一个令人沮丧的局限性。注意,对于步进电机而言,定时无法提供这种潜在的执行力。因此,所有3D打印机和许多带有步进电机的CNC都使用Arduino的Arduino,它们会获得G代码(带有目标的电机移动命令),并且实时固件会在公差范围内处理步进。

我建议使用带有步进电机护罩的grbl固件,然后让MATLAB发送所需的G代码。还有其他功能更多但针对3d打印量身定制的地方。grbl更加简单直接,可以直接移动电动机。


0

从您的问题尚不清楚,您是要获取没有延迟的实时执行,还是只是想通过MATLAB调整电机延迟时间。如果是后者,一个好方法是发送延迟数据(例如,代表您希望在脉冲之间间隔多长时间的数字)或串行数据,您的Arduino程序将接收该数据并根据需要更新电动机延迟。或者,考虑到RAM的限制,您可以发送完整的延迟序列,这些延迟可以精确的时序一个接一个地运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.