L298N 驱动 42步进电机

L298N 可以控制两个普通电机和一个步进电机,本章介绍如何驱动42步进电机

步进电机特点:

  • 它是通过输入脉冲信号来进行控制的
  • 电机的总转动角度由输入脉冲数决定
  • 电机的转速由脉冲信号频率决定

步进电机相关概念:

  • 拍数
    完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA-AB,四相八拍运行方式即A-AB-B-BC-C-CD-D-DA-A。
  • 步距角
    控制系统每发一个步进脉冲信号,电机所转动的角度。现在市场上常规的二、四相混合式步进电机基本步距角都是1.8°。

所需材料:

NodeMcu(esp8266)

  • NodeMcu(esp8266)
  • L298N 模块
  • 42步进电机
  • 杜邦线

L298N

步进电机的驱动原理

驱动步进电机走一步分下面四个阶段

!!!Esp8266 需要和L298N共地GND,不然L298N无法工作。

测试代码

int IN1 = 16; //定义L298N-1控制引脚
int IN2 = 5;
int IN3 = 4;
int IN4 = 0;
int waitTime = 10;    // 电机转动速度

/**
 * 调用一次,步进电机走一步
 */
void TwoPhaseMotor(unsigned char nInputData ,unsigned char nDirection)
{
        if(1 == nDirection)             //逆时针
        {
                switch(nInputData)
                {
                        case 1:
                        {
                          digitalWrite(IN1, LOW);
                          digitalWrite(IN2, HIGH);
                          digitalWrite(IN3, LOW);
                          digitalWrite(IN4, HIGH);
                        }
                        break;
                        case 2:
                        {
                          digitalWrite(IN1, LOW);
                          digitalWrite(IN2, HIGH);
                          digitalWrite(IN3, HIGH);
                          digitalWrite(IN4, LOW);
                        }
                        break;
                        case 3:
                        {
                          digitalWrite(IN1, HIGH);
                          digitalWrite(IN2, LOW);
                          digitalWrite(IN3, HIGH);
                          digitalWrite(IN4, LOW);
                        }
                        break;
                        case 4:
                        {
                          digitalWrite(IN1, HIGH);
                          digitalWrite(IN2, LOW);
                          digitalWrite(IN3, LOW);
                          digitalWrite(IN4, HIGH);
                        }
                        break;
                }
        }
        else if(0 == nDirection)        //顺时针
        {
                switch(nInputData)
                {
                        case 1:
                        {
                          digitalWrite(IN1, HIGH);
                          digitalWrite(IN2, LOW);
                          digitalWrite(IN3, LOW);
                          digitalWrite(IN4, HIGH);
                        }
                        break;
                        case 2:
                        {
                          digitalWrite(IN1, HIGH);
                          digitalWrite(IN2, LOW);
                          digitalWrite(IN3, HIGH);
                          digitalWrite(IN4, LOW);
                        }
                        break;
                        case 3:
                        {
                          digitalWrite(IN1, LOW);
                          digitalWrite(IN2, HIGH);
                          digitalWrite(IN3, HIGH);
                          digitalWrite(IN4, LOW);
                        }
                        break;
                        case 4:
                        {
                          digitalWrite(IN1, LOW);
                          digitalWrite(IN2, HIGH);
                          digitalWrite(IN3, LOW);
                          digitalWrite(IN4, HIGH);
                        }
                        break;
                }
        }
}
void TwoPhaseMotorNCircle(int n,unsigned char direction)
{
    int i,j;
// 
//    L298D_12ENA = 1;    //只有转的时候使能,否则持续供电,芯片和电机过热。
//    L298D_34ENA = 1;
 
    for(i=0;i<n;i++)
    {
      // 四个阶段
        for(j=1;j<=4;j++)
        {
            Serial.print("J:");
            Serial.println(j);
            TwoPhaseMotor(j,direction);
            delay(2);
        }
    }
}
void setup() {
  // 启动
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  Serial.begin(9600); 

}


void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("loop");
  TwoPhaseMotorNCircle(1,1);
}

上一篇
下一篇