樹莓派入門(三)之步進電機控制

樹莓派這個東西,一定要親自動手玩一玩,多實踐。所以,我打算錄幾期視頻帶大家動手做一做東西。估計要等到下半年,因爲目前宿舍地方有限。

    上一次我們說到了如何控制超聲波傳感器,這一次我們來介紹一下如何控制步進電機。

    這裏,我以arduino爲例驅動步進電機,同樣我會給出樹莓派的驅動代碼。
28BYJ48步進電機的詳細參數網上百度一下就知道了。


    這裏有三種減速比:分別是1:16,1:64,1:32,我感覺我手中拿着的是1:32的,因爲網上大家都說是4096步轉一圈,而我實驗發現是2048步轉一圈。


一、首先弄明白什麼是:四拍,雙四拍,八拍。
       四拍是說步進電機A,B,C,D四組線圈的通電時序,四拍的驅動正轉通電順序爲A-B-C-D-A-B-C-D-A-……循環往復,-A-B-C-D-四拍爲一個循環週期。雙四拍的通電時序爲AB-BC-CD-DA-AB-BC-CD-DA-...…,-AB-BC-CD-DA-四拍爲一個循環週期。相對應的還有八拍的通電時序,A-AB-B-BC-C-CD-D-DA-A。


具體的arduino代碼如下:

int flag=1;


void setup() {
  // put your setup code here, to run once:
  for(int i=2;i<=5;i++)
    {
      pinMode(i,OUTPUT);
    }
}
void loop() {
  // put your main code here, to run repeatedly:
  if(flag==1)
  {
     for(int i=0;i<512;i++)
    {
      Coil_A1();
      delay(5);
      Coil_B1();
      delay(5);
      Coil_C1();
      delay(5);
      Coil_D1();
      delay(5);
    }
    flag=0;
  }
}

void Coil_A1()
{
 digitalWrite(2,HIGH);
 digitalWrite(3,LOW);
 digitalWrite(4,LOW);
 digitalWrite(5,LOW);
}
void Coil_B1()
{
 digitalWrite(2,LOW);
 digitalWrite(3,HIGH);
 digitalWrite(4,LOW);
 digitalWrite(5,LOW);
}
void Coil_C1()
{
 digitalWrite(2,LOW);
 digitalWrite(3,LOW);
 digitalWrite(4,HIGH);
 digitalWrite(5,LOW);
}
void Coil_D1()
{
 digitalWrite(2,LOW);
 digitalWrite(3,LOW);
 digitalWrite(4,LOW);
 digitalWrite(5,HIGH);
}

下面我來解釋一下:

    電機是64步/圈,每步360° / 64 = 5.625°,出來還有1 / 32減速箱,所以是64 * 32 = 2048步/圈。

每一次for循環都是步進電機內部轉了一圈,也就是4步(注意是內部,看看上一篇拆機就懂啦),外面實際我們看到的只動了5.625°*4=22.5°,然而這個時候,用時是5*4=20ms,所以根據這個我們可以推算出步進電機轉一圈需要10.24秒(這裏的一圈指的是我們所能觀察到的),具體的算法是:每步耗時5ms,一共2048步,也就是耗時10240ms,所以也就是10.24s(秒)。

    不知道大家用的步進電機是不是1:32的,如果你是1:64的那就把上面i<512改爲i<1024,這樣也是轉一圈,具體怎麼算我想你應該會了吧。

 

如果還是不會,那就請多思考和多實驗幾次。

 

樹莓派的代碼如下:

#include <stdio.h>
#include <wiringPi.h>

void init();
void Coil_A1();
void Coil_B1();
void Coil_C1();
void Coil_D1();
void Coil_OFF();

int main()
{
    init();
    for(int i=0;i<512;i++)
    {
        Coil_A1();
        delay(5);
        Coil_B1();
        delay(1500);
        Coil_C1();
        delay(5);
        Coil_D1();
        delay(5);
    }
    return 0;
}



void init()
{
    
    wiringPiSetup();
    for(int i=22;i<=25;i++)
    {
        pinMode(i,OUTPUT);
    }
}

void Coil_A1()
{
    digitalWrite(22,HIGH);
    digitalWrite(23,LOW);
    digitalWrite(24,LOW);
    digitalWrite(25,LOW);
}
void Coil_B1()
{
    digitalWrite(22,LOW);
    digitalWrite(23,HIGH);
    digitalWrite(24,LOW);
    digitalWrite(25,LOW);
}
void Coil_C1()
{
    digitalWrite(22,LOW);
    digitalWrite(23,LOW);
    digitalWrite(24,HIGH);
    digitalWrite(25,LOW);
}
void Coil_D1()
{
    digitalWrite(22,LOW);
    digitalWrite(23,LOW);
    digitalWrite(24,LOW);
    digitalWrite(25,HIGH);
}
void Coil_OFF()
{
    digitalWrite(22,LOW);
    digitalWrite(23,LOW);
    digitalWrite(24,LOW);
    digitalWrite(25,LOW);
}

 

歡迎關注我們的公衆號,本人知識能力有限,如果文章中有錯誤的地方歡迎向我反饋或者留言,十分感謝!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章