树莓派控制57步进电机
一、简介
使用树莓派控制57步进电机。
二、硬件设备
- 57两相四线步进电机 ×1
- DM542驱动器 ×1
- 树莓派 ×1
- 3.3V-5V电平转换 ×1
- 24V / 36V电源 ×1
- 三孔带插头单头裸尾电源线 ×1
需要自己买电源线(3源, 火线,零线,地线)
三、接线
查看大图
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端 | A0 | A1 | DIR | VCC | GND | ||||
电平转换模块 B端 | B0 | B1 | VCC | GND | |||||
树莓派 | 35(BCM19) | 37(BCM26) | GND | GND | 40(BCM21) | 5V | GND | 3.3V | GND |
四、驱动原理
- PUL+:脉冲输入。
- DIR+:控制电机转动方向,高电平正(反)转,低电平反(正)转。
我们使用的步进电机的步距角为1.8度,360/1.8=200,也就是步进电机接受到200个脉冲,就会转一圈360度。
但是驱动器对脉冲进行了细分。(驱动器上,可以手动选择细分程度)
例如我们将细分设为1600脉冲/圈,也就是每接受到1600个脉冲才转动一圈(相比电机200个脉冲转一圈确实是细分了)。
将SW5
和SW6
向下拨动(ON),S7
和S8
向上拨动(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==>AdigitalWrite(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圈。
六、说明
通过控制两次脉冲之间的时间间隔,控制脉冲频率。
时间间隔越短,频率越高,点击转动速度越快。
但是,频率不能太高,否则将出现丟步或不转的情况,而且发出异响。
经过我的测试,当细分设置为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!
树莓派控制57步进电机相关推荐
- 树莓派利用python控制57步进电机
一.57步进电机参数 二.树莓派利用python控制57步进电机 import RPi.GPIO as GPIO import time# w1,w2,w3,w4,w5,w6 = 0,1,0,0,0, ...
- 树莓派+驱动器 控制57步进电机运动
零.汇总 通过Python RPi.GPIO 控制树莓派引脚输出高低电平.脉冲电平 驱动器接收接收树莓派信号,驱动57步进电机工作 一.树莓派 树莓派图: 1.2 树莓派引脚 二.驱动器及57步进电机 ...
- python控制树莓派马达_树莓派控制步进电机
要想使用树莓派制作只能小车,需要先学会控制步进电机,下面就是用python控制28BJY-48步进电机和ULN2003控制板的代码: #!/usr/bin/python #引入需要的库 import ...
- Arduino对57步进电机的控制
最近实验室的智能车从大车路线改到了小车路线,于是笔者也跟着学习一些新的知识.大车的控制可以使用标准的CAN协议,很多方便的指令都能够通过CAN来传输给ECU并得到相应的反馈.然而对于最近接触的电动小白 ...
- 树莓派3B控制28步进电机
由于项目需要楼主需要利用步进电机来实现一个开关拉门的动作.由于,控制精度要求不高,所以只需要树莓派做控制器即可.网上树莓派控制步进电机的教程大多局限于如图所示的小功率步进电机,不符合项目需求.所以,楼 ...
- 【STM32】stm32驱动TB6600控制42/57步进电机的案例(TIM中断和PWM实验)
步进电机的简单使用 接线: TB6600驱动盒的详细说明: 程序设计: 工程文件: 做毕业设计要用到57步进电机,所以花了两天时间做了一下电机函数 从淘宝查的资料: 接线如图: 接线: DIR- &a ...
- 树莓派控制温湿度传感器DHT11
2019独角兽企业重金招聘Python工程师标准>>> 小π因为好几次断电之前没有关掉系统,导致系统老是起不来.无奈只好重写了SD卡.装好后前天晚上把一个温湿度传感器(DHT11)接 ...
- STM32F407-用TB6600驱动器驱动57步进电机(代码+连线)
一.硬件 1.硬件准备 57步进电机(型号57CM18),驱动器TB6600,开发板STM32F407ZGT6 2.电气特性 3.连线 驱动器右边分有两个区域 Signal:用于驱动器与开发板连接,进 ...
- 树莓派Pico直流步进电机接口技术及电机运动控制MicroPython+pioasm编程方法
内容目录 一.树莓派Pico直流步进电机接口技术 1.直流步进电机及其驱动电路原理介绍 2.Pico开发板扩展GPIO口与步进电机驱动接口 二.树莓派Pico电机运动控制MicroPython+pio ...
最新文章
- 搞定一个C++项目最快需要多久?
- 如何从Subversion存储库中git-svn克隆最后n个修订版?
- golang中的读写锁
- 前端学习(1348):用户的增删改查操作5修改
- Redis windows学习(二)——Redis持久化的AOF模式和RDB模式
- LeetCode 820. 单词的压缩编码(后缀树)
- 安卓向服务器发送List数据
- MFC对话框自适应大小(四舍五入)高精度版本
- 数据在内存中的存储(二进制形式存储)
- sql相同顺序法和一次封锁法_不到75行代码,导出最高法指导案例到excel(一)...
- 各种Adapter的用法
- 这『六本』电子书能帮助你成为优秀的程序员(含下载地址)
- kettle使用数据库来生成序列_kettle 生成 ktr
- Python使用jieba库实现分词统计词频
- 18.Hermite插值
- SpringBoot+Vue项目网上家电商城
- Vue项目:IE11中地址栏直接改变路由页面不跳转bug
- android查看app日志的一个技能
- python eel_python eel打包问题解决
- 基于threejs,完成一个简单的全景图播放器