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);
}
