闲来无事准备搞个硬件玩,然后为了让步进电机动一下买了一堆东西。
本文档将演示 arduino 树莓派 51单片机 驱动步进电机。
本来我是想直接用树莓派驱动步进电机的,可是我没有搜索到树莓派的接线图。然而我刚好有一个闲置了好多年 Arduino。所以先用 Arduino 驱动了步进电机然后参考 Arduino 的接线,替换成树莓派。
使用到的材料
硬件 | 名称 |
---|---|
步进电机 | 42步进电机 扭矩1.28N.m 步距角1.8 电流1.5A |
步进电机驱动器 | 普菲德TB6600 |
电源 | 变压电源 |
脉冲发生器 | raspberryPi Arduino c51 |
这里特别说明一下,电源的话开关电源就可以。开关电源的 220V 接线口是裸露在外边的,我害怕所以就买了变压电源。
我的步进电机的电流1.5A ,步进电机驱动器建议电压是 24V,所以我的电源应当选择 24V 12A 我用的变压电源直接调到这个范围就好了。
除了上述的材料可能你号需要准备一堆杜邦线,我是以前没事干买了一堆。
驱动器设置
驱动器的 1 2 3 还开关设置微步,这这里我选择的是 8 个电脉冲运行一步,1600 个电脉冲运行一周 所以拨下 2 号开关即可。
器的 4 5 6 开关设置步进电机的电流水平,我使用的的步进电机电流是 1.5A,所以播下 4 5 号开关即可。
驱动器上的 DIR 控制电机的旋转方向,PUL 控制运行速度,脉冲越快速度越快。
Arduino 驱动步进电机
我先搞的 Arduino 驱动步进电机,所以先演示 Arduino
首先参考下图进行接线
我的实物接线图
然后向 Arduino 上传下列代码即可,让步进电机逆时针一直运行
const int DIRPin = 2; // 驱动器的 DIR 正极连接到 2 号 io
const int PULPin = 3; // 驱动器的 PUL 正极连接到 3 号 io
void setup() {
// 将使用到的引脚初始化为输出模式
pinMode(DIRPin, OUTPUT);
pinMode(PULPin, OUTPUT);
// 设置旋转方向为逆时针旋转,不设置或者设置为 LOW 为顺时针
digitalWrite(DIRPin, HIGH);
}
void loop() {
// 产生一个电脉冲
digitalWrite(PULPin, HIGH);
delayMicroseconds(500);
digitalWrite(PULPin, LOW);
delayMicroseconds(500);
}
树莓派驱动步进电机
树莓派的电机和驱动器的接线图与 Arduino 完全一致,可以参考上面的 Arduino 接线图,区别就是 DIR+ 连接到 11,PUL+ 连接到 12。DIR- PUL- 连接到 9。
实物接图如下
运行以下代码即可驱动电机逆时针运行一周,代码是参考的 Arduino 代码修改的
#! /usr/bin/env python3
import RPi.GPIO as gpio
import time
DIRPin = 11 # DIR 连接到 11 号引脚
PULPin = 12 # PUL 连接到 12 号引脚
gpio.setmode(gpio.BOARD) # 设置 gpio 为 BOARD
gpio.setup([DIRPin, PULPin], gpio.OUT) # 设置引脚为删除模式
gpio.output(DIRPin, gpio.HIGH) # 设置步进电机逆向运行
usleep = lambda x: time.sleep(x/1000000.0) # 以微妙为延迟单位 功能类似于 Arduino 的 delayMicroseconds 函数
for i in range(1600): # 运行一周需要的脉冲数
# 产生一个电脉冲
gpio.output(PULPin, gpio.HIGH)
usleep(200)
gpio.output(PULPin, gpio.LOW)
usleep(200)
gpio.cleanup() # 退出运行前清理掉 gpio 的设定,没有这一步的话下次使用 gpio 时会显示警告
51 单片机驱动步进电机
51 单片机我使用的是 STC89C52RC 开发板,接线方式与上面两种有一些细小的区别。
51 单片机使用共阳极接线法,上面两种使用的是共阴极接线法。
接线方式我是使用万用表(万用表也是为了玩步进电机专门买的)测出来的,大家可以参考一下。
使用 c51 驱动步进步进电机,至少需要你使用 51开发板点亮过一颗 LED 灯,51 单片机的详细使用方式我这里就不演示了。
驱动器的上的 DIR+ PUL+ 连接到 5V, PIR- 连接到 P20 PUL- 连接到 P21
向 51 单片机写入以下代码既可让步进电机一直逆时针旋转,因是共阳极接线,所以逻辑和上面两个是反的,0 是导通,1是不导通
#include <INTRINS.H>
#include <REGX52.H>
void Delay200us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 89;
while (--i);
}
void main() {
P2_0 = 0; // DIR
// 生成脉冲
while (1) {
P2_1 = ~P2_1; // PUL
Delay200us();
}
}
参考资料
https://www.makerguides.com/tb6600-stepper-motor-driver-arduino-tutorial/