如何使用MATLAB和Arduino控制步进电机

在上一篇文章:“如何使用MATLB和Arduino来控制直流电动机”中,我们了解了使用MATLAB如何通过Arduino来控制直流电机。今天我们一起来研究一下使用MATLAB通过Arduino如何控制步进电机。步进电机是一种无刷直流电机,它是许多精密运动控制场景的最佳选择,因为步进电机适用于定位、速度控制和需要高扭矩的场景。

步进电动机的运行方式

在了解控制编码之前,我们先了解一下步进电机的工作或运行。由于微步模式的定子是由不同的线圈组成的,所以每一组线圈可以通过不同的方法激活,这使得电机可以在许多不同的模式中工作。更多关于步进电机的运行可参阅:Arduino通过L293D驱动28BYJ-48步进电机

创建MATLAB图形界面

我们首先构建一个GUI(图形用户界面)用于控制步进电机。要启动GUI,请在命令窗口中输入下面的命令:

guide

命令执行后将弹出一个窗口,然后选择“ blank GUI”,如下图所示,

MATLAB创建GUI

然后创建两个开关按钮来控制步进电机顺时针和逆时针旋转

MATLAB控制步进电机按钮

要调整按钮的大小或改变形状,只需点击它,然后就可以拖动改变大小了。设置按钮的更多属性可以通过双击它,在弹出的菜单中可以改变按钮的颜色、名称和标签。

MATLAB GUI修改按钮属性

这些操作和MATLAB通过Arduino控制直流电机完全一致,这里不再细说。下图是创建好的按钮:

MATLAB控制步进电机按钮

用MATLAB编写的用于控制步进电机的代码

同样的,为了确保Arduino每次运行.m文件时都能与MATLAB对话,我们需要在.m文件的74行粘贴下面的代码到图示位置:

clear all;
global a;
a = arduino();

编译MATLAB代码(.m)文件

向下滚动代码,我们会看到GUI中创建的两个按钮的函数。现在,根据按钮单击时要执行动作在函数中编写代码。

在“ Clockwise button’s function”中,将下面的代码粘贴到函数的末尾,以控制电机顺时针方向旋转。为了使步进电机按顺时针方向连续旋转,我们使用了while循环来实现电机的全步模式(full mode steps)。

while get(hObject,'Value')
global a;
writeDigitalPin(a, 'D8', 1);
writeDigitalPin(a, 'D9', 0);
writeDigitalPin(a, 'D10', 0);
writeDigitalPin(a, 'D11', 1);
pause(0.0002);
writeDigitalPin(a, 'D8', 0);
writeDigitalPin(a, 'D9', 0);
writeDigitalPin(a, 'D10', 1);
writeDigitalPin(a, 'D11', 1);
pause(0.0002);
writeDigitalPin(a, 'D8', 0);
writeDigitalPin(a, 'D9', 1);
writeDigitalPin(a, 'D10', 1);
writeDigitalPin(a, 'D11', 0);
pause(0.0002);
writeDigitalPin(a, 'D8', 1);
writeDigitalPin(a, 'D9', 1);
writeDigitalPin(a, 'D10', 0);
writeDigitalPin(a, 'D11', 0);
pause(0.0002);
end

MATLAB控制步进电机顺时针旋转

在“ Anti-clockwise button’s function”中,将下面的代码粘贴到函数的末尾,以控制电机逆时针方向旋转。为了使步进电机按顺时针方向连续旋转,我们依然采用while循环来实现电机的全步模式(full mode steps)。

while get(hObject,'Value')
global a;
writeDigitalPin(a, 'D8', 1);
writeDigitalPin(a, 'D9', 1);
writeDigitalPin(a, 'D10', 0);
writeDigitalPin(a, 'D11', 0);
pause(0.0002);
writeDigitalPin(a, 'D8', 0);
writeDigitalPin(a, 'D9', 1);
writeDigitalPin(a, 'D10', 1);
writeDigitalPin(a, 'D11', 0);
pause(0.0002);
writeDigitalPin(a, 'D8', 0);
writeDigitalPin(a, 'D9', 0);
writeDigitalPin(a, 'D10', 1);
writeDigitalPin(a, 'D11', 1);
pause(0.0002);
writeDigitalPin(a, 'D8', 1);
writeDigitalPin(a, 'D9', 0);
writeDigitalPin(a, 'D10', 0);
writeDigitalPin(a, 'D11', 1);
pause(0.0002);
end

MATLAB控制步进电机逆时针旋转

测试元件

  • Arduino UNO
  • Stepper Motor (28BYJ-48, 5VDC)
  • ULN2003 – 步进电机驱动

测试电路连接图

Arduino ULN2003 步进电机电路连接图

用MATLAB控制步进电机

根据电路连接图连接好硬件之后,我们只需单击MATLAB 的“run” 按钮,即可执行已编译好的.m文件。这些步骤依然和控制直流电机完全一致。当在屏幕的左下方看到“Busy”标志后,点击顺时针或逆时针按钮,观察步进电机的工作状态是否正常,详细内容请参考:如何使用MATLB和Arduino来控制直流电动机一文。