步進電機 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:使用定時器,實現轉動 #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
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){ } }
附美照一副: