树莓派控制57步进电机

一、简介

使用树莓派控制57步进电机。

二、硬件设备

  • 57两相四线步进电机 ×1
  • DM542驱动器 ×1
  • 树莓派 ×1
  • 3.3V-5V电平转换 ×1
  • 24V / 36V电源 ×1
  • 三孔带插头单头裸尾电源线 ×1

电源

需要自己买电源线(3源, 火线,零线,地线)

电源线

DM542

电平转换器

三、接线

查看大图

接线

3.1 步进电机 与 驱动器 接线

驱动器A+A-B+B-
步进电机绿

3.2 驱动器 与 树莓派 接线

由于驱动器接收的脉冲高电平为5V,而树莓派GPIO端口输出的高电平为3.3V,所以需要经过“3.3-5V电平转换模块”。先介绍一下该模块:

购买:淘宝搜索“电平转换模块”

电平转换模块

接线

右侧DIR端口

方向DIR 电平
A ==> B高 (默认)
B ==> A

这里我们将通信方向设为 B ==> A,也就是DIR端口置低电平。

B区基准电源 接 3.3V 和 GND。

A区基准电源 接 5V 和 GND。

这样,从B0 ~ B7输入3.3v电平,将从A0 ~ A7输出5V电平 !

接线

驱动器DIR+PUL+DIR-PUL-
电平转换模块 A端A0A1DIRVCCGND
电平转换模块 B端B0B1VCCGND
树莓派35(BCM19)37(BCM26)GNDGND40(BCM21)5VGND3.3VGND

四、驱动原理

  • PUL+:脉冲输入。
  • DIR+:控制电机转动方向,高电平正(反)转,低电平反(正)转。

我们使用的步进电机的步距角为1.8度,360/1.8=200,也就是步进电机接受到200个脉冲,就会转一圈360度。

但是驱动器对脉冲进行了细分。(驱动器上,可以手动选择细分程度)

接线

细分

例如我们将细分设为1600脉冲/圈,也就是每接受到1600个脉冲才转动一圈(相比电机200个脉冲转一圈确实是细分了)。

SW5SW6向下拨动(ON),S7S8向上拨动(OFF),即可将细分设置为1600脉冲/圈。

五、编程(C/C++语言,wiringPi库)

现在,一切就绪了,只需要编程,让树莓派输出脉冲给驱动器即可。

我们这里暂时不使用树莓派的PWM功能,而是直接进行电平的高速变换。

digitalWrite(pinPUL, HIGH);
delayMicroseconds(200);		// 暂停200微秒
digitalWrite(pinPUL, LOW);
delayMicroseconds(200);		// 暂停200微秒

这样,即可输出一次脉冲。

注意:别忘了电平转换模块的DIR端口!!!输入低电平!!!

完整的代码

// stepmotor.cpp
#include <stdio.h>
#include <wiringPi.h>

// BCM编码
const int pinPUL = 26;  // 驱动器PUL+
const int pinDIR = 19;  // 驱动器DIR+
const int pinTRAN = 21; // 电平转换模块DIR (TRAN是Transform缩写)

// 初始化
int setup() {
    // BCM编码
    // 如果使用其他编码方式,上面的pinPUL和pinDIR也需要相应修改
    if (wiringPiSetupGpio() != 0) {
        printf("Wiringpi setup failed\n");
        return 0;
    }

    pinMode(pinPUL, OUTPUT);
    pinMode(pinDIR, OUTPUT);
    pinMode(pinTRAN, OUTPUT);
    
    // 电平转换模块DIR端口置低电平,转换方向为 B==>A
    digitalWrite(pinTRAN, LOW);
    
    return 1;
}

// 顺时针转动(这里是假设,需要自行验证)
void CW() {
    digitalWrite(pinDIR, LOW);
}

// 逆时针转动
void CCW() {
    digitalWrite(pinDIR, HIGH);
}

// 发射一次脉冲
// @param: delayMicroS (微秒)
//    可以控制脉冲频率,进而控制电机转速
//    参数值越大,每两次脉冲之间的延时越长,脉冲频率越低,转速越慢
//    参数值越小,转速越快
// 但是!尽量不要小于60
void pulseOnce(int delayMicroS) {
    digitalWrite(pinPUL, HIGH);
    delayMicroseconds(delayMicroS);
    digitalWrite(pinPUL, LOW);
    delayMicroseconds(delayMicroS);
}

// 发射count次脉冲
void pulse(int count, int delayMicroS) {
    for (int i = 0; i < count; ++i) {
        pulseOnce(delayMicroS);
    }
}


int main() {
    if (!setup()) {
        return 1;
    }

    // 设置为顺时针转动
    CW();

    // 转5圈
    pulse(1600 * 5, 200);
}

编译:

g++ -o out microstep.cpp -lwiringPi

运行

./out

即可观察到步进电机顺(逆)时针转动5圈。

GPIO

六、说明

通过控制两次脉冲之间的时间间隔,控制脉冲频率。

时间间隔越短,频率越高,点击转动速度越快。

但是,频率不能太高,否则将出现丟步或不转的情况,而且发出异响。

经过我的测试,当细分设置为1600脉冲/圈时,时间间隔不能低于60微秒。而且当时间介于60微秒到100微秒时,应该逐步缩小时间间隔,不能一下子就将时间间隔设为很低的值,也就是要给步进电机一个加速的过程,逐渐缩短脉冲的时间间隔,逐步提高转速。(减速同理)

int main() {
    if (!setup()) {
        return 1;
    }

    // 设置为顺时针转动
    CW();
    
    // 转动14圈
    //    加速:2圈,脉冲时间间隔从160微秒,逐渐缩短为60微秒
    //    匀速:10圈,脉冲时间间隔为60微秒
    //    减速:2圈,脉冲时间间隔从60微秒,逐渐增加为160微秒
    int delayMicroSecStart = 160;
    int delayMicroSecEnd = 60;
    
    // 加速:2圈
    // 每发射160个脉冲,将脉冲间隔缩短5微秒
    // 总共消耗160*20=3200个脉冲,也就是电机转动2圈
    int delayMicroSec = delayMicroSecStart;
    for (int i = 0; i < 20; ++i) {
        pulse(160, delayMicroSec);
        delayMicroSec -= 5;
    }

    // 匀速:10圈
    for (int i = 0; i < 1600 * 10; ++i) {
        pulseOnce(delayMicroSecEnd);
    }
    
    // 减速:2圈
    // 每发射160个脉冲,将脉冲间隔增加5微秒
    delayMicroSec = delayMicroSecEnd;
    for (int i = 0; i < 20; ++i) {
        pulse(160, delayMicroSec);
        delayMicroSec += 5;
    }
}

END

Author: iC

GitHub: Leopard-C

Email: leopard.c@outlook.com

Thanks for reading!

  • 22
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值