步进电机的8拍驱动函数示例
http://www.arduino.cn/thread-16151-1-1.html
在做arduino的步进电机实验时,很多人都是直接用IDE自带的stepper库来驱动步进电机。但是这个库只封装了2拍和4拍的步进电机驱动,而很多步进电机(如常见的28BYJ-48)是8拍驱动的。当然4拍也可以转起来,不过精度、平稳性和力矩都没有8拍好。
其实,驱动步进电机是个很简单的事情。在每种电机的资料中,都有驱动表格,如果有一定的编程能力,最好自己写个函数来驱动,可以做到最简洁而优雅,且占用最少的资源。这种简单的驱动,没有必要封装成库。
作为例子,针对上述28BYJ-48步进电机(5V,步进角度5.625,5线4相,8拍驱动,机械减速1:64),做了两个驱动函数。第一个示例函数用传统的方式,代码使用switch case结构,看起来比较清晰,可以作为思路的参考。第二个示例函数用了单片机口的概念,体现了单片机的特点,简洁而优雅。
这两个示例函数可以在1.0版以上的IDE中调用,都已测试通过。测试的最新版本是1.6.3。
只要有步进电机的驱动数据表格,这两个函数稍作修改就可以用于各种步进电机。
下面是28BYJ-48步进电机的驱动表格。
函数一测试代码:
int p = 0; // 拍计数,顺时针7-0,逆时针0-7。
int t=24; // 每拍延时,控制速度,1ms对应最高速。// 负值为逆时针方向。void setup() {Serial.begin(9600); //初始化串口,作为监视。pinMode(4,OUTPUT); //设置D4-D7脚为步进电机控制脚。pinMode(5,OUTPUT);pinMode(6,OUTPUT);pinMode(7,OUTPUT);
}void loop() {
// Serial.println(p); // 串口输出拍数,调试用。t = 1; // 每拍延时24ms,设置转速和方向。负值逆时针转。one_step(t); // 驱动一拍。
}// 此函数驱动一拍,参数控制速度与旋转方向。
void one_step(int t) {switch(p) {case 0: // (0001) 对应8拍不同的输出值。digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,HIGH);break;case 1: // (0011)digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(6,HIGH);digitalWrite(7,HIGH);break;case 2: // (0010)digitalWrite(4,LOW);digitalWrite(5,LOW);digitalWrite(6,HIGH);digitalWrite(7,LOW);break;case 3: // (0110)digitalWrite(4,LOW);digitalWrite(5,HIGH);digitalWrite(6,HIGH);digitalWrite(7,LOW);break;case 4: // (0100)digitalWrite(4,LOW);digitalWrite(5,HIGH);digitalWrite(6,LOW);digitalWrite(7,LOW);break;case 5: // (1100)digitalWrite(4,HIGH);digitalWrite(5,HIGH);digitalWrite(6,LOW);digitalWrite(7,LOW);break;case 6: // (1000)digitalWrite(4,HIGH);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,LOW);break;case 7: // (1001)digitalWrite(4,HIGH);digitalWrite(5,LOW);digitalWrite(6,LOW);digitalWrite(7,HIGH);break;}if (t < 0) { // t为负值,正向计数0-7。p ++;if (p > 7 ) {p = 0; // 计数到7重新开始。}} else { // t为正值,逆向计数7-0。p --;if ( p < 0 ) { // 计数到零重新开始。p = 7;}}Serial.println(abs(t));delay(abs(t)); // 延时,短则转速高。
}
函数one_step()可以驱动一拍,使用方法在注释中都有。速度用延时函数控制,延时越少,速度越快。延时1ms可以轻松启动。注意,使用串口调试时,每发送一条串口数据,会有5ms左右的延时(在我自己的计算机上测试的数据)。这个延时也会包括在每一拍的驱动延时中。
函数二测试代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
/* 步进电机8拍驱动,对应28BYJ-48,每圈64步,减速比64,
输出轴每圈4096步。使用二进制掩码直接置位输出口。
*/
int p = 0; // 拍计数,顺时针0-7,逆时针7-0。
int t; // 每拍延时,控制速度,1ms对应最高速。负值为逆时针方向。
byte b[] = {B00010000,B00110000,B00100000,B01100000,
B01000000,B11000000,B10000000,B10010000};
// 对应每拍的D4-D7脚输出掩码。高4位有效。
void setup() {
// Serial.begin(9600); // 初始化串口,作为监视。
DDRD = DDRD | B11110000; // 置D4-D7脚为步进输出,其它脚不变。
}
void loop() {
// Serial.println(p); // 串口输出拍数,调试用。
t = -24; // 每拍延时24ms,设置转速和方向。负值逆时针转。
one_step(t); // 驱动一拍。
}
// 此函数驱动一拍,参数控制速度与旋转方向。
void one_step( int t) {
PORTD = PORTD & B00001111; // 清除D4-D7脚,D0-D3脚不变。
PORTD = PORTD | b[p]; // 置位D4-D7脚,D0-D3脚不变。
// Serial.println(PORTD,BIN); // 串口输出掩码,调试用。
if (t < 0) { // t为负值,逆向计数0-7。
p --;
if (p < 0 ) {
p = 7; // 计数到0重新开始。
}
} else { // t为正值,逆正向计数7-0。
p ++;
if ( p > 7 ) { // 计数到7重新开始。
p = 0;
}
}
delay( abs (t)); // 延时,短则转速高。
}
|
函数one_step()可以驱动一拍,使用方法在注释中都有。DDRD和PORTD是IDE的内置常数,分别表示arduino板上D0-D7脚的输出方向和输出状态,用二进制数直接可以定义。具体可查阅http://wiki.geek-workshop.com/doku.php?id=arduino:arduino_language_reference。
在arduino的学习和实验中,建议还是要学一点单片机的编程知识,最好不要照搬教程或者别人的代码,至少要问一个问什么。可以打开看看自己用到的官方库或第三方库,是不是适合自己的硬件。
代码的简洁和优雅,体现了编程的教养。
步进电机的8拍驱动函数示例相关推荐
- 二相四线步进电机的一种四拍驱动时序
二相四线步进电机的一种四拍驱动时序 电极 1 2 3 4 A+ 1 1 0 0 A- 0 0 1 1 B+ 1 0 0 1 B- 0 1 1 0
- 28BYJ48步进电机 4拍、8拍驱动相序表 C51程序代码
28BYJ48步进电机,这个应该是某宝上售价最低.最适合用来作为入门学习的小电机.本人也是刚刚起步,网上各种相关的资料很杂乱或者不全面,本文旨在系统介绍此款步进电机,作为交流和新人学习参考使用. 本人 ...
- STM32/51单片机实训day7——电机驱动|ULN2003A步进电机|Proteus电路设计|旋转角度控制函数|驱动函数|Keil5程序设计
目录 1 ULN2003A步进电机简介 2 步进电机电路设计 3 旋转角度控制函数 4 程序设计 motor.c motor.h 前期LCD参考文章: 内 容:编程实现控制步进电机 ...
- 让步进电机动起来——L298N驱动步进电机
喜欢请关注微信公众号:嵌入式从0到1 公众号内容面向在校大学生.电子爱好者.嵌入式工程师: 涉及电子制作.模块使用.单片机技术.物联网相关知识分享: 软硬件全栈工程师,玩模块,学硬件,带你从0走到1 ...
- python绘图实例-Python matplotlib基础绘图函数示例
原标题:Python matplotlib基础绘图函数示例 Pyplot基础图标函数: 函数 说明 plt.plot(x,y,fmt,-) 绘制一个坐标图 plt.boxplot(data,notch ...
- MySQL存储过程和函数示例
存储过程和函数是在数据库中定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行定义好的SQL语句.存储过程和函数可以避免开发人员重复的编写相同的SQL语句,而且存储过程和函数是在MySQL ...
- python中延时函数_python中实现延时回调普通函数示例代码
python中实现延时回调普通函数示例代码 这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的 ...
- Mysql函数示例(如何定义输入变量与返回值)
Mysql 函数示例 简介 基于mysql实现函数的编写,如何定义输入变量,如何定义和使用返回值等. 获取男女信息 --1 获取男女信息 CREATE FUNCTION getGender(idcar ...
- 【Python】自定义排序函数 - 示例
自定义排序函数 - 示例 自定义排序规则: def cmp_value_p_code_big(o1, o2):"""排序规则: value大,排前面"" ...
最新文章
- c++ char数组初始化_c专题指针数组与指针的关联
- 算法---------搜索二维矩阵 II(Java 版)
- 华为手机可以下载鸿蒙系统吗_华为鸿蒙手机系统首次曝光,汉字界面简洁明了...
- java scanner 用不了_java Scanner具有神奇的作用可惜大部分java开发人员不知
- 【youcans 的 OpenCV 例程 200 篇】101. 自适应中值滤波器
- STL中 set 和 multiset
- 福布斯中国2020科技女性榜:蓝港互动廖明香、百度李莹等上榜
- 局域网系统设计的主要内容
- 如何在虚拟机下安装一个Linux操作系统?(简简单单30步,安装Linux详细教程)
- linux rhel 7系统启动过程
- 【HTML 教程系列第 9 篇】什么是 HTML 中的换行标签 br
- php phalcon 中文手册,基础教程 · Phalcon 3.4中文手册 · 看云
- Javaweb使用dom4j解析xml文档的一般姿势
- 第四章网络安全学习笔记(超详细)
- [NOI2004]郁闷的出纳员 Treap
- 重复代码 Duplicated Code
- 刘慈欣:元宇宙将是整个人类文明的一次内卷(英文演讲视频)
- 【太阳黑子预测】太阳黑子变化规律预测matlab仿真
- 关于指数函数等价无穷小的小发现!
- 热流体动压润滑matlab_slide-bearing 轴承热弹流计算程序,很好用。可以 高端 。 matlab 238万源代码下载- www.pudn.com...