本文主要是介绍【CNC——第1篇】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 periodMsTimer2::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,因为中断时长为半个周期,所以*2MsTimer2::stop();}
}void setup() {pinMode(ENA,OUTPUT);pinMode(CLK,OUTPUT);pinMode(DIR,OUTPUT);MsTimer2::set(1, flash); // 1ms periodMsTimer2::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,因为中断时长为半个周期,所以*2MsTimer2::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 periodMsTimer2::start();
}void loop() {digitalWrite(ENA,HIGH);//使能digitalWrite(DIR,HIGH);//高顺时针,低逆时针while(1){}}
例程4: 细分倍数为1
时,驱动电机的转速为150r/min
,即 2.5r/s
, 转1分钟。
转1
圈 需要200
个脉冲,每秒500个
脉冲,每个脉冲2 ms
。因为此定时器中断最小为1ms,所以使用定时器150也是最高速。
//
#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,因为中断时长为半个周期,所以*2MsTimer2::stop();}else if(t_CLK==65534){t_CLK=0;}} }
void run_300rpm()
{t_CLK+=1;if(t_CLK==1000*60){ //1分钟MsTimer2::stop();}}
void flash() {static boolean output = HIGH;digitalWrite(CLK, output);output = !output;//run_42(1,4); //细分倍数2,圈数4run_300rpm(); //细分倍数1,转速300
}void setup() {pinMode(ENA,OUTPUT);pinMode(CLK,OUTPUT);pinMode(DIR,OUTPUT);MsTimer2::set(1, flash); // 1ms periodMsTimer2::start();
}void loop() {digitalWrite(ENA,HIGH);//使能digitalWrite(DIR,HIGH);//高顺时针,低逆时针while(1){}}
例程5 细分倍数,转速。 采用延时微秒形式。
//例程5 细分倍数,转速,分钟
#define ENA 5
#define CLK 6 //脉冲
#define DIR 7
void setup() {pinMode(ENA,OUTPUT);pinMode(CLK,OUTPUT);pinMode(DIR,OUTPUT);Serial.begin(9600);
}
void run_rpm(unsigned char mul, unsigned int rpm)//细分倍数,转速
{float del_time=0;//60*1000*1000/mul//200/rpm/2del_time=5000/rpm*30/mul;while(1){digitalWrite(CLK,HIGH);//1000Hz的pwm波delayMicroseconds(del_time);digitalWrite(CLK,LOW);delayMicroseconds(del_time);}
}
void loop() {digitalWrite(ENA,HIGH);//使能digitalWrite(DIR,HIGH);//高顺时针,低逆时针while(1){run_rpm(4,60);//细分倍数,转速}
}
后话:关于步进电机,其驱动万变不离其宗。
附美照一副:
这篇关于【CNC——第1篇】Arduino+MR2驱动42步进电机(进阶)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!