步进电机 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){
}
}
例程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,因为中断时长为半个周期,所以*2
MsTimer2::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,圈数4
run_300rpm(); //细分倍数1,转速300
}
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){
}
}
例程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/2
del_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);//细分倍数,转速
}
}
后话:关于步进电机,其驱动万变不离其宗。
附美照一副:
暂无评论内容