【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 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);//细分倍数,转速
   
  }
}

在这里插入图片描述

后话:关于步进电机,其驱动万变不离其宗。

附美照一副:
在这里插入图片描述

© 版权声明
THE END
喜欢就支持一下吧
点赞481赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容