基于NodeMCU-ESP8266开发板控制步进电机驱动实验

第1节 概述

1.1 步进电机应用

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

1相励磁、2相励磁和1-2相励磁方式如下图 1所示。

步进电机驱动方式:

  1. 1相励磁法:每一瞬间只有一个线圈导通,其他线圈休息。其特点是励磁方法简单,耗电低,精确度良好。但是力矩小、震动大,每次励磁信号走的角度是标称角度。
  2. 2相励磁法:每一瞬间有两个线圈同时导通,特点是力矩大、震动较小,每次励磁转动角度是标称角度。
  3. 1-2相励磁法:1相和2相轮流交替导通,精度较高,且运转平滑。每送一个励磁信号转动二分之一标称角度。有称为半步驱动。4相电机中,1、2种方式称4相4拍,3种称4相8拍。

1 励磁法

步进电机种类很多。ULN2003只能驱动单极电机,也就是有中间抽头,电流只有一个方向流向。双极电机需要H桥驱动,每个线圈可以正反向施加电压。如图 2所示,是我本次实验所使用的步进电机。注意:通过该步进电机使用的是5V DC电源。

2 步进电机

1.2 ULN2003达林顿管阵列

ULN2003达林顿管阵列,宽范围电源供电,大电流输出,适应性较广,内部集成包含二极管,是应用驱动喇叭,电机,继电器等功率器件。

B站学习链接:快速上手ULN2003达林顿管阵列,并学会控制步进电机【IC原来如此】_哔哩哔哩_bilibili新手向回避专业术语的介绍视频,在诸多粉丝的建议下,这次为大家带来了ULN2003达林顿管阵列。除此之外我还收到了非常多粉丝的提议,非常感谢大家,我全部都记录下来了。被采纳的芯片提议需要一些时间收集资料,购买和实验。欢迎持续关注嘉频道。视频公开后我会以最快速度上字幕,请给我半小时到一小时时间。在这个期间内观看视频可能没有字幕。如果有改进意见欢迎在评论区提出,谢谢大家啦。, 视频播放量 56640、弹幕量 50、点赞数 2492、投硬币枚数 1601、收藏人数 1762、转发人数 167, 视频作者 嘉频道, 作者简介 新人UP主,感觉有点紧张( ・ิω・ิ),相关视频:10分钟学会达林顿管与ULN2003,我们耳熟能详的ULN2003芯片,达林顿的缺点,提高开关速度,只需要这个电阻,各系列单片机 控制ULN2003步进电机 28BYJ-48步进电机 13003驱动器,达林顿管工作原理Darlington,快速上手十进制计数器CD4026,并制作一个秒表【IC原来如此】,达林顿ULN2003系列晶体管为步进电机做的贡献,估计西德尼·林顿看了都会说好!,K_A07_002 基于STM32等单片机驱动ULN2003模块实现 按键控制步进电机正反转,SMT32串口控制ULN2003驱动器驱动步进电机,硬件基本功-60-达林顿管的介绍icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Uy4y1g7gY?t=180.8

1.3 ULN2003和步进电机

经过以上两节的学习,我们知道,要想驱动步进电机必须借助ULN2003模块,如下图 3所示,是ULN2003和步进电机连接的示意图。注意:图中红色方框部分的内容不用连接,可以直接忽略就行。

3 连接图

其中,“Input1-Input4”端口分别连接控制设备(51单片机或Arduino开发板)的IO口,用于接收开发板收到的控制信号,从而将控制信号经过ULN2003处理后发送给步进电机,实现控制步进电机驱动的目的。

第2节 方案一:NodeMCU控制步进电机

演示视频 

NodeMCU控制步进电机驱动实验_哔哩哔哩_bilibili步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和, 视频播放量 3、弹幕量 0、点赞数 1、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 Wm锰, 作者简介 大二专业第一学院第一;大三专业第二学院第三;2022年云南省职业技能大赛二等奖;2022年“经世IUV杯”全国三等奖;国家励志、一等奖奖学金,相关视频:【PTN光传输技术】业务仿真机房3配置思路,【PTN光传输技术】仿真实验机房2配置教程:视屏三业务配置,【PTN光传输技术】仿真实验机房2配置教程:视屏一配置前准备,【RFID技术及应用】实验一:IEEEE144443读卡实验过程,【PTN光传输技术】仿真实验机房2配置教程:视屏二拓扑配置,《毛泽东选集》全四册(含字幕+注释)|制作历时一个月,毛泽东思想的重要载体,是毛泽东思想的集中展现,【计算机组成原理及实现】实验一:A、W寄存器实验,[IUV仿真实验练习数据]建安兴城四水实验工程漫游基础优化配置数据,【IUV仿真实验】Option2承载网配置视频①,【PTN光传输技术】仿真实验机房2配置教程:视屏五规划图作用及解释icon-default.png?t=N7T8https://www.bilibili.com/video/BV1C1421X7Ut?t=1.9

NodeMCU控制步进电机驱动实验

2.1 ULN2003的选择

如图 4所示,是我本次使用的ULN2003。

4 ULN2003模块

如图 5所示,是ULN2003模块在普中51开发板所处的位置。

.

5 普中51开发板

那么问题来了,我为什么要选择51开发板上的ULN2003模块来进行本次实验呢?

首先,经过第1节 的介绍,想要驱动步进电机就需要用到ULN2003模块,而我手里没有现成的模块,但我有一块51开发板,而在该开发板上有ULN2003,于是我就将开发板上的ULN2003模块用于本次实验。当然,在利用51开发板时,我们需要将开发板上的51芯片移除(本次实验使用的普中51开发板的芯片是易拆除的,十分地方便),只留下一个开发板的壳子,避免被51芯片影响实验效果。

其次,我们本次所使用的NodeMCU开发板没有5V供电接口,其引脚只能输出3.3V的电压,满足不了驱动步进电机的供电需求。而51开发板集成好的接线柱上,其给步进电机提供的电压是5V供电的,恰好满足了驱动步进电机的电压要求。

除此之外,如果该实验需要推广给同学们完成,恰好我们所有同学手里都有一块51单片机开发板和ESP8266开发板,除了需要借用一下实验室的步进电机外,就不再需要其他实验器材了,从而达到充分利用已有资源的目的。

最后,针对个人开发的话,如下图 6所示,建议使用单个的ULN2003芯片即可。淘宝搜索“步进电机28BYJ48+ULN2003驱动板”即可找到。

6 ULN2003芯片

2.2 51开发板上的ULN2003使用方法

如图 7所示,是51开发板上的ULN2003的接线原理图,我们本次实验只需要用到“IN1-IN4”和“OUT1-OUT4”端口。其他的“P25”和“BEEP”是用于驱动蜂鸣器的,对于我们本实验来说可以直接忽略,不用采取其他操作。当然,GND和VCC端口是集成在开发板内部而且是已经连接好的,如果是独立的ULN2003驱动芯片,我们还需将GND连接上单片机或其他控制芯片的GND上,VCC需要接入5V电源。

7 五线四项步进电机

结合图 7,如图 8所示,针对本次实验来说,“IN1-IN4”号接线柱,在51开发板上内部,分别是连接到“P10和P13”的。所以,如图 9所示,我们只需将NodeMCU-ESP8266的四个控制引脚,分别连接到开发板的“P1.0-P1.3”号引脚上,用于输出控制信号。

8 单片机开发板核心原理图

9 单片机开发板接线方式

图 7上的“OUT1-OUT4”和“VCC”引脚如图 10所示,只需要连接到步进电机的五个引脚即可,下文会详细介绍具体连接方式。

10 步进电机连接ULN2003的OUT口

介绍完51开发板、步进电机和ULN2003后就可以开始正式的实验了。

2.3 硬件连接

如下图 11所示,是本次实验的硬件连接示意图,表 1为对应的各个硬件引脚对应的接口。 

11 方案一硬件连接示意图

1 各硬件引脚连接表

步进电机

51开发板

NodeMCU-ESP8266

LED_RED

LED_GREEN

红线

5V

/

/

+极—>D7

+极—>D4

橙线

D1

P10

D0

-极—>GND

-极—>GND

黄线

D2

P11

D1

/

/

粉线

D3

P12

D2

/

/

蓝线

D4

P13

D3

/

/

2.4 程序设计

2.4.1 参考程序

以下两个程序方便我们研究ESP8266究竟是怎样控制步进电机工作的。

  • Arduino驱动步进电机参考程序
#include <Stepper.h>
const int stepsPerRevolution = 512;
Stepper myStepper(stepsPerRevolution, D0, D1, D2, D3);
void setup() {
  myStepper.setSpeed(30);
  Serial.begin(115200);
}
void loop() {
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
}
  • ESP8266控制LED灯的参考程序
#include<ESP8266WiFi.h>
#include<ESP8266WiFiMulti.h>
#include<ESP8266WebServer.h>
ESP8266WiFiMulti wifiMulti;
ESP8266WebServer esp8266_server(80);
void setup(void)
{
    Serial.begin(115200);
    pinMode(D4,OUTPUT);
    pinMode(D7, OUTPUT);
    wifiMulti.addAP("wm80131218sj","wm33056wifi");
    wifiMulti.addAP("wm80131218esp","wm33056wifi");
    Serial.println("Connecting...");
    int i=0;
    while(wifiMulti.run()!=WL_CONNECTED)
    {
        delay(1000);
        Serial.print(i++);Serial.print(' ');
    }
    Serial.println('\n');
    Serial.print("Connected to");
    Serial.println(WiFi.SSID());
    Serial.print("IP address:\t");
    Serial.println(WiFi.localIP());
    esp8266_server.begin();
    esp8266_server.on("/",HTTP_GET,handleRoot);
    esp8266_server.on("/LED",HTTP_POST,handleLED);
    esp8266_server.onNotFound(handleNotFound);
    Serial.println("HTTP esp8266_server started");
}
void loop(void)
{
    esp8266_server.handleClient();
    if (digitalRead(D4) == HIGH)
    {
      digitalWrite(D7, LOW);
    }
    else
    {
      digitalWrite(D7, HIGH);
    }
}

void handleRoot()
{
    esp8266_server.send(200,"text/html","<form action=\"/LED\"method=\"POST\"><input type=\"submit\"value=\"Toggle LED\"></form>");
}
void handleLED()
{
  digitalWrite(D4,!digitalRead(D4));
    esp8266_server.sendHeader("Location","/");
    esp8266_server.send(303);
}
void handleNotFound()
{
    esp8266_server.send(404,"text/plain","404:Not found");
}

2.4.2 本次NodeMCU-ESP8266控制步进电机实验源代码

 要达成相同的实验效果,只需要把以下程序导入NodeMCU开发板中即可。

#include<ESP8266WiFi.h>
#include<ESP8266WiFiMulti.h>
#include<ESP8266WebServer.h>
#include <Stepper.h>
const int stepsPerRevolution = 512;
const int motor1 = D0;
const int motor2 = D1;
const int motor3 = D2;
const int motor4 = D3;
Stepper myStepper(stepsPerRevolution, motor1,motor2,motor3,motor4);
ESP8266WiFiMulti wifiMulti;
ESP8266WebServer esp8266_server(80);
void setup(void)
{
    myStepper.setSpeed(40);
    Serial.begin(115200);
  pinMode(D4,OUTPUT);
  pinMode(D7, OUTPUT);
    wifiMulti.addAP("wm80131218sj","wm33056wifi");
    wifiMulti.addAP("wm80131218esp","wm33056wifi");
    Serial.println("Connecting...");
    int i=0;
    while(wifiMulti.run()!=WL_CONNECTED)
    {
        delay(1000);
        Serial.print(i++);Serial.print(' ');
    }
    Serial.println('\n');
    Serial.print("Connected to");
    Serial.println(WiFi.SSID());
    Serial.print("IP address:\t");
    Serial.println(WiFi.localIP());
    esp8266_server.begin();
    esp8266_server.on("/",HTTP_GET,handleRoot);
    esp8266_server.on("/LED",HTTP_POST,Stepmotor);
    esp8266_server.onNotFound(handleNotFound);
    Serial.println("HTTP esp8266_server started");
}
void loop(void)
{
    esp8266_server.handleClient();
    if (digitalRead(D4) == HIGH)
    {
      digitalWrite(D7, LOW);
      myStepper.step(stepsPerRevolution);
      esp8266_server.sendHeader("Location","/");
      esp8266_server.send(303);
    }
    else
    {
      digitalWrite(D7, HIGH);
      esp8266_server.sendHeader("Location","/");
      esp8266_server.send(303);
    }
}
void handleRoot()
{
    esp8266_server.send(200,"text/html","<form action=\"/LED\"method=\"POST\"><input type=\"submit\"value=\"Toggle Stepper\"></form>");
}
void Stepmotor()
{
    digitalWrite(D4,!digitalRead(D4));
}
void handleNotFound()
{
    esp8266_server.send(404,"text/plain","404:Not found");
}

2.4.3 程序设计原理

在NodeMCU-ESP8266控制步进电机实验源代码中,课堂上学习过的那部分程序就不再解释了,这里就简要说明一下新增程序起到的作用及原理。

#include <Stepper.h>

为调用步进电机Stepper库而设置的头文件。

  1. const int stepsPerRevolution = 512;

设置电机每一转动一圈所需要的步数,实际上“512”这个参数是可以通过计算来求出的,不同的电机有差别,减速比不同,步进角度不同。这里使用5线单极型电机,带机械减速齿,但不知道它的具体参数,之所以使用512是因为源程序上使用的是512,在我们本次实验中512恰好能使电机工作,所以就不再进行更改。

  1. 引脚定义

const int motor1 = D0;

const int motor2 = D1;

const int motor3 = D2;

const int motor4 = D3;

这里的定义类似于宏定义“#define”,即将D0-D3引脚分别赋值给motor1-motor4。

  1. Stepper myStepper(stepsPerRevolution, motor1,motor2,motor3,motor4);

初始化引脚

  1. myStepper.setSpeed(40);

设置步进电机的转速,经过调试,本次实验的转速范围在30至45之间,也就是说可以设置为30和45之间的任一值。当然理论上讲,在正常驱动范围内,所设至越小步进电机扭矩越大转速越慢,越大步进电机扭矩越小转速越快。

  1. OUTPUT模式

pinMode(D4,OUTPUT);

pinMode(D7, OUTPUT);

分别设置D4和D7引脚为输出模式。

  1. esp8266_server.on("/LED",HTTP_POST,Stepmotor);

Stepmotor函数:digitalWrite(D4,!digitalRead(D4));

读取D4引脚的状态并取反赋值给D4。

  1. loop函数里的if else判断
  • if (digitalRead(D4) == HIGH)

获取D4引脚的状态,判断D4引脚是否为高电平。

digitalWrite(D7, LOW);

如果D4引脚为高电平,则将D7引脚设置为低电平,即关闭D7引脚的LED灯。

myStepper.step(stepsPerRevolution);

如果D4引脚为高电平,启动步进电机。

  • else

digitalWrite(D7, HIGH);

如果D4引脚为低电平,则将D7引脚设置为高电平,点亮D7引脚的LED灯。

总结起来,其实本程序很简单,在网页上“Toggle Stepper”按钮用来控制D4引脚的状态,每按下一次,就对D4引脚状态取反(高电平或低电平),然后利用D4引脚的状态,来决定是否启动步进电机。即当D4引脚为高电平时启动步进电机,当D4引脚为低电平时关闭步进电机。至于为什么要用这样的方式来控制步进电机,主要是考虑到步进电机的启动程序,必须要放在loop函数中才行,因此就利用按钮开关的原理,巧妙地运用此函数来对步进电机进行启动和关闭的控制。

当然,本程序还有能升级优化的地方,具体该怎么优化升级,这里就不再进行赘述,留给读者去思考和改正。

第3节 方案二:NodeMCU控制51驱动步进电机

演示视频 

 NodeMCU控制51驱动步进电机_哔哩哔哩_bilibili由Node-MCU作为主控芯片,STC89C51作为执行芯片,通过51开发板来驱动步进电机。此方案中的Node-MCU仅作为命令的发出者,通过D0引脚发送高/低电平信号给单片机的P30引脚,再由单片机来判断P30引脚接收到的电平信号为高电平还是低电平,从而决定是否运行驱动步进电机的程序。, 视频播放量 2、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 Wm锰, 作者简介 大二专业第一学院第一;大三专业第二学院第三;2022年云南省职业技能大赛二等奖;2022年“经世IUV杯”全国三等奖;国家励志、一等奖奖学金,相关视频:Y现在进行时上,NodeMCU控制步进电机驱动实验,【PTN光传输技术】仿真实验机房2配置教程:视屏一配置前准备,实验18:单区域ospf配置,实验18:多区域ospf协议配置,【PTN光传输技术】仿真实验机房2配置教程:视屏二拓扑配置,【IUV仿真实验】Option2承载网配置视频①,【计算机组成原理及实现】实验一:A、W寄存器实验,【PTN光传输技术】业务仿真机房3配置思路,【PTN光传输技术】仿真实验机房2配置教程:视屏四各种操作解释icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Gt421w7zP?t=5.3

NodeMCU控制51驱动步进电机

3.1 硬件连接

如图 12下所示,是本次实验的硬件连接示意图,表 1为对应的各个硬件引脚对应的接口。

12 方案二硬件连接示意图

2 各硬件引脚连接表

步进电机

51单片机

NodeMCU-ESP8266

红线

5V

P30

D0

橙线

D1

P10

/

黄线

D2

P11

/

粉线

D3

P12

/

蓝线

D4

P13

/

/

/

GND

GND

/

/

3.3V

3.3V

3.2 程序设计

3.2.1 NodeMCU端程序

程序说明:以上代码是一个基于ESP8266的Web服务器,通过访问ESP8266的IP地址,可以在浏览器中打开一个网页。网页上有一个按钮,点击按钮可以向ESP8266发送一个POST请求,请求的目标是"/LED"端点。

当收到这个POST请求时,ESP8266会调用handle_Action_M函数。在这个函数中,它会改变D0引脚的状态,从而控制LED的点亮和熄灭。然后,它会将HTTP响应代码设置为303,表示重定向到网页的根目录。这样,浏览器会重新加载网页,从而更新按钮的状态。

在setup函数中,通过esp8266_server.on函数设置了路由规则,将"/"路径映射到handleRoot_Direction函数,将"/LED"路径映射到handle_Action_M函数。这样,当浏览器访问ESP8266的IP地址时,会显示一个带有按钮的网页,点击按钮就会向ESP8266发送一个POST请求,从而控制LED的状态。

handleRoot_Direction函数负责生成网页上的按钮,它通过调用esp8266_server.send函数来发送HTML代码到浏览器。

handleNotFound函数处理404情况,即当浏览器请求一个不存在的路径时,会返回一个HTTP状态码404和一条提示信息。

整个程序的主循环中,调用了esp8266_server.handleClient函数,用于检查是否有HTTP请求到达ESP8266,并处理这些请求。

#include<ESP8266WiFi.h>
#include<ESP8266WiFiMulti.h>
#include<ESP8266WebServer.h>
ESP8266WiFiMulti wifiMulti;
ESP8266WebServer esp8266_server(80);
void setup(void)
{
    Serial.begin(115200);//启动串口通讯
    pinMode(D0, OUTPUT);//定义D0口为输出模式
    digitalWrite(D0,HIGH);//初始为高电平
//填写自己手机热点或路由器的wifi名称及密码
//注意:暂不支持校园网wifi
//wifi1或wifi2只需填写一个即可
    wifiMulti.addAP("WiFi_MingCheng1","WiFi_MiMa1");//wifi1
    wifiMulti.addAP("WiFi_MingCheng2","WiFi_MiMa2");//wifi2
    Serial.println("Connecting...");
    int i=0;
    while(wifiMulti.run()!=WL_CONNECTED)
    {
        delay(1000);
        Serial.print(i++);Serial.print(' ');
    }
    Serial.println('\n');
    Serial.print("Connected to");
    Serial.println(WiFi.SSID());//通过串口监视器输出连接的WiFi名称
    Serial.print("IP address:\t");
    Serial.println(WiFi.localIP());//通过串口监视器输出ESP8266-NodeMCU的IP
    esp8266_server.begin();//启动网站服务
    esp8266_server.on("/",HTTP_GET,handleRoot_Direction);//设置服务器根目录即'/'的函数'handleRoot_Direction'
    esp8266_server.on("/LED",HTTP_POST,handle_Action_M);//设置处理LED控制请求的函数'handle_Action_M'
    esp8266_server.onNotFound(handleNotFound);//设置处理404情况的函数'handleNotFound'
    Serial.println("HTTP esp8266_server started");//告知用户ESP8266网络服务功能已经启动
void loop(void)
{
    esp8266_server.handleClient();//检查http服务器访问
}
void handleRoot_Direction()
{
    esp8266_server.send(200,"text/html","<form action=\"/LED\"method=\"POST\"><input type=\"submit\"value=\"Action_M\"></form>");
}
//处理D1控制请求的函数,步进电机正、反转
void handle_Action_M()
{
  digitalWrite(D0,!digitalRead(D0));//改变D0的点亮或者熄灭状态
  esp8266_server.sendHeader("Location","/");//跳转回页面根目录
  esp8266_server.send(303);//发送Http相应代码303跳转
}
//设置处理404情况的函数'handleNotFound'
void handleNotFound()
{
    esp8266_server.send(404,"text/plain","404:Not found");//发送HTTP状态404(未找到页面)并向浏览器发送文字"404:Not found"
}

3.2.2 51单片机端程序

程序说明:这个程序实现了根据按键的状态控制步进电机的启动和停止。当按键按下时,步进电机以指定的速度和方向旋转;当按键松开时,步进电机停止转动。

程序中首先定义了步进电机控制引脚和按键引脚的连接方式,并实现了延时函数delay_ms和步进电机控制函数step_motor_28BYJ48_send_pulse。

在主函数中,通过一个无限循环,不断检测按键的状态。如果按键按下,就调用步进电机控制函数控制电机旋转;如果按键松开,就将电机控制引脚全部置为低电平,停止电机转动。

#include "reg52.h"
typedef unsigned int u16;  //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义ULN2003控制步进电机管脚
sbit IN1_A = P1^0;
sbit IN2_B = P1^1;
sbit IN3_C = P1^2;
sbit IN4_D = P1^3;
sbit key = P3^0;  //定义按键引脚
void delay_ms(u16 ms)
{
    u16 i, j;
    for(i = ms; i > 0; i--)
        for(j = 110; j > 0; j--);
}
void step_motor_28BYJ48_send_pulse(u8 step, u8 dir)
{
    u8 temp = step;
    
    if(dir == 0)  //如果为逆时针旋转
        temp = 7 - step;  //调换节拍信号
    switch(temp)  //8个节拍控制:A->AB->B->BC->C->CD->D->DA
    {
        case 0: IN1_A = 1; IN2_B = 0; IN3_C = 0; IN4_D = 0; break;
        case 1: IN1_A = 1; IN2_B = 1; IN3_C = 0; IN4_D = 0; break;
        case 2: IN1_A = 0; IN2_B = 1; IN3_C = 0; IN4_D = 0; break;
        case 3: IN1_A = 0; IN2_B = 1; IN3_C = 1; IN4_D = 0; break;
        case 4: IN1_A = 0; IN2_B = 0; IN3_C = 1; IN4_D = 0; break;
        case 5: IN1_A = 0; IN2_B = 0; IN3_C = 1; IN4_D = 1; break;
        case 6: IN1_A = 0; IN2_B = 0; IN3_C = 0; IN4_D = 1; break;
        case 7: IN1_A = 1; IN2_B = 0; IN3_C = 0; IN4_D = 1; break;
        default: IN1_A = 0; IN2_B = 0; IN3_C = 0; IN4_D = 0; break;  //停止相序  
    }           
}
//主函数
void main()
{   
    u8 step = 0;
    u8 dir = 0;  //默认逆时针方向
    u8 speed = 1;  //默认最大速度旋转

    IN1_A = 0; IN2_B = 0; IN3_C = 0; IN4_D = 0;  //初始化电机引脚为低电平

    while(1)
    {           
        if(key == 0)  //如果按键按下
        {
            step_motor_28BYJ48_send_pulse(step++, dir);
            if(step == 8) step = 0;      
            delay_ms(speed);
        }
        else  //按键松开时停止电机
        {
            IN1_A = 0; IN2_B = 0; IN3_C = 0; IN4_D = 0;  //将电机引脚全部置为低电平
        }
    }       
}

第4节 方案一和方案二优缺点

4.1 方案一

 由Node-MCU为主控-执行芯片,借助普中A2开发板上的ULN2003来驱动步进电机,驱动器的控制引脚连接到Node-MCU的GPIO引脚上,以便Node-MCU可以控制驱动器发送脉冲信号。此方案中的Node-MCU作为命令的发出者和执行者,通过判断D4引脚的状态来控制步进电机驱动程序的执行。

4.1.1 优点

 只需要用到一套开发板,硬件种类构成简单,成本低;程序设计简单,有现成的库函数可以调用;学习难度不大。

4.1.2 缺点

 可能由于Node-MCU自身性能或供电的限制,其在直接执行驱动步进电机驱动的时候,网页按钮的控制延时增大,因此由Node-MCU同时负责控制和驱动并不是一个很好的选择。

4.2 方案二

 由Node-MCU作为主控芯片,STC89C51作为执行芯片,通过51开发板来驱动步进电机。此方案中的Node-MCU仅作为命令的发出者,通过D0引脚发送高/低电平信号给单片机的P30引脚,再由单片机来判断P30引脚接收到的电平信号为高电平还是低电平,从而决定是否运行驱动步进电机的程序。

4.2.1 优点

 驱动程序烧录在51单片机上,Node-MCU只负责输出高/低电平信号,并不参与程序的执行,因此能很好的解决Node-MCU性能不足的问题。另外,由于51单片机自身性能较强、硬件扩展性较好,可实现其他更复杂的功能,如点击加减速、正反转等,另外还可加入一些其他传感器,制成更复杂的研究结构。

4.2.2 缺点

 需要用到多类开发芯片,没有现成的51库函数可调用,程序设计较为复杂,学习难度较大。

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值