micro python控制步进电机精确转动一定角度
在普中科技的esp32开发板上,利用microPython函数实现对步进电机的精准控制
·
一.步进电机的步距角和减速比
步进电机28BYJ-48有两种驱动模式:4拍和8拍,分别对应为:
4拍:A->B->C->D
8拍:A->AB->B->BC->C->CD->D->DA
而不同的模式就有不同的步距角度(电机每拍转动的角度),下面就为步距角度的计算公式:
其中,m代表定子绕组的相数,如步进电机28BYJ-48就有4相
z为转子的齿数,如步进电机28BYJ-48就有8齿
k代表驱动的方式,4拍就为1,8拍就为2
又因为该步进电机的减速比为1:64,故可以轻松算出在8拍模式下,步进电机的步距角度为:5.625/64°,即为:在8拍模式下,每64个节拍,电机旋转5.625°。
减速比,即减速装置的传动比,是传动比的一种,是指减速机构中瞬时输入速度与输出速度的比值,用符号“i”表示。
一般减速比的表示方法是以1为分母,用“:”连接的输入转速和输出转速的比值,如输入转速为1500r/min,输出转速为25r/min,那么其减速比则为:i=60:1。
故我们可以知道,步进电机旋转360°,我们需要64*64=4096个拍子,即为4096/8=512个8拍的循环。以上就为精确控制步进电机角度的理论基础,下面将是如何实现精确控制步进电机转过指定角度。
二.精确角度控制
from machine import Pin
import time
# 设置按键相关的引脚
key_1=Pin(12,Pin.IN,Pin.PULL_UP)
key_2=Pin(14,Pin.IN,Pin.PULL_UP)
key_3=Pin(27,Pin.IN,Pin.PULL_UP)
key_4=Pin(26,Pin.IN,Pin.PULL_UP)
Key_en=1# 用于按键的使能,防止同时按下引起误判
def Key_Scan(): #按键扫描函数
global Key_en
if Key_en==1 and (key_1.value()==0 or key_2.value()==0 or key_3.value()==0 or key_4.value()==0):
time.sleep_ms(10)
Key_en=0
if key_1.value()==0:
return 1
if key_2.value()==0:
return 2
if key_3.value()==0:
return 3
if key_4.value()==0:
return 4
elif Key_en==0 and key_1.value()==1 and key_2.value()==1 and key_3.value()==1 and key_4.value()==1:
Key_en=1
# 设置电机所需要的引脚,因esp32的引脚电平只有3.3伏,不适合用来驱动电机,所以得需要uln2003等驱动芯片来拉高电压
Motor_1=Pin(4,Pin.OUT,Pin.PULL_DOWN)
Motor_2=Pin(16,Pin.OUT,Pin.PULL_DOWN)
Motor_3=Pin(17,Pin.OUT,Pin.PULL_DOWN)
Motor_4=Pin(5,Pin.OUT,Pin.PULL_DOWN)
flag=1 #电机驱动总控制,可以通过改变flag的值来实现电机是否转动
n=0 #用于计数,程序的核心变量,每过一个节拍,n值加1
aim_fx=0 #所需要的节拍数,初始设定为0
#电机驱动函数,step表示此时电机所处的节拍,fx表示电机转动的方向
def stepmotor_send_pulse(step,fx):
global flag
global n
global aim_fx
if flag==1:
if fx==0:
step=7-step
if step==0 and (n<aim_fx):
Motor_1.value(1)
Motor_2.value(0)
Motor_3.value(0)
Motor_4.value(0)
n=n+1
if step==1 and (n<aim_fx):
Motor_1.value(1)
Motor_2.value(1)
Motor_3.value(0)
Motor_4.value(0)
n=n+1
if step==2 and (n<aim_fx):
Motor_1.value(0)
Motor_2.value(1)
Motor_3.value(0)
Motor_4.value(0)
n=n+1
if step==3 and (n<aim_fx):
Motor_1.value(0)
Motor_2.value(1)
Motor_3.value(1)
Motor_4.value(0)
n=n+1
if step==4 and (n<aim_fx):
Motor_1.value(0)
Motor_2.value(0)
Motor_3.value(1)
Motor_4.value(0)
n=n+1
if step==5 and (n<aim_fx):
Motor_1.value(0)
Motor_2.value(0)
Motor_3.value(1)
Motor_4.value(1)
n=n+1
if step==6 and (n<aim_fx):
Motor_1.value(0)
Motor_2.value(0)
Motor_3.value(0)
Motor_4.value(1)
n=n+1
if step==7 and (n<aim_fx):
Motor_1.value(1)
Motor_2.value(0)
Motor_3.value(0)
Motor_4.value(1)
n=n+1
if n>=aim_fx:
aim_fx=0
n=0
key=0 #用来存储按键按下后的按键值
fx=1 #用于操控电机旋转的方向
Tem_Speed=1 #用于控制电机转动的速度
step=0 #用于控制电机此时的所处的节拍
while True:
key=Key_Scan()
if key==1:
aim_fx=512 #设定角度为45°
elif key==2:
aim_fx=1024 #设定角度为90°
elif key==3:
aim_fx=2048 #设定角度为180°
elif key==4:
aim_fx=4096 #设定角度为360度
stepmotor_send_pulse(step,fx)#调用函数驱动电机旋转
time.sleep_ms(Tem_Speed)#sleep函数,控制电机转动速度
# if语句,控制电机以8拍为一个循环
if flag==1 and (n<aim_fx):
step=step+1
if step==8:
step=0
博主使用的普中科技的esp32开发板,下面附实验现象
45°旋转:
前:
后:
90°旋转:
前
后:
180°旋转
前:
后:
可以看出对角度的控制还是十分的准确的
更多推荐
已为社区贡献1条内容
所有评论(0)