Arduino(2560)控制兩個步進電機通過控制器
阿新 • • 發佈:2019-01-05
Arduino 2560控制兩個步進電機
用arduino和步進電機控制器驅動兩個步進電機,具體的接線過程和怎樣連線都在圖片上。
準備工具:
兩個步進電機(我用的是J42):
Arduino板(我用的是2560):
步進電機控制器:
電源介面卡:
一 儲備知識:
1.步進電機的繞組:
A+:黑
A-:綠
B+:紅
B-:藍
(這個問題就查了好久..)
2.細分:
步進電機每200(360÷1.8)脈衝轉一圈,1.8是步進電機1脈衝走的度數(步進電機背面顯示的。200就是1細分,那麼2細分就是400(400脈衝轉一圈,4細分就是800脈衝轉一圈。所以可以通過調節細分來控制步進電機轉動的速度。
二 步進電機與步進電機控制器相連
按照上面說的黑綠紅藍連線步進電機的A+A-B+B-
三控制器與電源介面卡相連
四控制器和arduino連線
1.輸入訊號有三種
① 步進脈衝訊號PUL+,PUL-;
② 方向電平訊號DIR+ ,DIR-
③ 離線訊號EN+,EN-。
2. 採用共陰極接法:
PUL-,DIR-,EN-連arduino的地
EN+:離線訊號,接地或者不接,介面4
DIR+:控制轉動方向,高電平正轉,介面 5
PUL+:控制脈衝,介面 6
3. 第二個步進電機接法同理:
PUL-,DIR-,EN-連arduino的地
EN+:離線訊號,接地或者不接,介面7
DIR+:控制轉動方向,高電平正轉,介面 8
PUL+:控制脈衝,介面 9
五程式碼:
#define CLK 9 #define CW 8 #define EN 7 #define CLK2 6 #define CW2 5 #define EN2 4 void setup() { pinMode(CLK,OUTPUT); pinMode(CW,OUTPUT); pinMode(EN,OUTPUT); pinMode(CLK2,OUTPUT); pinMode(CW2,OUTPUT); pinMode(EN2,OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(CW,HIGH); //正轉 digitalWrite(CW2,HIGH); //正轉 //digitalWrite(EN, LOW); //離線 for(int i=0;i<200;++i) { digitalWrite(CLK,HIGH);//逆時針(正轉),無細分,半流,200脈衝/轉,步距角1.8度,500KHZ digitalWrite(CLK2,HIGH);// delayMicroseconds(1000); digitalWrite(CLK,LOW); digitalWrite(CLK2,LOW); delayMicroseconds(1000); } }
六 延伸
學長提了個問題,怎樣讓步進電機觸控時,能明顯的感受到轉動每一步,也就是說每一步與每一步之間都有時間暫停,然後在迴圈往復的轉動。
解決方法:在學長的提示下,因為脈衝訊號呈時序狀,讓高頻脈衝的時間短,低頻持續的時間長,這樣在轉動的時候就能明顯的感受到每一步的轉動。
學長又又提出了一個問題(-_-),假如讓步進電機轉動90度,怎樣在前45度速度逐漸加快,怎樣在後45度速度逐漸減慢?因為時間擠不出,一直沒去想,等有時間看看能不能解決#define CLK 9 #define CW 8 #define EN 7 int steps=50; //角度 /* * steps=16.667 旋轉30 * steps=33.334 旋轉60 * steps=50 旋轉90 * steps=100 旋轉180 * steps=200 旋轉360 */ void setup() { pinMode(CLK, OUTPUT); pinMode(CW, OUTPUT); pinMode(EN, OUTPUT); Serial.begin(9600); //通訊介面 } /* * 速度:通過脈衝時間間隔來控制速度/控制細分? * 方向:控制脈衝次數來控制一次能過轉多少度 */ void loop() { digitalWrite(CW, HIGH); //正轉 //digitalWrite(EN, LOW); //離線 for (int i = 0; i < steps; ++i) { digitalWrite(CLK, HIGH); //逆時針(正轉),無細分,半流,200脈衝/轉,步距角1.8度,500KHZ delayMicroseconds(10); //微秒400以上左右好用,所以週期T=800us,所以f=1/T=1250HZ digitalWrite(CLK, LOW); delayMicroseconds(15000); } //delay(500); //毫秒 }