开发板使用:正点原子ATK_DNESP32S3 V1.3
驱动板:uln2003an
步进电机:28BYJ-48
IDE: VSCODE + PLATFORMIO
由于28BYJ-48步进电机需要大电流,主板无法直接控制电机。它需要一个像ULN2003这样的驱动器IC来控制电机,所以实验中28BYJ-48步进电机通常带有一个基于ULN2003的驱动板。

•IN1到IN4 - ESP32S3的控制输入
•GND -接地
•VCC - 5V电机供电
•电机连接器-连接到28BYJ-48步进电机
•电源指示灯-指示模块是否上电
•步进LED -显示步进脉冲被发送到电机
这里需要安装Arduino Stepper库
可以用以下方式安装:
pio lib install "Stepper"

实验代码如下:
#include <Arduino.h>
#include <Stepper.h>
// Defines the number of steps per rotation
const int stepsPerRevolution = 2038;
// Creates an instance of stepper class
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
Stepper myStepper = Stepper(stepsPerRevolution, 4, 5, 6, 7);
void setup() {
}
void loop() {
// put your main code here, to run repeatedly:
// Rotate CW slowly at 5 RPM
myStepper.setSpeed(5);
myStepper.step(stepsPerRevolution);
delay(1000);
// Rotate CCW quickly at 10 RPM
myStepper.setSpeed(10);
myStepper.step(-stepsPerRevolution);
delay(1000);
}
代码详解:
const int stepsPerRevolution = 2038;
表示这个步进电机旋转一圈需要2038个步进脉冲。这个值取决于具体的步进电机型号(通常28BYJ-48步进电机配合减速箱时,每转步数为2038)。
Stepper myStepper = Stepper(stepsPerRevolution, 4, 5, 6, 7);
- 创建了一个名为`myStepper`的步进电机控制对象。
- 构造函数参数: - `stepsPerRevolution`:电机每转一圈的步数。
- `4, 5, 6, 7`:分别对应ULN2003驱动板上的IN1、IN3、IN2、IN4引脚。注意这里的顺序是IN1, IN3, IN2, IN4。这是因为该步进电机(28BYJ-48)的驱动顺序需要按照特定的相序(通常为8拍方式:A-AB-B-BC-C-CD-D-DA)才能正确旋转。但是Stepper库内部已经处理了步进序列,我们只需要提供4个控制引脚并按顺序(这里顺序是IN1, IN2, IN3, IN4)连接即可。然而,这里使用的顺序是`GPIO4(IN1), GPIO5(IN3), GPIO6(IN2), GPIO7(IN4)`,这可能是为了适应某种特定的驱动板接线。实际上,正确的连接顺序应该根据步进电机的相序和驱动板的要求来确定。
- 步进电机的初始化已经在创建`Stepper`对象时完成了(在Stepper库的构造函数中会初始化引脚为输出模式)。
myStepper.setSpeed(5);
myStepper.step(stepsPerRevolution);
- `myStepper.setSpeed(5);`:设置步进电机的转速为5转/分钟(RPM)。 - `myStepper.step(stepsPerRevolution);`:控制电机按设定的速度顺时针旋转一圈(因为参数为正数,表示向前步进,即顺时针)。执行该函数会阻塞程序,直到电机完成这一圈旋转。
代码写完后,点编译:

然后通过UART下载到主板:

然后小电机就开始欢快地转动了。

正点原子ESP32S3控制28BYJ-48步进电机
2728

被折叠的 条评论
为什么被折叠?



