【步進電機】Arduino+MR2驅動42步進電機(進階)

步進電機 42h2p6017 A4 ican 參數:http://www.ican-tech.com/product/detail/121.html
MR2數字步進驅動器:http://www.ican-tech.com/product/detail/138.html
電源及電機接線、控制信號接口接線、以及參數設定請參考網址以及技術手冊。

例程一:實現轉動

//例程一:實現轉動
#define ENA 5
#define CLK 6 //脈衝
#define DIR 7
void setup() {
  pinMode(ENA,OUTPUT);
  pinMode(CLK,OUTPUT);
  pinMode(DIR,OUTPUT);
  Serial.begin(9600);
}
void loop() {
  digitalWrite(ENA,HIGH);//使能
  digitalWrite(DIR,HIGH);//高順時針,低逆時針
  while(1){
    digitalWrite(CLK,HIGH);//1000Hz的pwm波
    digitalWrite(CLK,LOW);
    delayMicroseconds(500);
  }
}

用法:官方 https://playground.arduino.cc/Main/MsTimer2/ ,所需庫ide搜索安裝即可。
參考:論壇建議 https://www.arduino.cn/thread-8412-1-1.html ,arduino有三個Timer: timer0, timer1, timer2

例程2:使用定時器,實現轉動

// 例程2:使用定時器,實現轉動
#include <MsTimer2.h>
#define ENA 5
#define CLK 6 //脈衝
#define DIR 7
void flash() {
  static boolean output = HIGH;
  
  digitalWrite(CLK, output);
  output = !output;
}

void setup() {
  pinMode(ENA,OUTPUT);
  pinMode(CLK,OUTPUT);
  pinMode(DIR,OUTPUT);
  MsTimer2::set(1, flash); // 1ms period
  MsTimer2::start();
}

void loop() {
  digitalWrite(ENA,HIGH);//使能
  digitalWrite(DIR,HIGH);//高順時針,低逆時針
  while(1){
    
  }
}

如何讓電機轉特定圈數停下,即需要給多少個脈衝,驅動器參數如何設置?

  • 步距角: 輸入一個電脈衝信號,步進電動機轉子相應的角位移。它與控制繞組的相數、轉子齒數和通電方式有關。步距角越小,運轉的平穩性越好。
    查閱官網資料,此電機步矩角:1.8°,故轉1圈需要 脈衝數 = 360° / 1.8° = 200個。

  • 細分倍數: 把電機步距角微分,減小每個脈衝走相對應得角位移,即減小脈衝當量,使得電機運行更平穩,在脈衝頻率不變情況下,速度也就變慢了。比如當細分倍數爲2時,轉1圈需要 脈衝數 = 360° / (1.8°/2) = 400個。 脈衝當量 = 1.8°/2 = 0.9°
    驅動器細分倍數撥盤設置對應關係查閱技術手冊:http://www.ican-tech.com/product/detail/138.html
    在這裏插入圖片描述

例程3: 細分倍數爲2時,驅動電機轉4

// 例程3,細分倍數爲1時,驅動電機轉`3`圈
#include <MsTimer2.h>
#define ENA 5
#define CLK 6 //脈衝
#define DIR 7
unsigned int t_CLK = 0; //記錄脈衝個數
void flash() {
  static boolean output = HIGH;
  
  digitalWrite(CLK, output);
  output = !output;
  t_CLK+=1;
  if(t_CLK==200*2*4*2){ //細分倍數爲1,因爲中斷時長爲半個週期,所以*2
        MsTimer2::stop();
      }
}

void setup() {
  pinMode(ENA,OUTPUT);
  pinMode(CLK,OUTPUT);
  pinMode(DIR,OUTPUT);
  MsTimer2::set(1, flash); // 1ms period
  MsTimer2::start();
}

void loop() {
  digitalWrite(ENA,HIGH);//使能
  digitalWrite(DIR,HIGH);//高順時針,低逆時針
  while(1){
    
    }
  
}

改寫成帶參數子函數:

// 
#include <MsTimer2.h>
#define ENA 5
#define CLK 6 //脈衝
#define DIR 7
unsigned int t_CLK = 0; //記錄脈衝個數
void run_42(unsigned char mul, unsigned int t_cycles)//細分倍數(對應的要在驅動器上設置),圈數
{
  if(mul*t_cycles<160){
    t_CLK+=1;
    if(t_CLK==400*mul*t_cycles){ //細分倍數爲1,因爲中斷時長爲半個週期,所以*2
        MsTimer2::stop();
      }
    else if(t_CLK==65534){
        t_CLK=0;
      }   
    }
}
void flash() {
  static boolean output = HIGH;
  
  digitalWrite(CLK, output);
  output = !output;
  run_42(2,4);  //細分倍數2,圈數4
}

void setup() {
  pinMode(ENA,OUTPUT);
  pinMode(CLK,OUTPUT);
  pinMode(DIR,OUTPUT);
  MsTimer2::set(1, flash); // 1ms period
  MsTimer2::start();
}

void loop() {
  digitalWrite(ENA,HIGH);//使能
  digitalWrite(DIR,HIGH);//高順時針,低逆時針
  while(1){
    
    }
  
}

後話:關於步進電機,其驅動萬變不離其宗。

附美照一副:
在這裏插入圖片描述