风筝
发表于: 2018-10-10 10:06:58 | 显示全部楼层

步进电机是一种无刷直流电机,可以分步旋转,是许多精密运动控制应用的最佳选择。此外,步进电机适用于定位、速度控制和低速需要大扭矩的应用。


在之前的MATLAB教程中,我们已经介绍了如何使用MATLAB来控制直流电机、伺服电机和家用电器。今天我们将学习如何使用MATALB和Arduino开发板控制步进电机。如果您是MATLAB的新手,那么建议您先学习使用MATLAB开始简单的LED闪烁程序。


步进电机的工作模式

在开始步进电机的相关代码之前,您应该了解步进电机的工作或旋转概念。由于步进模式的定子由不同的线圈对构成,因此每个线圈对可以以许多不同的方法激励,这使得模式能够以许多不同的模式驱动。以下是相对宽泛的分类:

●  全步模式(Full Step)

在全步激励模式下,我们可以以最小的匝数(步长)实现完整的360°旋转。但这会导致惯性减小,旋转也不会平滑。在全步激励中还有两个分类,它们是一个相位接通方波步进和两个相位接通方波步进模式。

STEPPER-MOTOR-28BYJ-48-Pinout.jpg

1.    一个相位步进或波形步进:在此模式下,只有电机的一个端子(相位)将在任何给定时间通电。这具有较少的步数,因此可以实现完整的360°旋转。由于步数较少,因此该方法消耗的电流也非常低。下表显示了4相步进电机的波形步进顺序

步数
相位1(蓝色)
相位2(粉红色)
相位3(黄色)
相位4(橙色)
1
1
0
0
0
2
0
1
0
0
3
0
0
1
0
4
0
0
0
1

2.   两相步进:正如该方法中的名称所示,两个相位将是一个步数。它具有与波形步进相同的步数,但由于一次有两个线圈通电,因此与先前的方法相比可以提供更好的扭矩和速度。但是一个缺点是这种方法也消耗更多的功耗。

步数
相位1(蓝色)
相位2(粉红色)
相位3(黄色)
相位4(橙色)
1
1
0
0
0
2
0
1
0
0
3
0
0
1
0
4
0
0
0
1

●  半步模式

半步模式是一个相位接通模式和两个相位接通模式的组合。这种组合将帮助我们克服两种模式的上述缺点。

正如您可能已经猜到的那样,因为我们将两种方法结合起来,我们将在此方法中执行8步以获得完整的旋转。下面显示的4相步进电机的切换顺序:

步数
相位1(蓝色)
相位2(粉红色)
相位3(黄色)
相位4(橙色)
1
1
0
0
0
2
0
1
0
0
3
0
1
0
0
4
0
1
1
0
5
0
0
1
0
6
0
0
1
1
7
0
0
0
1
8
1
0
0
1

因此,您可以选择在任何模式下对步进电机进行编程,但我更喜欢两相步进步进模式。因为这种方法比单相方法提供更快的速度,并且与半模式相比,由于两相方法中的步骤数量较少,所以代码量较少。


创建用于控制步进电机的MATLAB图形用户界面

然后我们必须构建GUI(图形用户界面)来控制步进电机。要启动GUI,请在命令窗口中键入以下命令

  1. guide
复制代码

将打开一个弹出窗口,然后选择新的空白GUI,如下图所示,

Creating-GUI-in-MATLAB.png


现在选择两个切换按钮,用于顺时针旋转步进电机和逆时针旋转,如下图所示,

Toggle-Button-in-MATLAB-GUI.png

要调整大小或更改按钮的形状,只需单击它,您就可以拖动按钮的边角。通过双击切换按钮,您可以更改该特定按钮的颜色、字符串和标记。我们定制了两个按钮,如下图所示。

GUI-Inspector-for-Changing-Tag-strings-and-color.png

MATLAB-GUI-for-Stepper-Motor-Control.png


您可以根据自己的选择自定义按钮。现在当你保存它时,在MATLAB的Editor窗口中生成一个代码。要对Arduino进行代码以执行与项目相关的任何任务,您始终必须编辑此生成的代码。所以下面我们编辑了MATLAB代码。您可以在MATLAB入门教程中了解有关命令窗口、编辑器窗口等的更多信息。


使用Arduino控制步进电机的MATLAB代码

控制步进电机的完整MATLAB代码在本文末尾处给出。此外,我们在这里包含GUI文件(.fig)和代码文件(.m)供下载(右键单击链接然后选择“将链接保存为...”),使用它可以根据您的要求自定义按钮。下面是我们使用两个切换按钮顺时针和逆时针旋转步进电机所做的一些调整。


复制并粘贴以下代码到74行代码,确保每次运行m文件时Arduino正在与MATLAB通信。

  1. clear all;
  2. global a;
  3. a = arduino();
复制代码

IInitializing-Arduino-in-MATLAB.png

向下滚动时,您将看到为GUI中的两个按钮创建了两个函数。现在根据要单击的任务在两个函数中编写代码。

在顺时针按钮的函数中,在函数末尾处复制并粘贴以下代码,使电机顺时针旋转。为了顺时针方向连续旋转步进电机,我们使用while循环重复顺时针方向的两个相位步进完全模式步骤。

  1. while get(hObject,'Value')
  2. global a;
  3. writeDigitalPin(a, 'D8', 1);
  4. writeDigitalPin(a, 'D9', 0);
  5. writeDigitalPin(a, 'D10', 0);
  6. writeDigitalPin(a, 'D11', 1);
  7. pause(0.0002);
  8. writeDigitalPin(a, 'D8', 0);
  9. writeDigitalPin(a, 'D9', 0);
  10. writeDigitalPin(a, 'D10', 1);
  11. writeDigitalPin(a, 'D11', 1);
  12. pause(0.0002);
  13. writeDigitalPin(a, 'D8', 0);
  14. writeDigitalPin(a, 'D9', 1);
  15. writeDigitalPin(a, 'D10', 1);
  16. writeDigitalPin(a, 'D11', 0);
  17. pause(0.0002);
  18. writeDigitalPin(a, 'D8', 1);
  19. writeDigitalPin(a, 'D9', 1);
  20. writeDigitalPin(a, 'D10', 0);
  21. writeDigitalPin(a, 'D11', 0);
  22. pause(0.0002);
  23. end
复制代码

Code-for-rotating-stepper-motor-in-clockwise-direction.png


现在在逆时针按钮的函数中,将以下代码粘贴到函数的位置,以逆时针方向旋转电机。为了以逆时针方向连续旋转步进电机,我们使用while循环重复逆时针方向的两个相位步进完全模式步骤。

  1. while get(hObject,'Value')
  2. global a;
  3. writeDigitalPin(a, 'D8', 1);
  4. writeDigitalPin(a, 'D9', 1);
  5. writeDigitalPin(a, 'D10', 0);
  6. writeDigitalPin(a, 'D11', 0);
  7. pause(0.0002);
  8. writeDigitalPin(a, 'D8', 0);
  9. writeDigitalPin(a, 'D9', 1);
  10. writeDigitalPin(a, 'D10', 1);
  11. writeDigitalPin(a, 'D11', 0);
  12. pause(0.0002);
  13. writeDigitalPin(a, 'D8', 0);
  14. writeDigitalPin(a, 'D9', 0);
  15. writeDigitalPin(a, 'D10', 1);
  16. writeDigitalPin(a, 'D11', 1);
  17. pause(0.0002);
  18. writeDigitalPin(a, 'D8', 1);
  19. writeDigitalPin(a, 'D9', 0);
  20. writeDigitalPin(a, 'D10', 0);
  21. writeDigitalPin(a, 'D11', 1);
  22. pause(0.0002);
  23. end
复制代码

Code-for-rotating-stepper-motor-in-anti-clockwise-direction.png


所需的材料

●    安装MATLAB笔记本电脑

●    Arduino UNO开发板

●    步进电机(28BYJ-48,5VDC)

●    ULN2003 - 步进电机驱动器


电路原理图

Circuit-Diagram-for-Stepper-motor-control-using-Arduino-and-MATLAB.png

Stepper-Motor-Control-using-MATLAB-and-Arduino.jpg


用MATLAB控制步进电机

根据电路图设置硬件后,只需单击运行按钮即可在.m文件中运行编辑后的代码

Run-MATLAB-GUI.png

MATLAB可能需要几秒钟的时间来响应,不要点击任何GUI按钮,直到MATLAB在左下角显示忙消息,如下所示,

Processing-MATLAB-GUI-Program.png


一切准备就绪后,顺时针或逆时针方向按钮旋转电机。 当我们使用切换按钮时,步进电机将以顺时针方向连续移动,直到我们再次按下按钮。 同样,按下逆时针切换按钮,电机开始逆时针旋转,直到我们再次按下按钮。

Stepper-Motor-in-action-using-MATLAB-and-Arduino.jpg


代码

本篇文章的完整代码如下所示: main.rar (539 Bytes, 下载次数: 123)

跳转到指定楼层
F22A
发表于: 2020-1-8 16:45:35 | 显示全部楼层

请问楼主,为什么用的和您一样的程序,每次都这样都报错?头疼
出错 untitled1>clockwise_Callback (line 87)
writeDigitalPin(a, 'D8', 1);

出错 gui_mainfcn (line 95)
        feval(varargin{:});

出错 untitled1 (line 42)
    gui_mainfcn(gui_State, varargin{:});

出错
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)untitled1('clockwise_Callback',hObject,eventdata,guidata(hObject))
错误使用 arduino (line 66)
计算 UIControl Callback 时出错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-23 03:23 , Processed in 0.039465 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表