Arduino 各种模块篇 步进电机 step motor( 不用库,不用shield, 纯)

下面上一些代码,是没有用任何库的.

仅仅是将步进点击链接到arduino不同的8, 9, 10 , 11口上的

 

Arduino 控制步进电机 2012-06-11 12:44:44
原帖:http://blog.chinaunix.net/uid-23686726-id-3238613.html
 
代码让我给改了改, 还是推荐装个motor shield吧.不然这样折腾 单片机肯定是不撑的.
 
看样子是4步8相的.

分类: 嵌入式

        int Pin0 = 8;
        int Pin1 = 9;
        int Pin2 = 10;
        int Pin3 = 11;
        int _step = 0;
        boolean dir = true;//正反转的 flag
        int stepperSpeed = 1;//电机转速,1ms一步
        void setup()
        {
          pinMode(Pin0, OUTPUT);
          pinMode(Pin1, OUTPUT);
          pinMode(Pin2, OUTPUT);
          pinMode(Pin3, OUTPUT);
        }
         //用下面的代码仿照PWM输出,看看类不累..哈哈.._step 从0 加到7 再变成0, 就这样一直循环下去.
        void loop()
        {
          switch(_step){
            case 0:
              digitalWrite(Pin0, LOW);
              digitalWrite(Pin1, LOW);
              digitalWrite(Pin2, LOW);
              digitalWrite(Pin3, HIGH);
            break;
            case 1:
              digitalWrite(Pin0, LOW);
              digitalWrite(Pin1, LOW);
              digitalWrite(Pin2, HIGH);
              digitalWrite(Pin3, HIGH);
            break;
            case 2:
              digitalWrite(Pin0, LOW);
              digitalWrite(Pin1, LOW);
              digitalWrite(Pin2, HIGH);
              digitalWrite(Pin3, LOW);
            break;
            case 3:
              digitalWrite(Pin0, LOW);
              digitalWrite(Pin1, HIGH);
              digitalWrite(Pin2, HIGH);
              digitalWrite(Pin3, LOW);
            break;
            case 4:
              digitalWrite(Pin0, LOW);
              digitalWrite(Pin1, HIGH);
              digitalWrite(Pin2, LOW);
              digitalWrite(Pin3, LOW);
            break;
            case 5:
              digitalWrite(Pin0, HIGH);
              digitalWrite(Pin1, HIGH);
              digitalWrite(Pin2, LOW);
              digitalWrite(Pin3, LOW);
            break;
              case 6:
              digitalWrite(Pin0, HIGH);
              digitalWrite(Pin1, LOW);
              digitalWrite(Pin2, LOW);
              digitalWrite(Pin3, LOW);
            break;
            case 7:
              digitalWrite(Pin0, HIGH);
              digitalWrite(Pin1, LOW);
              digitalWrite(Pin2, LOW);
              digitalWrite(Pin3, HIGH);
            break;
            default:
              digitalWrite(Pin0, LOW);
              digitalWrite(Pin1, LOW);
              digitalWrite(Pin2, LOW);
              digitalWrite(Pin3, LOW);
            break;
          }
          if(dir){
            _step++;
          }else{
            _step--;
          }
          if(_step>7){        //请注意,这边_step> 7的时候,已经是在上面的那个判断里面从7加到8了.但是, 最后一次执行的时候,还是7 !!!
            _step=0;      //所以这里变成0 是必须的.
          }
          if(_step<0){       //同理
            _step=7;
          }
          delay(stepperSpeed);        //电机休息一下,用来调速用的.
        }

 

这里,还转了一些别人做过的一些实验. 对步进电机介绍的比较详细:

原帖地址:http://www.geek-workshop.com/forum.php?mod=viewthread&tid=101

步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的 方向转动一个固定的角度(及步进角)。你可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时你也可以通过控制脉冲频率来控制电机转动的速 度和加速度,从而达到调速的目的。

下面这个就是本次实验使用的步进电机


IMGP0641_调整大小.JPG

工业使用的步进电机与本次实验使用的不同,下面图式两种不同款式的工业用步进电机

步进电机_调整大小.jpg

使用步进电机前一定要仔细查看说明书,确认是四相还是两相,各个线怎样连接,本次实验使用的步进电机是四相的,不同颜色的线定义如下图:

Snap2.jpg

下面是电机的端口结构图,1,3为一组,2,4为一组,5号是共用的VCC。

28BYJ48内部结构图.jpg

因本次使用的步进电机功率很小,所以可以直接使用一个ULN2003芯片进行驱动,如果是大功率的步进电机,是需要对应的驱动板的。

IMGP0596_调整大小.JPG

ULN2003 是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成。可以用来驱动步进电机。

其结构图如下


Snap3.jpg

硬件连接图如下

Snap1.jpg

IMGP0590_调整大小.JPG

把代码下载到arduino控制板中看看效果

    /*
     * 步进电机跟随电位器旋转
     * (或者其他传感器)使用0号模拟口输入
     * 使用arduino IDE自带的Stepper.h库文件
     */
     
    #include <Stepper.h>
     
    // 这里设置步进电机旋转一圈是多少步
    #define STEPS 100
     
    // attached to设置步进电机的步数和引脚
    Stepper stepper(STEPS, 8, 9, 10, 11);
     
    // 定义变量用来存储历史读数
    int previous = 0;
     
    void setup()
    {
      // 设置电机每分钟的转速为90步
      stepper.setSpeed(90);
    }
     
    void loop()
    {
      // 获取传感器读数
      int val = analogRead(0);
     
      // 移动步数为当前读数减去历史读数
      stepper.step(val - previous);
     
      // 保存历史读数
      previous = val;
    }

 电流芯片文档下载地址:

http://www.ti.com/lit/ds/symlink/uln2003a.pdf

 

posted @ 2013-04-10 17:29  spaceship9  阅读(10036)  评论(0编辑  收藏  举报