完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
内容目录
一、树莓派Pico直流步进电机接口技术 1.直流步进电机及其驱动电路原理介绍 2.Pico开发板扩展GPIO口与步进电机驱动接口 二、树莓派Pico电机运动控制MicroPython+pioasm编程实现 1.Pico步进电机运动控制MicroPython编程 2.Pico步进电机运动控制MicroPython嵌入pioasm汇编子程序编程 三、小结 一、树莓派Pico直流步进电机接口技术 与使用直流电机需要驱动电路一样,必须在Pico开发板GPIO扩展口和步进电机控制对象之间增加驱动电路。 1.直流步进电机及其驱动电路原理介绍 我们可以采用三极管或MOS管等分离电子元件设计步进电机驱动电路,也可以使用现成的驱动电路模块。ULN2003(达林顿三极管阵列)是在直流步进电机中常用的一种驱动电路模块,我们也可以使用H桥(H Bridge)功率驱动电路驱动直流步进电机。下面以常用的28BYJ-48型直流步进电机及其驱动为例进行介绍。 28BYJ-48为直流4相5线步进电机(Stepper Motor), 其供电为直流5V电源、消耗电流约为200mA。28BYJ-48直流步进电机型号中的各符号含义如下:28表示步进电机最大有效外径为28毫米,B表示步进电机,Y表示永磁式,J表示加速型,48表示四相八拍。 图1 8BYJ-48直流步进电机 28BYJ-48直流步进电机外观及外部接线如图1所示,其内部线圈及接线端如图2所示。 图2 28BYJ-48直流步进电机内部线圈及接线图 在图2中,28BYJ-48直流步进电机的5个接线端引脚编号及含义为:1-蓝色(Blue, D相线圈),2-粉色(Pink,C相线圈),3-黄色(Yellow, B相线圈),4-桔色(Orange,A相线圈),5-红色(Red, +5V电源) 图3是一种采用4只PNP型三极管构成的直流步进电机驱动电路原理图,步进电机A-D相线圈可以由微控制器可编程GPIO接口相应的GPIO口线如GPIOA~GPIOD进行控制(图3左端),J插头用来连接28BYJ-48直流步进电机(图3右端)。 图3 4只NPN型三极管构成的直流步进电机驱动电路原理图 2.Pico开发板扩展GPIO口与步进电机驱动接口 目前大多采用微控制器和集成驱动电路模块对步进电机进行运动控制,图4是采用 Pico开发板扩展口GPIO、ULN2003驱动电路模块对28BYJ-48步进电机进行控制的驱动接口电路接线示意图。 图4 Pico开发板与28BYJ-48步进电机驱动接口示意图 下面介绍采用Pico开发板扩展口GPIO、DRV8833双H桥驱动电路模块对28BYJ-48步进电机进行控制的驱动接口电路原理。关于H桥驱动电路原理及DRV8833驱动电路模块详细介绍可参考文献[1]。 针对28BYJ48直流步进电机驱动,Pico开发板、DRV8833双H桥驱动电路模块、28BYJ-48步进电机接口连接说明如下: (1) Pico开发板与DRV8833模块输入端接口连接 Pico GPIO2(Pin4):DRV8833 AIN1(A相) Pico GPIO3(Pin5):DRV8833 AIN2(B相) Pico GPIO4(Pin6):DRV8833 BIN1(C相) Pico GPIO5(Pin7):DRV8833 BIN2(D相) (2) DRV8833模块输出端与28BYJ-48步进电机接口连接 DRV8833 AOUT1:接步进电机引脚4(A相,橙色) DRV8833 AOUT2:接步进电机引脚3(B相,黄色) DRV8833 AOUT2:接步进电机引脚2(C相,粉色) DRV8833 AOUT2:接步进电机引脚1(D相,蓝色) DRV8833 SLP信号引脚为睡眠模式输入,当SLP=1时,H桥驱动电机工作;当SLP=0时,H桥不能驱动电机工作。这里直接将SLP连接到提供给DRV8833的+5V DC电源(当然SLP也可接到3.3V,或接到Pico某根GPIO输出口线以实现电机的睡眠模式控制),Pico开发板扩展口GPIO、DRV8833驱动电路模块和步进电机接口原理图及实际接线拍照图分别见5所示和图6所示。 图5 Pico扩展口GPIO、DRV8833驱动模块和步进电机接口原理图 图6 Pico扩展口GPIO、DRV8833驱动模块和步进电机实际接线拍照图 二、树莓派Pico步进电机运动控制MicroPython+pioasm编程实现 控制28BYJ-48步进电机步进的三种控制方法分别是Wave drive、Full step和Half step,见图7所示。下面以图5和图6的步进电机运动控制为例,介绍使用MicroPython+pioasm对步进电机进行运动控制的原理及程序示例。 图7 28BYJ-48步进电机三种控制方法及步进控制时序 1.Pico步进电机运动控制MicroPython编程 步进电机的驱动信号必须为脉冲信号, 电机转动的速度和脉冲的频率(周期)成正比,28BYJ-48步进电机步进角为5.625度, 转一圈360度(即步进电机内部传动轮转一周)需要64个脉冲。 最简单的电机步进控制模式是采用图7中的Wave drive驱动模式,对应于图5就是轮流设置GPIO5-GPIO2四个GPIO引脚为高电平,并让其它的GPIO引脚为低电平。根据图7中的步进电机步进时序图,我们使用Pico扩展口线GPIO2-GPIO5控制步进电机A-D,单相驱动(WAVE DRIVE, One phase at a time)步进控制模式的顺序为D→C→B→A{结合前面的28BYJ-48接线端引脚编号来看,即:1-蓝色(BLUE, D相线圈),2-粉色(PINK,C相线圈),3-黄色(YELLOW, B相线圈),4-橙色(ORAGE,A相线圈)},轮流向GPIO5-GPIO2(D-A)发送的二进制控制编码顺序为 0b1000→0b0100→0b0010→0b0001。带完整程序注释的WAVE DRIVE步进控制模式MicroPython程序清单如下(按图5和图6所示的硬件接口,本程序运行通过): # Filename: main.py # 步进电机的驱动信号必须为脉冲信号, 转动的速度和脉冲的频率成正比 # 28BYJ48步进电机步进角为5.625度, 转一圈360度需要64个脉冲完成 # 程序使用Pico扩展口GPIO引脚: Pin4(GPIO2),Pin5(GPIO3),Pin6(GPIO4),Pin7(GPIO5) # 步进电机A组线圈对应于GPIO2(DRV8833-AIN1,AOUT1) # 步进电机B组线圈对应于GPIO3(DRV8833-AIN2,AOUT2) # 步进电机C组线圈对应于GPIO4(DRV8833-BIN1,BOUT1) # 步进电机D组线圈对应于GPIO5(DRV8833-BIN2,BOUT2) from machine import Pin import time pins = (Pin(5, Pin.OUT), # 使用GPIO2~GPIO5控制步进电机A~D Pin(4, Pin.OUT), Pin(3, Pin.OUT), Pin(2, Pin.OUT)) # 使用单相(WAVE DRIVE, One phase at a time)控制模式:D--C--B--A # GPIO5~GPIO2(IN4~IN1)=0b1000, GPIO5-D # GPIO5~GPIO2(IN4~IN1)=0b0100, GPIO4-C # GPIO5~GPIO2(IN4~IN1)=0b0010, GPIO3-B # GPIO5~GPIO2(IN4~IN1)=0b0001, GPIO2-C while True: for step in range(4): # step 0~3 for index, pin in enumerate(pins): # 把索引符合目前step值的GPIO引脚设置为高电平, 其它GPIO引脚设置为低电平 pin.value(index == step) time.sleep_ms(2) # 等待2ms 2.Pico步进电机运动控制MicroPython嵌入pioasm汇编子程序编程 使用Pico开发板MicroPython嵌入pioasm汇编子程序编程技术的介绍可参考文献[2]。 采用MicroPython嵌入pioasm汇编子程序的步进电机WAVE DRIVE步进控制模式程序清单如下(按图5和图6所示的硬件接口,本程序运行通过): from machine import Pin from rp2 import PIO, StateMachine, asm_pio from time import sleep # 使用GPIO2~GPIO5控制步进电机A~D # 使用单相(WAVE DRIVE, One phase at a time)控制模式:D--C--B--A # @asm_pio(set_init=(PIO.OUT_LOW,) * 4) @asm_pio(set_init=(PIO.OUT_LOW, PIO.OUT_LOW, PIO.OUT_LOW, PIO.OUT_LOW)) def stepper_motor(): wrap_target() set(pins, 0b1000) [29] #8:GPIO5~GPIO2(IN4~IN1)=1000, GPIO5-D nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] set(pins, 0b0100) [29] #4: GPIO5~GPIO2(IN4~IN1)=0100, GPIO4-C nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] set(pins, 0b0010) [29] #2: GPIO5~GPIO2(IN4~IN1)=0010, GPIO3-B nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] set(pins, 0b0001) [29] #1: GPIO5~GPIO2(IN4~IN1)=0001, GPIO2-A nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] wrap() sm = StateMachine(0, stepper_motor, freq=100000, set_base=Pin(2)) sm.active(1) # 启动状态机,执行stepper_motor ioasm汇编子程序,步进电机(逆时针CCW)转动 sleep(60) # 延时1分钟 sm.active(0) # 关闭状态机,停止执行stepper_motor ioasm汇编子程序 sm.exec("set(pins,0)") # 设置引脚GPIO5~GPIO2(IN4~IN1)=0000 运行本程序后,步进电机转动1分钟时间,然后停止。下面对本程序中的驱动脉冲作一说明:以GPIO5为例,使GPIO5=1置位的pioasm指令是set(pins, 0b1000) [29],其后跟了6条pioasm指令nop() [29]指令;根据StateMachine(),可知状态机周期(cylces)=1/100000秒=0.01毫秒=10微秒,执行指令占1 cycle,每条指令后都跟了中括号[29]表示延时29 cylces,故从执行set(pins, 0b1000) [29]指令开始,GPIO5引脚输出的电机驱动正脉冲保持时间为(1+29)x7x0.01ms=2.1ms (等同于前面MicroPython程序time.sleep_ms(2)函数中设置的2ms)。 采用MicroPython嵌入pioasm汇编子程序的步进电机FULL STEP步进控制模式程序清单如下(按图5和图6所示的硬件接口,本程序运行通过): from machine import Pin from rp2 import PIO, StateMachine, asm_pio from time import sleep # 使用GPIO2~GPIO5控制步进电机A~D # 使用双相(FULL STEP, two phases at a time)控制模式:DC--CB--BA--AD # @asm_pio(set_init=(PIO.OUT_LOW,) * 4) @asm_pio(set_init=(PIO.OUT_LOW, PIO.OUT_LOW, PIO.OUT_LOW, PIO.OUT_LOW)) def stepper_motor(): wrap_target() set(pins, 0b1100) [29] #8:GPIO5~GPIO2(IN4~IN1)=1100, DC nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] set(pins, 0b0110) [29] #4: GPIO5~GPIO2(IN4~IN1)=0110, CB nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] set(pins, 0b0011) [29] #2: GPIO5~GPIO2(IN4~IN1)=0010, BA nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] set(pins, 0b1001) [29] #1: GPIO5~GPIO2(IN4~IN1)=0001, AD nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] nop() [29] wrap() sm = StateMachine(0, stepper_motor, freq=100000, set_base=Pin(2)) sm.active(1) # 启动状态机,执行stepper_motor ioasm汇编子程序,步进电机(逆时针CCW)转动 sleep(60) # 延时1分钟 sm.active(0) # 关闭状态机,停止执行stepper_motor ioasm汇编子程序 sm.exec("set(pins,0)") # 设置引脚GPIO5~GPIO2(IN4~IN1)=0000 从图7中的FULL STEP驱动模式步进时序图可以看出,本程序使用的双相(FULL STEP, two phases at a time)驱动模式控制顺序为DC→CB→BA→AD,轮流向GPIO5-GPIO2(D-A)发送的二进制控制编码顺序为0b1100→0b0110→0b0011→0b1001。 三、小结 由于MicroPython运行较慢且时间精度低,采用MicroPython嵌入pioasm汇编对GPIO进行编程能获得精确的时间延时,从而在MicroPython环境下就能实现步进电机的高精度定时运动控制。使用pioasm汇编就是用状态机完成对GPIO进行汇编级程序实时控制。 尽管采用pioasm汇编比MicroPython编写GPIO接口程序的难度要大一些,但使用pioasm能摆脱主控制器MCU执行MicroPython的包袱,对GPIO引脚位的控制会变得更为高效,且不会出现主程序被卡死的情况。 |
|
|
|
只有小组成员才能发言,加入小组>>
2435 浏览 0 评论
9100 浏览 4 评论
36773 浏览 19 评论
5026 浏览 0 评论
24745 浏览 34 评论
1528浏览 2评论
1743浏览 1评论
2193浏览 1评论
1553浏览 0评论
524浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 20:43 , Processed in 1.023608 second(s), Total 46, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号