ESP32 ULN2003驱动步进电机 ,解决电机振动,但不转动问题

ESP32 步进电机驱动

  • 1、Stepper库修改部分
  • 2、电机工作代码

开发环境 VS Code
步进电机 :28BYJ-48步进电机
ESP32 TTGO

  使用ESP32 驱动步进电机,使用了自带的Stepper库,但是,结果是电机未转动,以至于我认为购买的电机出了问题,自己还测试了一下,最后发现电机是正确的,是Stepper电机驱动库的问题,与我购买的电机驱动有时序差异,即需要修改电机驱动库里面的不兼容的部分,最后成功驱动28BYJ-48步进电机,28BYJ-48的含义为外径28毫米四相八拍式永磁减速型步进电机。
使用的电机如图所示:
ESP32 ULN2003驱动步进电机 ,解决电机振动,但不转动问题_第1张图片
四相八拍:A->AB->B ->BC ->C ->CD ->D ->DA
其A、B、C、D指的是uln2003芯片驱动板的1N1、1N2、1N3、1N4,波形在上表示有输入信号。

  28BYJ-48步进电机的齿轮减速比为64:1,转速约15转/分钟,一些软件采用某些手段和高电压电源(如12伏直流)也能达到约25转/分钟的转速。

4步控制信号序列:11.25度/步,32步旋转一周。
8步控制信号序列:5.625度/步, 64步旋转一周。
正常情况下,4步模式下旋转一周将用:32(步/周)X64(齿轮比) = 2048 步,8步模式下旋转一周将用:64(步/周)X64(齿轮比) = 4096 步,ULN2003驱动模块只支持4步模式运行,所以接下来的程序里旋转一周的步数是2048步。

1、Stepper库修改部分

D:\Arduino\libraries 自带的arduino 库文件,主要就是修改电机的时序。
ESP32 ULN2003驱动步进电机 ,解决电机振动,但不转动问题_第2张图片

图中的时序为: AC-BC-BD-AD,
正转 电机导通相序 D-C-B-A
反转 电机导通相序 A-B-C-D

在255行,注释下图部分:
之后按照时序重新修改,电机运行就正常了。
ESP32 ULN2003驱动步进电机 ,解决电机振动,但不转动问题_第3张图片
之后替换下面代码:

case 0:  // 1010
            digitalWrite(motor_pin_1, HIGH);
            digitalWrite(motor_pin_2, LOW);
            digitalWrite(motor_pin_3, LOW);
            digitalWrite(motor_pin_4, LOW);
        break;
        case 1:  // 0110
            digitalWrite(motor_pin_1, LOW);
            digitalWrite(motor_pin_2, HIGH);
            digitalWrite(motor_pin_3, LOW);
            digitalWrite(motor_pin_4, LOW);
        break;
        case 2:  //0101
            digitalWrite(motor_pin_1, LOW);
            digitalWrite(motor_pin_2, LOW);
            digitalWrite(motor_pin_3, HIGH);
            digitalWrite(motor_pin_4, HIGH);
        break;
        case 3:  //1001
            digitalWrite(motor_pin_1, LOW);
            digitalWrite(motor_pin_2, LOW);
            digitalWrite(motor_pin_3, LOW);
            digitalWrite(motor_pin_4, HIGH);
        break;

2、电机工作代码

#include 
// 设置步进电机旋转一圈是多少步
const int stepsPerRevolution = 100;   

  //这里特别注意 ,后面4个参数分别是驱动板上的 IN1 , IN3 , IN2 , IN4 
Stepper myStepper = Stepper(stepsPerRevolution, 27, 26, 25, 33);
void setup() {
     
  //设置转速
  myStepper.setSpeed(120); 
  Serial.begin(115200);
  //
}

void loop() {
      

  //这个电机转一圈是  2048步
  //先顺时针转360
  Serial.printf("顺时针");
  myStepper.step(2048);
  delay(500);
  //逆时针转90
  Serial.printf("逆时针");
  myStepper.step(-1024);//倒转半圈
  delay(500);
}

你可能感兴趣的:(VS,Code,ESP32)