树莓派+ L298N 控制二相四线步进电机
1 步进电机
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。
1.1 步进电机相关概念
相数:产生不同对极N、S磁场的激磁线圈对数,常用 m 表示。例如:二相四线电机,就有两对极N、S磁场的激磁线圈,四个线圈。上图可知,A+,A- 是连通的,B+ 和B- 是连通的,分别记为A组、B组。在不知道电机接线图的情况下可以用万用表测试,即相互连通的为一组。
拍数:完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA,四相八拍运行方式即 A-AB-B-BC-C-CD-D-DA。
步距角:对应一个脉冲信号,电机转子转过的角位移用θ表示。θ=360度(转子齿数J运行拍数),以常规二、四相,转子齿为50齿电机为例。四拍运行时步距角为θ=360度/(
50
×
4
50\times 4
50×4)=1.8度(俗称整步),八拍运行时步距角为θ=360度/(
50
×
8
50\times 8
50×8)=0.9度(俗称半步)。
定位转矩:电机在不通电状态下,电机转子自身的锁定力矩(由磁场齿形的谐波以及机械误差造成的)。
静转矩:电机在额定静态电作用下,电机不作旋转运动时,电机转轴的锁定力矩。此力矩是衡量电机体积(几何尺寸)的标准,与驱动电压及驱动电源等无关。
1.2 二相四线步进电机工作原理
首先电机有4个电极,一共有4个线圈,两两串联,A+与A-是一组线圈, B+与B-是一组线圈。
1、A+加正极,A-加负极,B+加负极,B-加负极,(电机状态,N极朝上,如图(a)所示)。
2、B+加正极,B-加负极,A+加负极,A-加负极,(电机状态,N极朝右,电机顺时针旋转90°,如图(b)所示)。
3、A-加正极,A+ 、B+ 、B- 皆加负极,(电机状态,N极朝下,电机顺时针再次旋转90°,如图©所示)。
4、B-加正极,A+ 、 A- 、B+ 皆加负极, (电机状态,N极朝下,电机顺时针再次旋转90°,如图(d)所示)。
只要依次给相应引脚相应的电平就可以使得电机转动,转动的最小角度为90度,正极顺时针旋转电机正转,正极逆时针旋转电机反转。
1.3 二相四线步进电机通电方式
单四拍控制通电方式
双四拍控制通电方式
单八拍控制通电方式
A+ | B+ | A- | B- |
---|
1 | 0 | 0 | 0 |
1 | 1 | 0 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 1 | 1 |
0 | 0 | 0 | 1 |
1 | 0 | 0 | 1 |
2 驱动器
2.1 L298N电机驱动模块
L298N就是L298的立式封装,源自意法半导体集团旗下品牌产品,是一款可接受高电压、大电流双路全桥式电机驱动芯片,工作电压可达46V,输出电流最高可至4A,具有两个使能控制端,在不受输入信号影响的情况下通过板载跳帽插拔的方式,动态调整电路运作方式。有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作,也可以对外输出逻辑电压5V,为了避免稳压芯片损坏,当使用大于12V驱动电压时,务必使用外置的5V接口独立供电。
L298N通过控制主控芯片上的I/O输入端,直接通过电源来调节输出电压,即可实现电机的正转、反转、停止,由于电路简单,使用方便,通常情况下L298N可直接驱动继电器(四路)、螺线管、电磁阀、两台直流电机以及一台步进电机(两相或者四相)。
2.2 L298N 电机驱动版规格参数
驱动电机芯片:L298N双H桥直流电机驱动芯片
驱动供电范围:5V~35V ;如需板内取电,则供电范围7V~35V
驱动峰值电流:2A
逻辑部分端子供电范围:5V~7V(可板内取电5V)
逻辑部分工作电流范围: 0~36mA
控制信号输入电压范围:
低电平:-0.3V≤Vin≤1.5V
高电平: 2.3V≤Vin≤Vss
使能信号输入电压范围:
低电平:-0.3≤Vin≤1.5V(控制信号无效)
高电平:2.3V≤Vin≤Vss(控制信号有效)
最大功耗:20W(温度T=75℃时)、
ps:
VCC:C =circuit 表示电路的意思, 即接入电路的电压
VSS :S =series 表示公共连接的意思,通常指电路公共接地端电压
VDD:D=device 表示器件的意思, 即器件内部的工作电压
GND:Ground,电源的负极
VBAT:当使用电池或其他电源连接到VBAT脚上时,当VDD 断电时,可以保存备份寄存器的内容和维持RTC的功能。如果应用中没有使用外部电池,VBAT引脚应接到VDD引脚上
2.3 L298N 电机驱动板引脚
L298N驱动模块的引脚可以简单分为电源、控制和输出等三大类。
电压类引脚
+12 V输入:L298N芯片的电源正极,模块儿上标定为 12 V,实际取电范围5 V~35 V ;如需板内取电,则供电范围7 V~35 V
GND: L298N芯片的电源地,使用的时候应该把树莓派的GND接到这里,即两者需要共地。
+5V输出:L298N芯片输出的5V电源,可以给外部设备供电,使用的时候需要用跳线把5V输出使能端短接起来。
控制类引脚
ENA、ENB:A、B通道的使能端,高电平有效,可以用PWM来实现调速。使用时,可以接到树莓派的GPIO上,实现用程序进行控制。
IN1、IN2、IN3、IN4:IN1、IN2为A通道的控制输入,IN3、IN4为B通道的控制输入。
输出类引脚
OUT1、OUT2、OUT3、OUT4:OUT1、OUT2由A通道输出,OUT3、OUT4由B通道输出,可以用于连接直流电机、步进电机等设备。
3 树莓派(3B)
树莓派GPIO编号方式有三种,分别是:功能物理引脚(physical)、BCM以及wiring Pi.
功能物理引脚(Board):从左到右,从上到下。左边为奇数,右边为偶数。共计40个引脚,计数为1-40。
BCM:编号侧重于CPU寄存器,根据BCM2835的GPIO寄存器编号。具体编号参照上图中BCM一栏。
wiring Pi: 编号侧重实现逻辑,把扩展GPIO端口从0开始编号,这种编号方便编程。(本文没有提及)
编号方式不影响使用,操作时明确使用一种就行。
4 硬件连接部分
电机为FDK的二相四线步进电机,黄、橙、棕、黑四种颜色的线分别为A+, A-, B+ , B-, 分别连接在L298N驱动板的OUT1 , OUT3 , OUT2, OUT4(也可以改顺序,对应改代码就行)。外接电源给L298N提供稳定的5V电压,并使L298N与树莓派共地(两者的ground接通)。驱动板的IN1, IN2, IN3, IN4分别与树莓派的功能物理引脚编号38、40、15、16相连接,ENA, ENB 可以不操作(板载跳帽是默认连通的,即为高电平),本文ENA, ENB与物理引脚18、20连接,并定义为高电平。
5 代码部分
5.1 单四拍控制通电方式
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
IN1 = 22
IN2 = 18
IN3 = 38
IN4 = 40
IN5 = 15
IN6 = 16
def setStep(w1, w2, w3, w4, w5, w6):
GPIO.output(IN1, w1)
GPIO.output(IN2, w2)
GPIO.output(IN3, w3)
GPIO.output(IN4, w4)
GPIO.output(IN5, w5)
GPIO.output(IN6, w6)
def stop():
setStep(0, 0, 0, 0, 0, 0)
def forward(delay, steps):
for i in range(0, steps):
setStep(1, 1, 1, 0, 0, 0)
time.sleep(delay)
setStep(1, 1, 0, 1, 0, 0)
time.sleep(delay)
setStep(1, 1, 0, 0, 1, 0)
time.sleep(delay)
setStep(1, 1, 0, 0, 0, 1)
time.sleep(delay)
def backward(delay, steps):
for i in range(0, steps):
setStep(1, 1, 0, 0, 0, 1)
time.sleep(delay)
setStep(1, 1, 0, 0, 1, 0)
time.sleep(delay)
setStep(1, 1, 0, 1, 0, 0)
time.sleep(delay)
setStep(1, 1, 1, 0, 0, 0)
time.sleep(delay)
def setup():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
GPIO.setup(IN3, GPIO.OUT)
GPIO.setup(IN4, GPIO.OUT)
GPIO.setup(IN5, GPIO.OUT)
GPIO.setup(IN6, GPIO.OUT)
def loop():
while True:
print ("backward...")
backward(0.01, 200)
print ("stop...")
stop()
time.sleep(2)
print ("forward...")
forward(0.01, 200)
print ("stop...")
stop()
time.sleep(2)
def destroy():
GPIO.cleanup()
if __name__ == '__main__':
setup()
try:
loop()
except KeyboardInterrupt:
destroy()
5.2 单八拍控制通电方式
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
IN1 = 22
IN4 = 18
IN3 = 38
IN4 = 40
IN5 = 15
IN6 = 16
def setStep(w1, w2, w3, w4, w5, w6):
GPIO.output(IN1, w1)
GPIO.output(IN2, w2)
GPIO.output(IN3, w3)
GPIO.output(IN4, w4)
GPIO.output(IN5, w5)
GPIO.output(IN6, w6)
def stop():
setStep(0, 0, 0, 0, 0, 0)
def forward(delay, steps):
for i in range(0, steps):
setStep(1, 1, 1, 0, 0, 0)
time.sleep(delay)
setStep(1, 1, 1, 1, 0, 0)
time.sleep(delay)
setStep(1, 1, 0, 1, 0, 0)
time.sleep(delay)
setStep(1, 1, 0, 1, 1, 0)
time.sleep(delay)
setStep(1, 1, 0, 0, 1, 0)
time.sleep(delay)
setStep(1, 1, 0, 0, 1, 1)
time.sleep(delay)
setStep(1, 1, 0, 0, 0, 1)
time.sleep(delay)
setStep(1, 1, 1, 0, 0, 1)
time.sleep(delay)
def backward(delay, steps):
for i in range(0, steps):
setStep(1, 1, 1, 0, 0, 1)
time.sleep(delay)
setStep(1, 1, 0, 0, 0, 1)
time.sleep(delay)
setStep(1, 1, 0, 0, 1, 1)
time.sleep(delay)
setStep(1, 1, 0, 0, 1, 0)
time.sleep(delay)
setStep(1, 1, 0, 1, 1, 0)
time.sleep(delay)
setStep(1, 1, 0, 1, 0, 0)
time.sleep(delay)
setStep(1, 1, 1, 1, 0, 0)
time.sleep(delay)
setStep(1, 1, 1, 0, 0, 0)
time.sleep(delay)
def setup():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(IN1, GPIO.OUT)
GPIO.setup(IN2, GPIO.OUT)
GPIO.setup(IN3, GPIO.OUT)
GPIO.setup(IN4, GPIO.OUT)
GPIO.setup(IN5, GPIO.OUT)
GPIO.setup(IN6, GPIO.OUT)
def loop():
while True:
print ("backward...")
backward(0.01, 200)
print ("stop...")
stop()
time.sleep(2)
print ("forward...")
forward(0.01, 200)
print ("stop...")
stop()
time.sleep(2)
def destroy():
GPIO.cleanup()
if __name__ == '__main__':
setup()
try:
loop()
except KeyboardInterrupt:
destroy()
参考文献
51单片机教程:二相四线步进电机驱动
零基础玩转树莓派(五)—控制直流电机
树莓派控制直流电机
L298N 电机驱动板 - 详细介绍.datazhen
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)