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相的.
具体4步8相是啥,请看我上篇博客:http://www.cnblogs.com/spaceship9/archive/2013/04/10/3012552.html

分类: 嵌入式

        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

 

转载于:https://www.cnblogs.com/spaceship9/archive/2013/04/10/3012780.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用C语言编写的Arduino控制步进电机转动的代码,该代码没有使用任何,通过中断控制实现了步进电机的转动: ```c // 定义步进电机引脚 #define STEP_PIN 2 #define DIR_PIN 3 // 定义步进电机转动速度 #define STEPS_PER_REV 200 #define RPM 15 #define STEP_DELAY_MICROSECONDS (60 * 1000000 / STEPS_PER_REV / RPM) // 定义步进电机状态 volatile boolean step_enabled = false; volatile boolean step_direction = false; volatile int step_count = 0; // 定义中断处理函数 void step_isr() { digitalWrite(STEP_PIN, step_enabled ? HIGH : LOW); step_enabled = !step_enabled; if (step_direction) { step_count--; } else { step_count++; } } void setup() { pinMode(STEP_PIN, OUTPUT); pinMode(DIR_PIN, OUTPUT); digitalWrite(DIR_PIN, LOW); attachInterrupt(digitalPinToInterrupt(STEP_PIN), step_isr, RISING); } void loop() { // 设置步进电机转动方向 step_direction = !step_direction; digitalWrite(DIR_PIN, step_direction ? HIGH : LOW); // 计算需要转动的步数 int steps = STEPS_PER_REV / 4; // 根据步数控制步进电机转动 step_count = 0; while (step_count < steps) { delayMicroseconds(STEP_DELAY_MICROSECONDS); } } ``` 此代码中,使用了一个中断处理函数 `step_isr()` 来控制步进电机的转动。在 `setup()` 函数中,使用 `attachInterrupt()` 函数将 `step_isr()` 函数绑定到步进电机STEP 引脚上,以便在每个上升沿触发中断。在 `loop()` 函数中,根据需要转动的步数控制步进电机转动,并通过 `step_count` 变量计算当前已经转动的步数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值