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左右的延时(在我自己的计算机上测试的数据)。这个延时也会包括在每一拍的驱动延时中。

函数二测试代码:

[C] 纯文本查看 复制代码
?
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. 二相四线步进电机的一种四拍驱动时序

    二相四线步进电机的一种四拍驱动时序 电极 1 2 3 4 A+ 1 1 0 0 A- 0 0 1 1 B+ 1 0 0 1 B- 0 1 1 0

  2. 28BYJ48步进电机 4拍、8拍驱动相序表 C51程序代码

    28BYJ48步进电机,这个应该是某宝上售价最低.最适合用来作为入门学习的小电机.本人也是刚刚起步,网上各种相关的资料很杂乱或者不全面,本文旨在系统介绍此款步进电机,作为交流和新人学习参考使用. 本人 ...

  3. STM32/51单片机实训day7——电机驱动|ULN2003A步进电机|Proteus电路设计|旋转角度控制函数|驱动函数|Keil5程序设计

    目录 1  ULN2003A步进电机简介 2  步进电机电路设计 3 旋转角度控制函数 4 程序设计 motor.c motor.h 前期LCD参考文章:​​​​​​​ 内  容:编程实现控制步进电机 ...

  4. 让步进电机动起来——L298N驱动步进电机

    喜欢请关注微信公众号:嵌入式从0到1 公众号内容面向在校大学生.电子爱好者.嵌入式工程师: 涉及电子制作.模块使用.单片机技术.物联网相关知识分享: 软硬件全栈工程师,玩模块,学硬件,带你从0走到1 ...

  5. python绘图实例-Python matplotlib基础绘图函数示例

    原标题:Python matplotlib基础绘图函数示例 Pyplot基础图标函数: 函数 说明 plt.plot(x,y,fmt,-) 绘制一个坐标图 plt.boxplot(data,notch ...

  6. MySQL存储过程和函数示例

    存储过程和函数是在数据库中定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行定义好的SQL语句.存储过程和函数可以避免开发人员重复的编写相同的SQL语句,而且存储过程和函数是在MySQL ...

  7. python中延时函数_python中实现延时回调普通函数示例代码

    python中实现延时回调普通函数示例代码 这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的 ...

  8. Mysql函数示例(如何定义输入变量与返回值)

    Mysql 函数示例 简介 基于mysql实现函数的编写,如何定义输入变量,如何定义和使用返回值等. 获取男女信息 --1 获取男女信息 CREATE FUNCTION getGender(idcar ...

  9. 【Python】自定义排序函数 - 示例

    自定义排序函数 - 示例 自定义排序规则: def cmp_value_p_code_big(o1, o2):"""排序规则: value大,排前面"" ...

最新文章

  1. c++ char数组初始化_c专题指针数组与指针的关联
  2. 算法---------搜索二维矩阵 II(Java 版)
  3. 华为手机可以下载鸿蒙系统吗_华为鸿蒙手机系统首次曝光,汉字界面简洁明了...
  4. java scanner 用不了_java Scanner具有神奇的作用可惜大部分java开发人员不知
  5. 【youcans 的 OpenCV 例程 200 篇】101. 自适应中值滤波器
  6. STL中 set 和 multiset
  7. 福布斯中国2020科技女性榜:蓝港互动廖明香、百度李莹等上榜
  8. 局域网系统设计的主要内容
  9. 如何在虚拟机下安装一个Linux操作系统?(简简单单30步,安装Linux详细教程)
  10. linux rhel 7系统启动过程
  11. 【HTML 教程系列第 9 篇】什么是 HTML 中的换行标签 br
  12. php phalcon 中文手册,基础教程 · Phalcon 3.4中文手册 · 看云
  13. Javaweb使用dom4j解析xml文档的一般姿势
  14. 第四章网络安全学习笔记(超详细)
  15. [NOI2004]郁闷的出纳员 Treap
  16. 重复代码 Duplicated Code
  17. 刘慈欣:元宇宙将是整个人类文明的一次内卷(英文演讲视频)
  18. 【太阳黑子预测】太阳黑子变化规律预测matlab仿真
  19. 关于指数函数等价无穷小的小发现!
  20. 热流体动压润滑matlab_slide-bearing 轴承热弹流计算程序,很好用。可以 高端 。 matlab 238万源代码下载- www.pudn.com...

热门文章

  1. 解决no supported authentication methods avaiable
  2. 前端值得学习的设计网站,提高审美必备。
  3. 大师挑战(武僧在擂台上的对抗)
  4. android动画ppt整理
  5. Web3雇佣兵的现状,Zebec根本上提高用户黏性
  6. 在不损坏C盘的情况下为C盘扩容,适用于Win
  7. linux创建用户并修改用户家目录
  8. 数字图像处理(入门篇)一 图像的数字化与表示
  9. iPhone 5S真机曝光 采用苹果A7处理器
  10. Android视图工作机制之measure、layout、draw