如何使用MATLB和Arduino控制直流电机

控制/MCU

1815人已加入

描述

在本教程中,我们将向您展示如何使用MATLB 和 Arduino 控制直流电机。

创建用于控制直流电机的 MATLAB 图形用户界面

完成 Arduino for MATLAB 的设置后,我们必须构建 GUI(图形用户界面)来控制直流电机。要启动 GUI,请在命令窗口中键入以下命令

guide

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

直流电机

现在选择三个按钮用于顺时针旋转、逆时针旋转和停止,如下所示,

直流电机

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

直流电机

 

直流电机

您可以根据自己的选择自定义按钮。现在,当您保存此代码时,将在 MATLAB 的编辑器窗口中生成一个代码。要编写Arduino代码以执行与项目相关的任何任务,您必须始终编辑此生成的代码。所以下面我们编辑了 MATLAB 代码。

MATLAB 代码,用于使用 Arduino 控制直流电机

完整的 MATLAB 代码,在针对直流电机控制进行编辑后,在本项目结束时给出。此外,我们在此处包含GUI文件(.fig)和代码文件(.m)以供下载,您可以使用它们根据您的要求自定义按钮。以下是我们对顺时针、逆时针旋转直流电机并使用三个按钮停止所做的一些调整。

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

clear all;

global a;

a = arduino();

直流电机

向下滚动时,您将看到 GUI 中的每个按钮都有三个功能。现在,根据您要在单击时执行的任务在每个函数中编写代码。

在顺时针按钮的函数中,将以下代码复制并粘贴到函数的结束大括号之前,以顺时针方向旋转电机。在这里,我们在引脚 6 处给出 HIGH 和引脚 5 处的 LOW,以顺时针方向旋转电机。

global a;

writeDigitalPin(a, 'D5', 0);

writeDigitalPin(a, 'D6', 1);

pause(0.5);

直流电机

现在,在逆时针按钮的功能中,将以下代码粘贴到函数的末尾以逆时针方向旋转电机。在这里,我们在引脚 5 处给出高电平,在引脚 6 处给出 LOW,以逆时针方向旋转电机。

global a;

writeDigitalPin(a, 'D5', 1);

writeDigitalPin(a, 'D6', 0);

pause(0.5);

直流电机

最后在STOP按钮的功能中,将以下代码粘贴到末尾,以停止电机的旋转。在这里,我们在引脚5和6处给出LOW以停止电机。

global a;

writeDigitalPin(a, 'D5', 0);

writeDigitalPin(a, 'D6', 0);

pause(0.5);

直流电机

所需材料

MATLAB 安装笔记本电脑(偏好:R2016a 或更高版本)

Arduino UNO

直流电动机

L293D- 电机驱动器

电路图

直流电机

 

直流电机

使用 MATLAB 控制直流电机

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

直流电机

MATLAB 可能需要几秒钟才能响应,在 MATLAB 显示 BUSY 指示之前不要单击任何 GUI 按钮,您可以在屏幕的左下角看到,如下所示,

直流电机

一切准备就绪后,单击顺时针或逆时针按钮以旋转电机。当您按下顺时针按钮时,电流流经引脚 6 到引脚 5,电机将顺时针旋转,而逆时针方向电流流过引脚 5 到引脚 6,电机将顺时针方向旋转将顺时针方向旋转。要停止直流电机的旋转,请按停止按钮。同样的方法可以用来控制使用MATLAB的伺服电机,我们只需要相应地编辑代码。

function varargout = DCmotor(varargin)


gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ...

'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @DCmotor_OpeningFcn, ...

'gui_OutputFcn', @DCmotor_OutputFcn, ...

'gui_LayoutFcn', [] , ...

'gui_Callback', []);

if nargin && ischar(varargin{1})

gui_State.gui_Callback = str2func(varargin{1});

end


if nargout

[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

gui_mainfcn(gui_State, varargin{:});

end

function DCmotor_OpeningFcn(hObject, eventdata, handles, varargin)


guidata(hObject, handles);


function varargout = DCmotor_OutputFcn(hObject, eventdata, handles) 


varargout{1} = handles.output;

clear all;

global a;

a = arduino();


function clockwise_Callback(hObject, eventdata, handles)


global a;

writeDigitalPin(a, 'D5', 0);

writeDigitalPin(a, 'D6', 1);

pause(0.5);


function anticlockwise_Callback(hObject, eventdata, handles)


global a;

writeDigitalPin(a, 'D5', 1);

writeDigitalPin(a, 'D6', 0);

pause(0.5);



function stop_Callback(hObject, eventdata, handles)


global a;

writeDigitalPin(a, 'D5', 0);

writeDigitalPin(a, 'D6', 0);

pause(0.5);

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分