1. 程式人生 > >Arduino(2560)控制兩個步進電機通過控制器

Arduino(2560)控制兩個步進電機通過控制器

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);
}
}

六 延伸

學長提了個問題,怎樣讓步進電機觸控時,能明顯的感受到轉動每一步,也就是說每一步與每一步之間都有時間暫停,然後在迴圈往復的轉動。

解決方法:在學長的提示下,因為脈衝訊號呈時序狀,讓高頻脈衝的時間短,低頻持續的時間長,這樣在轉動的時候就能明顯的感受到每一步的轉動。

#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); //毫秒
}
學長又又提出了一個問題(-_-),假如讓步進電機轉動90度,怎樣在前45度速度逐漸加快,怎樣在後45度速度逐漸減慢?因為時間擠不出,一直沒去想,等有時間看看能不能解決