Arduino 与28BYJ-48步进电机两次握手
步进电机是一种将电脉冲转化为角位移的执行机构。 当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个步进角。
您可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的。
同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
28BYJ-48步进电机多用于雕刻机、3D打印机等需要精确控制的设备。本篇使用ULN2003驱动五线四相减速步进电机。
步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。。。本文介绍重点),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。),八拍(A-AB-B-BC-C-CD-D-DA-A。。。)
一、28BYJ-48步进电机工作原理
步进电机每次能转动的最小角度叫做步距角。
每当步进电机接收到一个驱动信号后,步进电机将按照一定的方向转动一个固定的角度。
通过控制脉冲的个数来精确的控制步进电机的角位移量,通过控制脉冲的频率来控制电机转动的速度及加速度,从而达到调速的目的。
本篇使用的步进电机型号为28BYJ-48,1相励磁方式驱动,通过给ABCD四相依次通电来实现转自不停转动。
二、使用步骤
1.实验材料
- Uno R3开发板
- 配套USB数据线
- 六条母母杜邦线
- ULN2003驱动板
- 28BYJ-48步进电机
2.实物接线
ULN2003驱动板上IN1、IN2、IN3、IN4分别连接UNO开发板的数字引脚2,3,4,5;驱动板电源输入+、-引脚分别连接UNO开发板的5V、GND。
3.使用arduino IDE自带的Stepper.h库文件
- 28BYJ-48步进电机的齿轮减速比为64:1,转速约15转/分钟,一些软件采用某些手段和高电压电源(如12伏直流)也能达到约25转/分钟的转速。
- 4步控制信号序列:11.25度/步,32步旋转一周;8步控制信号序列:5.625度/步, 64步旋转一周。
- 正常情况下,4步模式下旋转一周将用:32(步/周)X64(齿轮比) = 2048 步。
代码如下(示例):
include <Stepper.h> // 这里设置步进电机旋转一圈是多少步 #define STEPS 100 //设置步进电机的步数和引脚(就是注意点2里面说的驱动板上IN1~IN4连接的四个数字口)。 Stepper stepper(STEPS, 2, 4, 3, 5);//引脚要互换 void setup() { // 设置电机的转速:每分钟为90步 stepper.setSpeed(90); // 初始化串口,用于调试输出信息 Serial.begin(9600); } void loop() { // 顺时针旋转一周 Serial.println("shun"); stepper.step(2048); //4步模式下旋转一周用2048 步。 delay(500); // 逆时针旋转半周 Serial.println("ni"); stepper.step(-2048); //4步模式下旋转一周用2048 步。 delay(500); }
4.自定义驱动Stepper函数
- 步进电机电压5V,步距角5.625,减速比1:64
- 计算A-B-C-D通电一次转动的角度5.625X2X4/64=0.703125 (2是表示1相励磁方式每步是2倍的步距角,4表示走了4步, 64指电机减速比)
- 转动360度循环ABCD通电的次数360/0.7031=512
- 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。
代码如下(示例)
/* Stepper_Motor(int num, int spd) 步进电机驱动,num正负实现正反转角度,旋转一周大小为512;spd决定速度大小反比例调节,速度最大为3 参考博客:https://blog.csdn.net/TonyIOT/article/details/88605767?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161164488616780299066123%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161164488616780299066123&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-26-88605767.pc_search_result_hbase_insert&utm_term=arduino驱动步进电机&spm=1018.2226.3001.4187 */ void setup() { // put your setup code here, to run once: for (int i = 2; i < 6; i++) { pinMode(i, OUTPUT); } Serial.begin(9600); } void Stepper_Motor(int num, int spd) { if (spd < 3) spd = 3; if (num > 0) for (int count = 0; count < num; count++) { for (int i = 2; i < 6; i++) { digitalWrite(i, HIGH); delay(spd); digitalWrite(i, LOW); } } else for (int count = 0; count < abs(num); count++) { for (int i = 5; i > 1; i--) { digitalWrite(i, HIGH); delay(spd); digitalWrite(i, LOW); } } } void loop() { // put your main code here, to run repeatedly: unsigned long time0 = millis(); Stepper_Motor(100,3);//顺时针 unsigned long time1 = millis(); Serial.print("time11:"); Serial.println(time1 - time0); Stepper_Motor(-100,3);//逆时针 unsigned long time2 = millis(); Serial.print("time22:"); Serial.println(time2 - time1); }
总结
以上就是今天要讲的内容,本文仅仅简单介绍了Stepper.h库文件 和自定义驱动Stepper函数,总之本人第一次写博客,有诸多错处 ,还请留言批评指正
Stepper.h库文件 | 自定义驱动Stepper函数 |
操作方便,易上手 | 灵活改变步进电机的位置和速度 |
– | – |
内部处理不详细 | 单拍驱动顺序明确 |