零知派ESP32——ULN2003AN驱动28BYJ-48步进电机控制系统

项目概述

本项目基于零知派ESP32开发了一套完整的步进电机智能控制系统,通过电位器实现精确的速度控制,按键控制方向切换,并配备1.3寸TFT显示屏实时显示系统状态。系统采用ULN2003AN驱动芯片控制28BYJ-48步进电机,实现了平滑的速度调节和精准的位置控制。

项目亮点

① 自动识别电位器有效电压范围(3.4V-4.0V),实现线性速度映射

② 采用状态机设计,确保按键响应稳定可靠

③ 1.3寸TFT显示屏提供丰富的状态信息显示

④ 指数曲线速度映射算法,低速控制更精准

项目难点及解决方案

问题描述:电位器在3.4-4.0V范围内电机才转动

解决方案:

实现电压范围重新映射算法,通过校准参数自适应不同电位器特性

问题描述:28BYJ-48步进电机在低速时扭矩不足

解决方案:

设置最小启动速度(MIN_SPEED),并采用指数曲线速度映射

一、硬件系统设计

1.1 器件清单

规格型号 数量 备注
零知派ESP32 1 零知派ESP32-WROOM-32
28BYJ-48 1 5V减速步进电机
ULN2003AN驱动板 1 达林顿管阵列驱动
1.3寸TFT LCD (ST7789) 1 240×240分辨率
10KΩ旋转电位器 1 线性电位器
6×6mm轻触开关 1 常开型
杜邦线 若干 母对母、母对公
零知派ESP32扩展板 1 零知派ESP32通用扩展板

1.2 接线方案

根据代码定义进行以下接线操作、如需定义为其他引脚请自行修改代码:

(1)电机驱动部分接线

零知派ESP32引脚 ULN2003AN驱动板 28BYJ-48步进电机 功能
33 IN1 / 电机控制
25 IN2 / 电机控制
26 IN3 / 电机控制
27 IN4 / 电机控制
/ 排线连接 排线连接 电机驱动
5V(外部) + / 电机电源
GND - / 电机地线

(2)ST7789显示屏接线

零知派ESP32引脚 ST7789引脚 功能
3.3V VCC 电源
GND GND
15 CS 片选
13 DC 数据/命令控制
4 RES 复位
23 SDA SPI数据线
18 SCL SPI时钟线

(3)电机操作部分接线

零知派增强板引脚 电位器 按键 功能
5V 左侧引脚 / 供电
GND 右侧引脚 / 地线
34 中间引脚 / 信号输入
12 / 高电平一端 信号输入,内部上拉

ps:电机需要消耗大量电力,最好直接从外部 5V 电源供电

1.3 硬件连接图

1.4 实物接线图

二、软件架构设计

2.1 库文件及初始化

cpp 复制代码
// 主要库文件引入
#include <Stepper.h>
#include <TFT_eSPI.h>

#define BUTTON_PIN 12  // 按键引脚(内部上拉)
#define POT_PIN 34    // 电位器模拟输入	

2.2 电压校准算法

cpp 复制代码
// 电压校准参数 - 关键创新点
#define POT_MIN_VOLTAGE 3.4  // 电机启动最小电压
#define POT_MAX_VOLTAGE 4.0  // 电机最大速度电压	

2.3 状态机按键处理

cpp 复制代码
// 按键状态枚举
enum ButtonState { IDLE, PRESSED, DEBOUNCING };
ButtonState buttonState = IDLE;

void handleButton() {
    int reading = digitalRead(BUTTON_PIN);
    switch (buttonState) {
        case IDLE:
            if (reading== LOW) {
                buttonState = DEBOUNCING;
                lastButtonTime = millis();
            }
            break;
        // ... 状态处理逻辑
    }
}

2.4 电位器模拟值处理

cpp 复制代码
void handlePotentiometer() {
  int potValue = analogRead(POT_PIN);

  if (abs(potValue - lastPotValue) > 5) {
    lastPotValue = potValue;

    // 线性映射到 0~15 RPM
    targetSpeed = map(potValue, 0, ADC_RESOLUTION, MIN_SPEED, MAX_SPEED);
    targetSpeed = constrain(targetSpeed, MIN_SPEED, MAX_SPEED);

    // 速度变化时立即更新 Stepper
    if (targetSpeed != currentSpeed) {
      currentSpeed = targetSpeed;
      if (currentSpeed > 0) {
        myStepper.setSpeed(currentSpeed);
      }
      updateSpeedDisplay();

      if (DEBUG_MODE) {
        Serial.print("Speed: "); Serial.print(currentSpeed); Serial.println(" RPM");
      }
    }
  }
}	

如图所示,步进电机控制系统的工作流程图

三、操作过程及展示

3.1 系统连接

将ULN2003AN驱动板接入5~12V外部电源,连接28BYJ-48电机到驱动板输出端,按照接线表连接零知派ESP32开发板与各模块,确保所有电源正确连接后上电

3.2 校准测试

(1)开源平台-输入 步进电机 并搜索-代码下载自动打开

(2)连接-验证-上传

(3)旋转电位器,观察电机响应

(4)根据实际电压范围调整校准参数

(5)测试按键功能,确认方向切换正常

3.3 视频演示验证

ESP32驱动28BYJ-48步进电机控制系统

缓慢旋转电位器,观察速度线性增加。按下按键,验证方向切换功能。电位器逆时针旋转到底,确认电机停止

四、控制系统模块详解

4.1 ULN2003AN驱动芯片

(1)功能说明

ULN2003AN是高压大电流达林顿晶体管阵列,包含7个NPN达林顿对管,每个可驱动500mA和50V负载。在本项目中用于驱动28BYJ-48步进电机的四相绕组。

该板具有四个控制输入接口和一个电源接口,还配备了一个与电机连接器相兼容的 Molex 连接器,可直接插入电机。同时,板上设有四个 LED,用于显示四条控制输入线上的活动状态,并且带有一个开 / 关跳线,以便在需要时禁用步进电机。

(2)工作流程

接收MCU发出的控制信号、通过达林顿管放大电流、驱动步进电机各相绕组、提供反向电动势保护二极管

4.2 28BYJ-48步进电机

(1)工作原理

基于齿轮与电磁铁的协同作用,通过一次推动轮子一个 "步" 来实现运动

向线圈发送高脉冲时,线圈会通电,进而吸引最靠近齿轮的齿,使电机以精确且固定的角度增量(即步长)旋转。其 360 度旋转的步数取决于齿轮上的齿数

(2)引脚排列

28BYJ-48 步进电机有五根线。引脚排列如下:

28BYJ-48 包含两个线圈,每个线圈都设有一个中心抽头,这两个中心抽头在电机内部相连,并通过红线引出。

而线圈的一端与中心抽头共同构成一相,所以 28BYJ-48 总共有四相:

红线始终拉高,因此当另一根引线拉低时,该相通电。

仅当各相按称为步进顺序的逻辑顺序通电时,步进电机才会旋转。

(3)齿轮减速比

依据数据表,28BYJ-48 步进电机在全步模式下运行时,每一步对应的旋转角度为 11.25°,由此可算出每完成 360° 旋转需要 32 步(360°÷11.25°=32)

该电机配备了 1/64 的减速齿轮组(实际减速比为 1/63.68395,不过在多数情况下,1/64 的近似值已能满足需求)。

这也就意味着,电机实际完成一圈旋转需要约 2038 步(32 步 / 转 ×63.68395≈2037.8864 步,近似为 2038 步)。

(4)能量消耗

28BYJ-48 步进电机的典型电流消耗约为 240mA。

由于其耗电量较大,因此建议直接采用外部 5V 电源供电,而非通过 零知派ESP32开发板供电。

需要注意的是,即便处于静止状态,该电机也会消耗功率以维持当前位置。

(5)技术规格

|-------|-------------------|
| 工作电压 | 5VDC |
| 工作电流 | 240mA(典型值) |
| 相数 | 4 |
| 齿轮减速比 | 64:1 |
| 步距角 | 5.625°/64 |
| 频率 | 100赫兹 |
| 牵引扭矩 | >34.3mN.m(120Hz) |
| 自定位扭矩 | >34.3mN.m |
| 摩擦力矩 | 600-1200 克力·厘米 |
| 拉入扭矩 | 300 克力.厘米 |

五、常见问题解答

Q1: 电位器控制不线性如何调整?

A:修改代码中的 POT_MIN_VOLTAGE POT_MAX_VOLTAGE参数,匹配实际电压范围。

Q2: 显示屏显示异常怎么办?

A:检查SPI接线是否正确,确认CS、DC、RST引脚定义与代码一致。

Q3: 按键无响应如何解决?

A:确认按键是否正确连接到GND和引脚12,检查内部上拉电阻是否启用。

Q4: 电机振动大且噪音明显?

A:降低MAX_SPEED值,或增加加速度参数,使速度变化更平滑。

项目资源:

步进电机数据表: 28BYJ-48 数据表

相关推荐
╰ㄣ浮华若梦︶ _11 小时前
51单片机的SPI协议
单片机·嵌入式硬件·51单片机·8051·spi协议
崇山峻岭之间11 小时前
单片机按键实验
单片机·嵌入式硬件
踏着七彩祥云的小丑11 小时前
嵌入式测试学习第 16 天:复位电路、电源电路基础原理
单片机·嵌入式硬件
小手智联老徐12 小时前
Arduino IDE环境搭建与点亮ESP32 D1板载LED
嵌入式硬件·esp32·arduino
坤坤藤椒牛肉面12 小时前
stm32学习1--新建工程
stm32·单片机·学习
yong999012 小时前
STM32 LoRaWAN Ping-Pong 节点方案
stm32·单片机·嵌入式硬件
模拟IC攻城狮12 小时前
(最新)华为 2025届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
嵌入式硬件·华为·硬件架构·pcb工艺·模拟芯片
我先去打把游戏先12 小时前
Ubuntu虚拟机(服务器版本)Git安装教程(附常用命令)——从零开始掌握版本控制
服务器·c语言·c++·git·嵌入式硬件·物联网·ubuntu
安生生申12 小时前
uni-app 连接 JDY-31 蓝牙串口模块实践
c语言·前端·javascript·stm32·单片机·嵌入式硬件·uni-app