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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM