天天看點

樹莓派控制57步進電機

一、簡介

使用樹莓派控制57步進電機。

二、硬體裝置

  • 57兩相四線步進電機 ×1
  • DM542驅動器 ×1
  • 樹莓派 ×1
  • 3.3V-5V電平轉換 ×1
  • 24V / 36V電源 ×1
  • 三孔帶插頭單頭裸尾電源線 ×1
樹莓派控制57步進電機

需要自己買電源線(3源, 火線,零線,地線)

樹莓派控制57步進電機
樹莓派控制57步進電機
樹莓派控制57步進電機

三、接線

檢視大圖

樹莓派控制57步進電機

3.1 步進電機 與 驅動器 接線

驅動器 A+ A- B+ B-
步進電機

3.2 驅動器 與 樹莓派 接線

由于驅動器接收的脈沖高電平為5V,而樹莓派GPIO端口輸出的高電平為3.3V,是以需要經過“3.3-5V電平轉換子產品”。先介紹一下該子產品:

購買:淘寶搜尋“電平轉換子產品”

樹莓派控制57步進電機
樹莓派控制57步進電機

右側

DIR

端口

方向 DIR 電平
A ==> B 高 (預設)
B ==> A

這裡我們将通信方向設為

B ==> A

,也就是

DIR

端口置低電平。

B區基準電源 接 5V 和 GND。

A區基準電源 接 3.3V 和 GND。

這樣,從B0 ~ B7輸入3.3v電平,将從A0 ~ A7輸出5V電平 !

接線

驅動器 DIR+ PUL+ DIR- PUL-
電平轉換子產品 A端 A0 A1 DIR VCC GND
電平轉換子產品 B端 B0 B1 VCC GND
樹莓派 35(BCM19) 37(BCM26) GND GND 40(BCM21) 5V GND 3.3V GND

四、驅動原理

  • PUL+:脈沖輸入。
  • DIR+:控制電機轉動方向,高電平正(反)轉,低電平反(正)轉。

我們使用的步進電機的步距角為1.8度,360/1.8=200,也就是步進電機接受到200個脈沖,就會轉一圈360度。

但是驅動器對脈沖進行了細分。(驅動器上,可以手動選擇細分程度)

樹莓派控制57步進電機
樹莓派控制57步進電機

例如我們将細分設為1600脈沖/圈,也就是每接受到1600個脈沖才轉動一圈(相比電機200個脈沖轉一圈确實是細分了)。

SW5

SW6

向下撥動(ON),

S7

S8

向上撥動(OFF),即可将細分設定為1600脈沖/圈。

五、程式設計(C/C++語言,wiringPi庫)

現在,一切就緒了,隻需要程式設計,讓樹莓派輸出脈沖給驅動器即可。

我們這裡暫時不使用樹莓派的PWM功能,而是直接進行電平的高速變換。

digitalWrite(pinPUL, HIGH);
delayMicroseconds(200);		// 暫停200微秒
digitalWrite(pinPUL, LOW);
delayMicroseconds(200);		// 暫停200微秒
           

這樣,即可輸出一次脈沖。

注意:别忘了電平轉換子產品的DIR端口!!!輸入低電平!!!

完整的代碼

// stepmotor.cpp
#include <stdio.h>
#include <wiringPi.h>

// BCM編碼
const int pinPUL = 26;  // 驅動器PUL+
const int pinDIR = 19;  // 驅動器DIR+
const int pinTRAN = 21; // 電平轉換子產品DIR (TRAN是Transform縮寫)

// 初始化
int setup() {
    // BCM編碼
    // 如果使用其他編碼方式,上面的pinPUL和pinDIR也需要相應修改
    if (wiringPiSetupGpio() != 0) {
        printf("Wiringpi setup failed\n");
        return 0;
    }

    pinMode(pinPUL, OUTPUT);
    pinMode(pinDIR, OUTPUT);
    pinMode(pinTRAN, OUTPUT);
    
    // 電平轉換子產品DIR端口置低電平,轉換方向為 B==>A
    digitalWrite(pinTRAN, LOW);
    
    return 1;
}

// 順時針轉動(這裡是假設,需要自行驗證)
void CW() {
    digitalWrite(pinDIR, LOW);
}

// 逆時針轉動
void CCW() {
    digitalWrite(pinDIR, HIGH);
}

// 發射一次脈沖
// @param: delayMicroS (微秒)
//    可以控制脈沖頻率,進而控制電機轉速
//    參數值越大,每兩次脈沖之間的延時越長,脈沖頻率越低,轉速越慢
//    參數值越小,轉速越快
// 但是!盡量不要小于60
void pulseOnce(int delayMicroS) {
    digitalWrite(pinPUL, HIGH);
    delayMicroseconds(delayMicroS);
    digitalWrite(pinPUL, LOW);
    delayMicroseconds(delayMicroS);
}

// 發射count次脈沖
void pulse(int count, int delayMicroS) {
    for (int i = 0; i < count; ++i) {
        pulseOnce(delayMicroS);
    }
}


int main() {
    if (!setup()) {
        return 1;
    }

    // 設定為順時針轉動
    CW();

    // 轉5圈
    pulse(1600 * 5, 200);
}
           

編譯:

g++ -o out microstep.cpp -lwiringPi
           

運作

./out
           

即可觀察到步進電機順(逆)時針轉動5圈。

樹莓派控制57步進電機

六、說明

通過控制兩次脈沖之間的時間間隔,控制脈沖頻率。

時間間隔越短,頻率越高,點選轉動速度越快。

但是,頻率不能太高,否則将出現丟步或不轉的情況,而且發出異響。

經過我的測試,當細分設定為

1600脈沖/圈

時,時間間隔不能低于60微秒。而且當時間介于60微秒到100微秒時,應該逐漸縮小時間間隔,不能一下子就将時間間隔設為很低的值,也就是要給步進電機一個加速的過程,逐漸縮短脈沖的時間間隔,逐漸提高轉速。(減速同理)

int main() {
    if (!setup()) {
        return 1;
    }

    // 設定為順時針轉動
    CW();
    
    // 轉動14圈
    //    加速:2圈,脈沖時間間隔從160微秒,逐漸縮短為60微秒
    //    勻速:10圈,脈沖時間間隔為60微秒
    //    減速:2圈,脈沖時間間隔從60微秒,逐漸增加為160微秒
    int delayMicroSecStart = 160;
    int delayMicroSecEnd = 60;
    
    // 加速:2圈
    // 每發射160個脈沖,将脈沖間隔縮短5微秒
    // 總共消耗160*20=3200個脈沖,也就是電機轉動2圈
    int delayMicroSec = delayMicroSecStart;
    for (int i = 0; i < 20; ++i) {
        pulse(160, delayMicroSec);
        delayMicroSec -= 5;
    }

    // 勻速:10圈
    for (int i = 0; i < 1600 * 10; ++i) {
        pulseOnce(delayMicroSecEnd);
    }
    
    // 減速:2圈
    // 每發射160個脈沖,将脈沖間隔增加5微秒
    delayMicroSec = delayMicroSecEnd;
    for (int i = 0; i < 20; ++i) {
        pulse(160, delayMicroSec);
        delayMicroSec += 5;
    }
}
           

END

Author: iC

GitHub: Leopard-C

Email: [email protected]

Thanks for reading!