内容目录
一、树莓派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 timepins = (Pin(5, Pin.OUT),  # 使用GPIO2~GPIO5控制步进电机A~DPin(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-Cwhile True:for step in range(4):  # step 0~3for 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-Dnop()          [29]nop()           [29]nop()           [29]nop()           [29]nop()           [29]nop()           [29]set(pins, 0b0100)       [29]    #4: GPIO5~GPIO2(IN4~IN1)=0100, GPIO4-Cnop()            [29]nop()           [29]nop()           [29]nop()           [29]nop()           [29]nop()           [29]set(pins, 0b0010)       [29]    #2: GPIO5~GPIO2(IN4~IN1)=0010, GPIO3-Bnop()            [29]nop()           [29]nop()           [29]nop()           [29]nop()           [29]nop()           [29]set(pins, 0b0001)       [29]    #1: GPIO5~GPIO2(IN4~IN1)=0001, GPIO2-Anop()            [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, DCnop()           [29]nop()           [29]nop()           [29]nop()           [29]nop()           [29]nop()           [29]set(pins, 0b0110)       [29]    #4: GPIO5~GPIO2(IN4~IN1)=0110, CBnop()         [29]nop()           [29]nop()           [29]nop()           [29]nop()           [29]nop()           [29]set(pins, 0b0011)       [29]    #2: GPIO5~GPIO2(IN4~IN1)=0010, BAnop()         [29]nop()           [29]nop()           [29]nop()           [29]nop()           [29]nop()           [29]set(pins, 0b1001)       [29]    #1: GPIO5~GPIO2(IN4~IN1)=0001, ADnop()         [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引脚位的控制会变得更为高效,且不会出现主程序被卡死的情况。

参考文献:
[1]博主CSDN博文.树莓派Pico直流电机接口技术及PWM电机调速控制MicroPython编程.
[2]博主CSDN博文.树莓派Pico开发板MicroPython嵌入pioasm汇编混合编程技术实践.

发布日期:2021年07月19日

树莓派Pico直流步进电机接口技术及电机运动控制MicroPython+pioasm编程方法相关推荐

  1. 树莓派Pico W无线开发板MQTT协议通信MicroPython编程实践

    本博文介绍采用Thonny+MicroPython和umqtt.simple库MQTTClient类的对象方法编制树莓派Pico W无线开发板MQTT协议通信程序,将Pico W无线开发板.电脑或An ...

  2. 【计算机原理与接口技术(UNIX)⑲ 完结篇】——可编程计数器 8254 [ 流光发生器、8254工作方式检测程序的设计]

    ✅ 通过对 [计算机与UNIX汇编原理 ① ~ ⑫]的学习,我们已经大致掌握了汇编程序设计的相关知识 接下来,我将其分栏名改为 [计算机原理与接口技术(UNIX) ],重点将放在 "计算机原 ...

  3. 【接口技术】实验五:可编程并行接口8255

    文章目录 一. 实验目的 二. 实验内容 实验5-1 8255并行输入/输出实验 实验5-2 并行接口键盘反转扫描实验 一. 实验目的 了解8255芯片结构及编程方法. 了解8255输入/输出实验方法 ...

  4. 工业控制计算机硬件基础知识,第五章 工业控制计算机及其接口技术知识 机电一体化课件.ppt...

    第五章 工业控制计算机及其接口技术知识 机电一体化课件.ppt (3) 编程方法举例 1. A/D编程 下面C语言例程为软件触发A/D和软件查询方式完成A/D转换功能,模拟输入范围为±5V增益为1. ...

  5. matlab数据接口技术,matlab接口技术与应用

    matlab接口技术与应用 来源:mamingkeda 作者:华仔 浏览:1070 时间:2016-08-10 14:18 标签: 摘要: matlab接口技术与应用应用程序接口的使用方法.全书分为1 ...

  6. 【计算机原理与接口技术(UNIX)⑱】——并行 I/O 接口 [ 芯片8255A ]

    ✅ 通过对 [计算机与UNIX汇编原理 ① ~ ⑫]的学习,我们已经大致掌握了汇编程序设计的相关知识 接下来,我将其分栏名改为 [计算机原理与接口技术(UNIX) ],重点将放在 "计算机原 ...

  7. 第六章微型计算机,微型计算机原理及应用 第六章微型计算机的接口技术

    微型计算机原理及应用 第六章微型计算机的接口技术 (124页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 l第6章 微型计算机接口技术 第 ...

  8. 《微型计算机原理与接口技术》期末总复习 —— 一篇匆匆忙忙的复习笔记

    这篇复习笔记是针对<微型计算机原理与接口技术>后面几章的 前面的汇编复习内容在 "零.学习笔记总目录" 的 "汇编考前复习" 中 ✅ 这篇笔记中可能 ...

  9. 树莓派Pico直流电机接口技术及PWM电机调速控制MicroPython编程

    内容目录: 一.树莓派Pico开发板直流电机接口技术 1.H桥驱动电路的基本工作原理 2.典型H桥驱动电路分析 3.DRV8833双H桥电机驱动模块介绍 4.Pico开发板与直流电机接口 二.Pico ...

最新文章

  1. NR 1G - 5G基站介绍
  2. vue refs v-for 使用注意
  3. 绑定服务调用本地服务中的方法
  4. App设计灵感之十二组精美的智能家居操作App设计案例
  5. 从HelloWorld看iphone程序的生命周期
  6. python时间格式转换time模块
  7. Java 中的 SPI 机制是到底是什么?高级 Java 必须掌握!
  8. 仅限今天,《Linux就该这么学》半价优惠仅需39.5元。
  9. chrome安装测试打包插件
  10. linux系统论文题目大全_操作系统专业论文选题 操作系统毕业论文题目如何定
  11. ES6面试题(参考文档)
  12. web开发网,前端实战项目百度云
  13. html是编程语言表情包,语言编程表情包 - 语言编程微信表情包 - 语言编程QQ表情包 - 发表情 fabiaoqing.com...
  14. python校园排课选课系统毕业设计开题报告
  15. 已知xyz yzz 532Java_已知 xyz+yzz=532 ,其中 x 、 y 、 z 为数字,编程求出 x 、 y 、 z 的值。_学小易找答案...
  16. 魅蓝metal刷android 6,魅蓝metal刷机包 Flyme 6.1.0.0Y稳定版 对系统稳定性和功耗表现进行了特定优化...
  17. 程序员办公桌都如此霸气,网友:砖头当杯垫也是不敢惹!
  18. 三升序列 和递增序列
  19. Jquery 对 身份证号码的验证 (15/18位)
  20. GIC检测中断的流程

热门文章

  1. 曙光服务器重装系统centos7.9
  2. 转发 :QQ游戏百万人同时在线服务器架构实现
  3. 史上最全图解JVM,京东小哥带你了解性能提升100%背后的秘密武器
  4. 云虚拟主机数据库连接和url重写
  5. eChat(微聊天)
  6. win10清理C盘空间
  7. Android手机 根目录的含义
  8. Eclipse中使用search功能,搜索内容无法多窗口打开
  9. 对互联网产品运营的理解
  10. 中国房价均价去年每平4600元 房改后涨幅最高