一、簡介
使用樹莓派控制57步進電機。
二、硬體裝置
- 57兩相四線步進電機 ×1
- DM542驅動器 ×1
- 樹莓派 ×1
- 3.3V-5V電平轉換 ×1
- 24V / 36V電源 ×1
- 三孔帶插頭單頭裸尾電源線 ×1

需要自己買電源線(3源, 火線,零線,地線)
三、接線
檢視大圖
3.1 步進電機 與 驅動器 接線
驅動器 | A+ | A- | B+ | B- |
---|---|---|---|---|
步進電機 | 紅 | 綠 | 黃 | 藍 |
3.2 驅動器 與 樹莓派 接線
由于驅動器接收的脈沖高電平為5V,而樹莓派GPIO端口輸出的高電平為3.3V,是以需要經過“3.3-5V電平轉換子產品”。先介紹一下該子產品:
購買:淘寶搜尋“電平轉換子產品”
右側
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度。
但是驅動器對脈沖進行了細分。(驅動器上,可以手動選擇細分程度)
例如我們将細分設為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圈。
六、說明
通過控制兩次脈沖之間的時間間隔,控制脈沖頻率。
時間間隔越短,頻率越高,點選轉動速度越快。
但是,頻率不能太高,否則将出現丟步或不轉的情況,而且發出異響。
經過我的測試,當細分設定為
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!