步进电机28BYJ-48的驱动(arduino平台,STM32),最全的驱动详细原理,驱动电路分析,驱动代码解释

 


目录

步进电机28BYJ-48的驱动(arduino平台,STM32),最全的驱动详细原理,驱动电路分析,驱动代码解释

前言

一、步进电机28BYJ-48结构和工作原理

1.基本知识:

2.步进电机28BYJ-48结构:

3.步进电机的控制的基本概念

4.步进电机28BYJ-48工作原理

5.步进电机的驱动拍数设定模式

6.步进电机的驱动参数解读

二、驱动电路分析和使用

1.ULN2003驱动电路

2.L298N小功率驱动电路

三.驱动代码分析

1.ULN2003驱动代码分析

(1)驱动库:

(2)应用案例:

 2.L298N驱动代码分析

(1)驱动库

(2)应用案例

四、Arduino STM32驱动参考代码下载

1.ULN200驱动库下载链接:

2.L298N驱动库下载链接:

3.STM32驱动库链接:

总结


 

前言

在本网站查找了很多资料,收益匪浅,今来研究了步进电机28BYJ-48的驱动,查了很多资料,发现介绍不够详细,没有抓到关键点,特别是原理,只有原理清楚才能实现精确控制。因此写了本文,借用一些作者的资源,表示感谢,以飨读者,回报大家!


提示:以下是本篇文章正文内容,下面案例可供参考

一、步进电机28BYJ-48结构和工作原理

1.基本知识:

步进电机:是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB),后两种常用。

步进电机控制特点:1、它是通过输入脉冲信号来进行控制的。2、电机的总转动角度由输入脉冲数决定。3、电机的转速由脉冲信号频率决定。

2.步进电机28BYJ-48结构

3.步进电机的控制的基本概念

4.步进电机28BYJ-48工作原理

5.步进电机的驱动拍数设定模式

6.步进电机的驱动参数解读

二、驱动电路分析和使用

1.ULN2003驱动电路

 

 

2.L298N小功率驱动电路

三.驱动代码分析

arduino自带的steper驱动库,针对两相电机,而我们驱动的28BYJ48步进电机时四相的,直接使用不可以,笔者试用发现电机嗯嗯响不转动,如果要用自带库,可以对电机接线进行调换改造,或者修改驱动里的拍子表,太麻烦一些。

我们采用自建的驱动库,知道工作原理,驱动库可以自建。

1.ULN2003驱动代码分析

(1)驱动库:

/*
 * 用法:
1、把Stepper28BYJ48.zip解压在libraries目录下
2、电机通过ULN2003驱动板和ULN2803驱动板测试通过
3、驱动的输入依次接arduino的8~9,步进电机依次接蓝,粉,黄,橙。
 */

// ensure this library description is only included once
#ifndef Stepper28BYJ48_h
#define Stepper28BYJ48_h

// library interface description
class Stepper {
  public:
    // constructors:
    Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2,
                                 int motor_pin_3, int motor_pin_4);

    // speed setter method:
    void setSpeed(long whatSpeed);

    // mover method:
    void step(int number_of_steps);

  private:
    void stepMotor(int this_step);

    int direction;            // Direction of rotation
    int speed;                // Speed in RPMs
    unsigned long step_delay; // delay between steps, in ms, based on speed
    int number_of_steps;      // total number of steps this motor can take
    int pin_count;            // how many pins are in use.
    int step_number;          // which step the motor is on

    // motor pin numbers:
    int motor_pin_1;
    int motor_pin_2;
    int motor_pin_3;
    int motor_pin_4;

    unsigned long last_step_time; // time stamp in us of when the last step was taken
};

#endif


(2)应用案例:

/*
	控制28BYJ48电机,正转一圈,反转一圈
 */

#include <Stepper28BYJ48.h>

const int stepsPerRevolution = 4096;  //28BYJ48电机旋转一周需要的步数


// 电机接在引脚8 ~ 11: 电机线依次为蓝,粉,黄,橙
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;         // number of steps the motor has taken

void setup() {
  // initialize the serial port:
  Serial.begin(9600);
  
  //设置电机转速r/min
  myStepper.setSpeed(10);
}

void loop() {
  // 正转一圈
  myStepper.step(stepsPerRevolution);
  Serial.print("steps:" );
  Serial.println(stepsPerRevolution);
  delay(5000);
  
  // 反转一圈
  myStepper.step(-stepsPerRevolution);
  Serial.print("steps:" );
  Serial.println(-stepsPerRevolution);
  delay(5000);
  
  // 正转64步
  myStepper.step(64);
  Serial.print("steps:" );
  Serial.println(64);
  delay(5000);
  
  // 正转64步
  myStepper.step(64);
  Serial.print("steps:" );
  Serial.println(64);
  delay(5000);
  
}

 2.L298N驱动代码分析


(1)驱动库

参考网上驱动库,经过我修改完善,运行很好。

// library interface description
//二相步进电机可以用arduino IDE 自带的实例里的程序和库驱动,。但是 Steper_28BYJ48四相的驱动不了
class Steper_28BYJ48 {
  public:
    // constructors:
    Steper_28BYJ48(unsigned int speed_ratio,unsigned int beat_mode, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4);

    // mover method:
    void step(int degree_to_move);
	//set speed
    void setSpeed(unsigned int step_delay);
    void lowPower_idel();
  private:
    unsigned int beat_mode;    //1:EightBeat��2:FourBeat��3:DoubleFourBeat
    unsigned int step_delay;    // delay between steps, in ms, based on speed
    unsigned int speed_ratio ;

    // motor pin numbers:
    int motor_pin_1;
    int motor_pin_2;
    int motor_pin_3;
    int motor_pin_4;
};

(2)应用案例

应用这个库编写了案例,实现功能,通过串口1进行交互,输入转动角度,实现控制电机转动角度,修改代码可以体验驱动步进电机拍数3种模式,1:EightBeat,2:FourBeat,3:DoubleFourBeat

代码使用说明在程序头部。

/*接线:务必不要错了,不然查错非常头大!
  L298输入1-4 对应 arduino数字端口 8,9,10,11
  L298电路板输出有两种接口,一种是有步进电机的卡扣端子ABCD+vcc,一种是输出端子:out1--A+白,OUT2--A-蓝,out3--B+黄,out4--B-绿,电源端接红线5V
  或者 红线接电源5V,橙色电线接out4口,黄色电线接out3口,粉色电线接out2口,蓝色接out1口根据提示进行接线。
  //思路是通过减速比来控制单步执行的脉冲次数,电机是减速比16,电机每一个脉冲前进5.625度,而主轴前进5.625/16=0.3515625度,但经过我测试,这种玩具级的电机主轴低于5.625度步进的精度是无法保障的,因此我简化了代码,每步执行16次脉冲。
//接线顺序是红->﹢5V,橙黄粉蓝分别接L298N 的OUT1、OUT2、OUT3、OUT4, arduino的8,9,10,11分别接L298N的IN1-IN4
*/
/*28BYJ-48步进电机的齿轮减速比常见有两种,1:16,1:64,
 * 步距角:θ=360度/(转子齿数J*运行拍数),齿数为8,八拍运行,电机主轴的步距角为θ=360度/(8*8)=5.625度(俗称半步),在除以减速比64,所以输出轴的步距角:5.625/64。
电机参数表中的减速比这个参数吧——1:64,转子转64圈,最终输出轴才会转一圈,也就是需要64*64=4096个节拍输出轴才转过一圈,2 ms*4096=8192 ms,8秒多才转一圈4096个节拍转动一圈,那么一个节拍转动的角度——步进角度就是360/4096,看一下表中的步进角度参数5.625/64。
要输出某一角度degree,求输出步数N=(degree*减速比)*(齿数*运行拍数)/360
启动频率是≥550,单位是 P.P.S,即每秒脉冲数,这里的意思就是说:电机保证在你每秒给出550个步进脉冲的情况下,可以正常启动。那么换算成单节拍持续时间就是 1 s/550=1.8 ms,为了让电机能够启动,我们控制节拍刷新时间大于 1.8 ms 就可以了。
减速比为1:64情况下
  4步控制信号序列:11.25度/步,主电机32步旋转一周。
  8步控制信号序列:5.625度/步,主电机64步旋转一周,减速轴旋转一周将用:64(步/周)X64(齿轮比) = 4096 步
  测试电机减速比为1:16,8拍模式下旋转一周将用:64(步/周)X16(齿轮比) = 1024 步。*/
#include "Steper_28BYJ48.h" //自带驱动,也可以加入驱动库

Steper_28BYJ48 steper(16, 1, 8, 9, 10, 11);
//6个参数为:第1个是步进电机减速比,第2个是步进电机拍数模式设定,1:EightBeat,2:FourBeat,3:DoubleFourBeat,另外4个驱动引脚
int degree;                  //转动的角度,负值为逆时针方向。
String inString = "";    // 用于转换数字的字符串缓冲区
String read_String = "";
unsigned char dir = 3; //1顺时针方向。clockwise,2逆时针。3,空闲等待。

void setup() {
  Serial.begin(9600);  //初始化串口,作为监视。
  steper.setSpeed(3);//节拍刷新时间,一般要大于2ms// delay between steps, in ms, based on speed,if delay<2ms,lost step.so delay must be more than 3ms
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  // 发送信息
  Serial.println("Please input MOTOR diretion and turn degree(eg,-24,mean,counterclockwise,24 du)");
}

void loop() {
  int inChar;
  // 读取串口发送的信息:
  while (Serial.available() > 0)
  {
    inChar = Serial.read();
    read_String += (char)inChar;
    delay(2);
  }
  if (read_String.length() != 0) {
     Serial.println("**********************************************************************");
    Serial.print("serial port read_string:");
    Serial.println(read_String);
    if (read_String.charAt(0) == '-')
    {
      dir = 0;
      Serial.print("turn direction:");
      Serial.println("CounterClockWise");
      degree = (read_String.substring(1)).toInt();
    }
    else
    {
      Serial.print("turn direction:");
      Serial.println("ClockWise");
        dir = 1;
        degree = read_String.toInt();
   
    }
    read_String = "";
  }
  if (dir == 1)//CW
  {
    steper.step(degree);
    steper.lowPower_idel();
        Serial.print("Motor finished degree: ");
        Serial.println(degree);
       Serial.println("**********************************************************************");

     dir = 3;   
  }
   if (dir == 0)//CCW
  {
    degree=0-degree;
    steper.step(degree);
    steper.lowPower_idel();
    dir = 3;
        Serial.print("Motor finished degree: ");
        Serial.println(degree);
        Serial.println("**********************************************************************");

    }
    degree = 0;
    delay(5000);
 }

四、Arduino STM32驱动参考代码下载

1.ULN200驱动库下载链接:

https://download.csdn.net/download/anchoretor/15176116

2.L298N驱动库下载链接:

https://download.csdn.net/download/anchoretor/15176829

3.STM32驱动库链接:

https://download.csdn.net/download/anchoretor/15270614


总结

1首先需要熟悉步进电机28BYJ-48的机构,工作原理。驱动拍的工作特点。关键:五线四相结构,驱动的步进角公式会计算。

2..驱动库编写需要针对不同驱动电路的设计,驱动电路的使用工作原理。关键:ULn2003驱动电路特点,输入和输出是反相,输入高电平,驱动输出端拉低,驱动绕组励磁工作。L298N驱动电路特点,输入和输出是同相,输入低电平,驱动输出端拉低,驱动绕组励磁工作。

3.应用代码分析,通过应用大家熟悉如何使用自建库,同时完成实践应用,知行合一多多练习。

4.看过有用,鼓励一下我的劳动成果,收藏点个赞呗,能力有限,有错误地方欢迎指正。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐