2025年树莓派+ L298N 控制二相四线步进电机

树莓派+ L298N 控制二相四线步进电机树莓派 L298N 控制二相四线步进电机 1 步进电机 步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机 在非超载的情况下 电机的转速 停止的位置只取决于脉冲信号的频率和脉冲数 而不受负载变化的影响 即给电机加一个脉冲信号 电机则转过一个步距角 这一线性关系的存在

大家好,我是讯享网,很高兴认识大家。

树莓派+ 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
0 1 0 0
0 0 1 0
0 0 0 1

双四拍控制通电方式

A+ B+ A- B-
1 1 0 0
0 1 1 0
0 0 1 1
1 0 0 1

单八拍控制通电方式

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输出使能端短接起来。

控制类引脚

输出类引脚
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 单四拍控制通电方式

 # -*- coding: utf-8 -*- #通过声明可以在程序中书写中文 import RPi.GPIO as GPIO #引入RPi.GPIO库函数命名为GPIO import time #引入计时time函数 GPIO.setmode(GPIO.BOARD) #将GPIO编程方式设置为BOARD模式 #接口定义 IN1 = 22 #将L298 IN1口连接到树莓派Pin22  IN2 = 18 #将L298 IN1口连接到树莓派Pin18 IN3 = 38 #将L298 IN1口连接到树莓派Pin38 IN4 = 40 #将L298 IN2口连接到树莓派Pin40 IN5 = 15 #将L298 IN3口连接到树莓派Pin15 IN6 = 16 #将L298 IN4口连接到树莓派Pin16 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) # Numbers GPIOs by physical location GPIO.setup(IN1, GPIO.OUT) # Set pin's mode is output 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) # 发射脉冲时间间隔0.01(单位秒) 脉冲个数200 print ("stop...") stop() # stop time.sleep(2) # sleep 2s print ("forward...") forward(0.01, 200) print ("stop...") stop() time.sleep(2) def destroy(): GPIO.cleanup() # 释放数据 if __name__ == '__main__': # Program start from here setup() try: loop() except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child function destroy() will be executed. destroy() 

讯享网

5.2 单八拍控制通电方式

讯享网 # -*- coding: utf-8 -*- #通过声明可以在程序中书写中文 import RPi.GPIO as GPIO #引入RPi.GPIO库函数命名为GPIO import time #引入计时time函数 # BOARD编号方式,基于插座引脚编号 GPIO.setmode(GPIO.BOARD) #将GPIO编程方式设置为BOARD模式 #接口定义 IN1 = 22 #将L298 IN1口连接到树莓派Pin22 IN4 = 18 #将L298 IN2口连接到树莓派Pin18 IN3 = 38 #将L298 IN1口连接到树莓派Pin38 IN4 = 40 #将L298 IN2口连接到树莓派Pin40 IN5 = 15 #将L298 IN3口连接到树莓派Pin15 IN6 = 16 #将L298 IN4口连接到树莓派Pin16 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) # Numbers GPIOs by physical location GPIO.setup(IN1, GPIO.OUT) # Set pin's mode is output 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) # 发射脉冲时间间隔0.01(单位秒) 脉冲个数200 print ("stop...") stop() # stop time.sleep(2) # sleep 2s print ("forward...") forward(0.01, 200) print ("stop...") stop() time.sleep(2) def destroy(): GPIO.cleanup() # 释放数据 if __name__ == '__main__': # Program start from here setup() try: loop() except KeyboardInterrupt: # When 'Ctrl+C' is pressed, the child function destroy() will be executed. destroy() 

参考文献

51单片机教程:二相四线步进电机驱动

零基础玩转树莓派(五)—控制直流电机

树莓派控制直流电机

L298N 电机驱动板 - 详细介绍.datazhen

小讯
上一篇 2025-03-16 12:28
下一篇 2025-02-19 19:03

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/16807.html