步进电机 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){ } }
附美照一副: