一、目的
这一节我们来学习如何使用合宙ESP32 C3连接TB6600驱动42BYGH39步进电机,实现控制步进电机正反转和旋转指定角度等。下面我们一起来学习一下吧!
二、环境
ESP32 C3开发板(MicroPython v1.19.1 on 2022-06-18)+ 42BYGH39步进电机 + TB6600驱动 + 几根杜邦线 + Win10商业版
ESP32 C3和各模块接线方法:
我们使用共阴极接法:
Tb6600电源和步进电机接线:
根据电动机的电流设置拨码开关:
我们使用的电动机电流是1.2A,我们拨码开关4设为On,5和6设为OFF。
细分开关,即拨码开关1,2,3,下面我们使用的是1600的,所以2设为ON,1和3设为OFF。
三、TB6600步进电机驱动
tb6600.py
from machine import Pin
import time
class TB6600:
Pulse = 1600
def __init__(self,Pul,Dir,Ena):
self.Pul = Pin(Pul,Pin.OUT,Pin.PULL_UP)
self.Dir = Pin(Dir,Pin.OUT,Pin.PULL_UP)
self.Ena = Pin(Ena,Pin.OUT,Pin.PULL_UP)
self.Reset()
"""
设置旋转整圈数:
Een = 1使能,Een = 0失能
Dir = 1正转,Dir = 0反转
Circle = 旋转圈数,一圈360°
Freq = 频率 例如:一周期200us = 时间1/周期0.000200 = 频率5kHz
"""
def Motor_Circle(self,Ean,Dir,Circle,Freq):
for i in range(0,self.Pulse * Circle,1):
self.Ena.value(Ean)
if Dir:
self.foreward()
else:
self.reversal()
self.frequency(Freq)
"""
设置旋转角度:
Een = 1使能,Een = 0失能
Dir = 1正转,Dir = 0反转
Angle = 旋转角度,0 - 360°
Freq = 频率 例如:一周期200us = 时间1/周期0.000200 = 频率5kHz
"""
def Motor_Angle(self,Ean,Dir,Angle,Freq):
for i in range(0,int((self.Pulse/360)*Angle),1):
self.Ena.value(Ean)
if Dir:
self.foreward()
else:
self.reversal()
self.frequency(Freq)
#频率
def frequency(self,freq):
self.Pul.value(0)
time.sleep_us(freq)
self.Pul.value(1)
time.sleep_us(freq)
#复位
def Reset(self):
self.Pul.value(0)
self.Dir.value(0)
self.Close()
#开启
def Open(self):
self.Ena.value(1)
#关闭
def Close(self):
self.Ena.value(0)
#正转
def foreward(self):
self.Dir.value(1)
#反转
def reversal(self):
self.Dir.value(0)
四、示例
from machine import Pin
from tb6600 import TB6600
import time
tb = TB6600(Pul = 19,Dir = 18,Ena = 12)
def main():
while True:
tb.Motor_Angle(0,1,180,50) #10Kz
time.sleep(1)
tb.Motor_Angle(0,0,180,50)
time.sleep(1)
tb.Motor_Circle(0,1,5,50)
time.sleep(1)
tb.Motor_Circle(0,0,5,50)
time.sleep(1)
if __name__ == "__main__":
main()
五、不使用驱动库tb6600.py的示例
from machine import Pin
import time
PUL = Pin(19,Pin.OUT,Pin.PULL_UP)
DIR = Pin(18,Pin.OUT,Pin.PULL_UP)
ENA = Pin(12,Pin.OUT,Pin.PULL_UP)
Pulse = 1600
def Motor_Circle(Ena,Dir,Circle,freq):
ENA.value(Ena)
for i in range(0,int(Circle*1600),1):
if Dir:
DIR.value(1)
else:
DIR.value(0)
Freq(freq)
def Motor_Angle(Ena,Dir,Angle,freq):
ENA.value(Ena)
for i in range(0,int((Pulse/360)*Angle),1):
if Dir:
DIR.value(1)
else:
DIR.value(0)
Freq(freq)
def Freq(freq):
PUL.value(0)
time.sleep_us(freq)
PUL.value(1)
time.sleep_us(freq)
def Reset():
PUL.value(0)
DIR.value(0)
ENA.value(1)
time.sleep(1)
def main():
Reset()
while True:
#角度
Motor_Angle(0,1,360,100)
time.sleep(1)
Motor_Angle(0,0,180,200)
time.sleep(1)
#圈数
Motor_Circle(0,1,5,200)
time.sleep(1)
Motor_Circle(0,0,5,200)
time.sleep(1)
if __name__ == "__main__":
main()
六、42BYGH39驱动 + TB6600步进电机介绍
七、模块购买
商品详情https://detail.tmall.com/item.htm?id=708118352581&spm=a1z09.2.0.0.3eb62e8dQI8L7C&_u=fp01rcha8ea
当然你也可以使用其他型号的42步进电机,只需要根据步进电机的电流进行驱动器的对应的电流档设置即可。
八、步进电机发热问题
步进电机的控制方式一般采用恒流控制,当电机不转时,因没有反电动势,电机流过的电流是驱动器所设定的电流,电机本身是有阻抗,所以此时电机发热会很大。如果想减少电机的发热,可以选择带自动半流功能的驱动器,如DM542,DM442驱动器等。
步进电机作为一种数字式执行元件,在运动控制系统中得到广泛的应用,许多用户朋友在使用步进电机的时候,感觉电机工作时外壳烫手,想知道步进电机发热烫手什么原因,实际上发热是步进电机的一个普遍现象,但怎样的发热程度才算正常,以及如何尽量减小步进电机发热呢。
首先,要了解步进电机发热烫手什么原因,对于各种步进电机而言,内部都是由铁芯和绕组线圈组成的,绕组有电阻,步进电机通电会产生损耗,损耗大小与电阻和电流的平方成正比,这就是我们常说的铜损,如果电流不是标准的直流或正弦波,还会产生谐波损耗,铁心有磁滞涡流效应,在交变磁场中也会产生损耗,其大小与材料,电流,频率,电压有关,这叫铁损,铜损和铁损都会以发热的形式表现出来,从而影响电机的效率。
步进电机一般追求定位精度和力矩输出,效率比较低,电流一般比较大,且谐波成分高,电流步进电机交变的频率也随转速而变化,因而步进电机普遍存在发热情况,且情况比一般交流电机严重,步进电机在静态和低速下,电流会维持相对恒定,以保持恒力矩输出,速度高到一定程度,电机内部反电势升高,电流将逐步下降,力矩也会下降,因此,因铜损带来的发热情况就与速度相关了。