micro python控制步进电机精确转动一定角度

一.步进电机的步距角和减速比

步进电机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=5128拍的循环。以上就为精确控制步进电机角度的理论基础,下面将是如何实现精确控制步进电机转过指定角度。

二.精确角度控制

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
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值