image.png

步进电机原理

步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。您可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时也可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
image.png
中间部分是转子,由一个永磁体组成,边上的是定子绕组。当定子的一个绕组通电时,将产生一个方向的电磁场,如果这个磁场的方向和转子磁场方向不在同一条直线上,那么定子和转子的磁场将产生一个扭力将定子扭转。
image.png
依次改变绕组的磁场,就可以使步进电机正转或反转(比如通电次序为A->B->C->D正转,反之则反转)。而改变磁场切换的时间间隔,就可以控制步进电机的速度了。不管是两相四相,四相五线,四相六线步进电机。内部构造都是如此。至于究竟是四线,五线,还是六线。就要看A、B、C、D之间,有没有公共端com抽线。,这就是步进电机的驱动原理。
image.pngimage.png
image.png

  • 相数:产生不同对极N、S磁场的激磁线圈对数。常用m表示。
  • 拍数:完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA-AB,四相八拍运行方式即 A-AB-B-BC-C-CD-D-DA-A。
  • 步距角:对应一个脉冲信号,电机转子转过的角位移用θ表示。θ=360度,以28BYJ-48 四相五线步进电机为例,步距角为5.625度

    ULN2003驱动板

    由于步进电机的驱动电流较大,单片机不能直接驱动,一般都是使用ULN2003达林顿阵列驱动。ULN2003是一个非门电路,包含7个单元,单独每个单元驱动电流最大可达500mA,9脚可以悬空。其与开发板及步进电机连接,原理图如下:
    image.png

    实验

    image.png ```cpp int IN1 = 7; //IN1 int IN2 = 6; //IN2 int IN3 = 5; // IN3 int IN4 = 4; // IN4 int beep= 3; //蜂鸣器负极 char time = 0, i = 0, count = 0;

void setup() { //初始化电机驱动IO为输出方式 pinMode(IN1, OUTPUT); // PIN 7 pinMode(IN2, OUTPUT); // PIN 6 pinMode(IN3, OUTPUT); // PIN 5 pinMode(IN4, OUTPUT); // PIN 4 pinMode(beep, OUTPUT); //PIN 3 digitalWrite(beep, HIGH); Serial.begin(9600);//设置波特率为9600 } /*四相八拍*/ void Coil_A() { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH); } void Coil_AB() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH); } void Coil_B() { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH); } void Coil_BC() { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } void Coil_C() { digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } void Coil_CD() { digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } void Coil_D() { digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void Coil_DA() { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } /*/

void beep_once()//蜂鸣器响一次 { digitalWrite(beep, LOW); delay(100); digitalWrite(beep, HIGH); }

void loop() { unsigned long now_time = micros(); //获取当前的系统运行时间长度 while ((micros() - now_time) < 14648); // 60 000 000us/4096 switch (i) { case 0: Coil_A(); i++; break; case 1: Coil_AB(); i++; break; case 2: Coil_B(); i++; break; case 3: Coil_BC(); i++; break; case 4: Coil_C(); i++; break; case 5: Coil_CD(); i++; break; case 6: Coil_D(); i++; break; case 7: Coil_DA(); i = 0; break; default: break; } count++; if (count == 68)//一秒计时,显示并蜂鸣器响一下 { count = 0; time++; if (time == 60) time = 0; Serial.print(“second: “ ) ; Serial.print(time, DEC) ; Serial.println(“s” ) ; beep_once(); } } ```