• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
(经典)arduino控制步进电机

1TB6600驱动器 贵

Arduino控制TB6600驱动器+42步进电机

https://blog.csdn.net/dongyan3595/article/details/122388869

 

 

 

 

 

 实际使用

1 接线

 

 

 

 

 

 

 

2调电流控制

 

 

3调步数精度

 步数

细分

 

 

4 高电平有效

int PUL = 7; //定义脉冲引脚
int DIR = 6; //定义方向销
int ENA = 5; //定义启用引脚
int RESET = 4; //定义复位传感器
  
/**
* TB6600驱动器 . 42两相四线步进电机
*/
void setup() {
  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (ENA, OUTPUT);
  pinMode (RESET,INPUT);
  Serial.begin(9600);
  // 初始化复位 - 转3圈
  for (int i = 0; i < 1600; i++) //前进4800步 SW1=OFF,SW2=ON,SW3=OFF(每圈1600脉冲)
  {
    digitalWrite(DIR, LOW); // 定义正转
    digitalWrite(ENA, HIGH);// 启动
    digitalWrite(PUL, HIGH);// 输出脉冲
    delayMicroseconds(2000);
    digitalWrite(PUL, LOW);
   
    delayMicroseconds(2000);
  }
  delay(5000);
}
  
void loop() {
  for (int i = 0; i < 1600; i++) //正转1圈
  {
    digitalWrite(DIR, LOW);
    digitalWrite(ENA, HIGH);
    digitalWrite(PUL, HIGH);
    delayMicroseconds(50);
    digitalWrite(PUL, LOW);
    delayMicroseconds(50);
  }
  delay(3000); // 暂停10秒
  for (int i = 0; i < 1600; i++) //倒转1圈
  {
    digitalWrite(DIR, HIGH);
    digitalWrite(ENA, HIGH);
    digitalWrite(PUL, HIGH);
    delayMicroseconds(50);
    digitalWrite(PUL, LOW);
    delayMicroseconds(50);
  }
   delay(3000); // 暂停10秒
}

  

 

双路控制

高电平有效

int PUL = 7; //定义脉冲引脚
int DIR = 6; //定义方向销
int ENA = 5; //定义启用引脚

int PUL2 = 8; //定义脉冲引脚
int DIR2 = 9; //定义方向销
int ENA2 = 10; //定义启用引脚



 void RunOne1(int Dtime)
 {
    digitalWrite(DIR, LOW); // 定义正转
    digitalWrite(ENA, HIGH);// 启动
    digitalWrite(PUL, HIGH);// 输出脉冲
    delayMicroseconds(2000);
    digitalWrite(PUL, LOW);
    delayMicroseconds(2000);
  }

// 
 void RunOneStepQian12(int Dtime,bool Fx)
 {
    digitalWrite(DIR, Fx); // 定义正转 low
    digitalWrite(ENA, HIGH);// 启动
    digitalWrite(PUL, HIGH);// 输出脉冲

    digitalWrite(DIR2, Fx); // 定义正转
    digitalWrite(ENA2, HIGH);// 启动
    digitalWrite(PUL2, HIGH);// 输出脉冲

    
    delayMicroseconds(Dtime);
    digitalWrite(PUL, LOW);
    digitalWrite(PUL2, LOW);
    delayMicroseconds(Dtime);
  }  
/**
* TB6600驱动器 . 42两相四线步进电机
*/
void setup() {
  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (ENA, OUTPUT);

  pinMode (PUL2, OUTPUT);
  pinMode (DIR2, OUTPUT);
  pinMode (ENA2, OUTPUT);

  
  Serial.begin(9600);
  // 初始化复位 - 转1圈
  for (int i = 0; i < 1600; i++) //前进4800步 SW1=OFF,SW2=ON,SW3=OFF(每圈1600脉冲)
  {
     RunOneStepQian12(500,0);
  }
  delay(5000);
}
  
void loop() {
  for (int i = 0; i < 1600; i++) //正转1圈
  {
     RunOneStepQian12(500,0);
  }
  delay(3000); // 暂停10秒
  for (int i = 0; i < 1600; i++) //倒转1圈
  {
     RunOneStepQian12(500,1);
  }
   delay(3000); // 暂停10秒
}

  

 

串口控制

4 高电平有效

#include <SoftwareSerial.h>
//实例化软串口
SoftwareSerial mySerial(2,3); // RX, TX



int PUL = 7; //定义脉冲引脚
int DIR = 6; //定义方向销
int ENA = 5; //定义启用引脚
 
int PUL2 = 8; //定义脉冲引脚
int DIR2 = 9; //定义方向销
int ENA2 = 10; //定义启用引脚
 

#define sleng 11 //数组大小
String split_result[sleng];//手动动态调整数组大小,保证数组可以满足容量

 /*字符串分割
输入参数
String zifuchuan,  输入字符串
String fengefu,    分隔符号-可以是多个
String result[]    输出结果
    
*/
void Split(String zifuchuan,String fengefu,String result[])
 {
  int weizhi; //找查的位置
  String temps;//临时字符串
  int i=0;
  do
  {
      weizhi = zifuchuan.indexOf(fengefu);//找到位置
      if(weizhi != -1)//如果位置不为空
      {
          temps=zifuchuan.substring(0,weizhi);//打印取第一个字符
          zifuchuan = zifuchuan.substring(weizhi+fengefu.length(), zifuchuan.length());
          //分隔后只取后面一段内容 以方便后面找查
      }
      else
      {  //上面实在找不到了就把最后的 一个分割值赋值出来以免遗漏
         if(zifuchuan.length() > 0)
          temps=zifuchuan;
      }
    
      result[i++]=temps;
      //Serial.println(result[i-1]);//在这里执行分割出来的字符下面不然又清空了
      temps="";
   }
   while(weizhi >=0);
  }

 
// 运行一步 
 void RunOneStep(int type_,int Dtime,bool Fx)
 {
    digitalWrite(DIR, Fx); // 定义正转 low
    digitalWrite(ENA, HIGH);// 启动
    digitalWrite(PUL, HIGH);// 输出脉冲
 
    digitalWrite(DIR2, Fx); // 定义正转
    digitalWrite(ENA2, HIGH);// 启动
    digitalWrite(PUL2, HIGH);// 输出脉冲
 
     
    delayMicroseconds(Dtime);
    if(type_==1){
       digitalWrite(PUL, LOW);
      }
    else if(type_==2){
       digitalWrite(PUL2, LOW);
      }
     else if(type_==3)
     {
       digitalWrite(PUL, LOW);
       digitalWrite(PUL2, LOW);
     }
     else{}

    delayMicroseconds(Dtime);
  } 

/*

int step_, 步数 1600步一周
int type_, 类型 1 -1号电机  2-2号电机 3- 1和2号电机 
int Dtime, 每一步延迟的时间 毫秒 速度控制
bool Fx    方向 1 前 0 后
*/
 void RunXStep(int step_,int type_,int Dtime,bool Fx){
    for (int i = 0; i < step_; i++) //正转1圈
    {
       RunOneStep(type_,Dtime,Fx);
    }
  }  
/**
* TB6600驱动器 . 42两相四线步进电机
*/
void setup() {
  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (ENA, OUTPUT);
 
  pinMode (PUL2, OUTPUT);
  pinMode (DIR2, OUTPUT);
  pinMode (ENA2, OUTPUT);
 
  mySerial.begin(9600);
  Serial.begin(9600);

}
   
void loop() {


    //接收串口消息 mySerial
  if (Serial.available()){
      String split_input =Serial.readStringUntil(';');
      //Serial.println(split_input);
   
      //分割解析
      Split(split_input,"-",split_result);//分割调用
         
      Serial.println("----------------");
      //打印消息 检查是否为空
      /*
       for(int i=0;i<sleng;i++)
          {
            if(split_result[i]!="")
            {
             Serial.println(String(i)+"-"+split_result[i]);
            }
            else
            {
              split_result[i]="0";
             }
          }
        */ 

        if(split_result[0]=="motor"){
            int StepNum=split_result[1].toInt();
            int MotorId=split_result[2].toInt();
            int WaitStep_time=split_result[3].toInt();
            int zhengfan=split_result[4].toInt();
            RunXStep(StepNum,MotorId,WaitStep_time,zhengfan);
            
            delay(10);
            Serial.println("ok");
            // motor-1600-1-500-1-;
          }  
  }
          
//  RunXStep(1600,1,500,1);// 步数 电机 每一步后的延迟时间 方向
//  delay(3000); // 暂停10秒
//  RunXStep(1600,2,500,0);
//  delay(3000); // 暂停10秒
}

  

2简单控制器

3D打印机 A4988/DRV8825步进电机驱动控制板/扩展板模块

https://item.taobao.com/item.htm?spm=a1z09.2.0.0.23b02e8dInsQGy&id=613911068384&_u=91qf7bf51a8e

1 条线全在ON,这意味着16段(4988)或32段(8825)Jm连接电机

2 外接电源  12-24V

3  Jc E,S,D,G,分别对应于连接

   Enable / Step / Dir / Gnd驱动信号输出
Enable  为低电平有效

 

 

低电

 电机3D打印机配件单轴混合式42步进电机2相4线17HS8401s/17HS8401

https://item.taobao.com/item.htm?abbucket=14&id=556963852690&ns=1&pisk=gDGiE7xy3Ay_VyKLpXN6ednWZhpLB5NbCmCYDSE2LkrC6-rvCm2mDDwq653txoo-mrhtMjDCi4gj6FNv55g_GS-J2QFm5VNjyB0ATfXULruUuNzwpW-O8SAp2Qd--dz_M2--6yaz3P4RgSya3yrUArf47Po4L6zbY1zV_rSe-kZUu1y4gByUrPSNbmzNT9zTy1S47-WeTrZU0SPq0283kkrqLC14qjlITHRfYg-KGscUSRqr7lutWX-4LOggxgIStAea4_Ehgsl372L4M05kHuk7X8enYBCgi2zmXknya6VUEYgYocAG_5HEdfNt93b7ImqTUXwHTM4nt4HzR2vk-2c0j8laKZC8s24q0-DBq_Ug6v2osATfYVo8jYPskaxt-8D3FyyFoOPte4hbUfRGVke7ocEK4Q53T-Sy99WPbzfb8EhFhtwaRyq8yt01_5QaTj8H-T9_Qya92jLhLkyaRyXv-eX5ERzQWv5..&priceTId=2147807c17420585939827059e12fa&skuId=4005479905645&spm=a21n57.1.hoverItem.2&utparam=%7B%22aplus_abtest%22%3A%22e8953ae95fb59f2d228d66b62d746343%22%7D&xxc=taobaoSearch

 

 

低电平驱动

int PUL = 7; //定义脉冲引脚
int DIR = 6; //定义方向销
int ENA = 5; //定义启用引脚  低电平有效


int wait_time=2000;   
/**
* TB6600驱动器 . 42两相四线步进电机
*/
void setup() {
  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (ENA, OUTPUT);

  Serial.begin(9600);
  // 初始化复位 - 转3圈
  for (int i = 0; i < 1600; i++) //前进4800步 SW1=OFF,SW2=ON,SW3=OFF(每圈1600脉冲)
  {
    digitalWrite(DIR, LOW); // 定义正转
    digitalWrite(ENA, 0);// 启动
    digitalWrite(PUL, HIGH);// 输出脉冲
    delayMicroseconds(wait_time);
    digitalWrite(PUL, LOW);
    
    delayMicroseconds(wait_time);
  }
  delay(2000);
  Serial.println("开始");
}
   
void loop() {
  Serial.println("前进");
  for (int i = 0; i < 1600; i++) //正转1圈
  {
    digitalWrite(DIR, LOW);
    digitalWrite(ENA, 0);
    digitalWrite(PUL, HIGH);
    delayMicroseconds(wait_time);
    digitalWrite(PUL, LOW);
    delayMicroseconds(wait_time);
  }
  delay(3000); // 暂停10秒
  Serial.println("后退");
  for (int i = 0; i < 1600; i++) //倒转1圈
  {
    digitalWrite(DIR, HIGH);
    digitalWrite(ENA, 0);
    digitalWrite(PUL, HIGH);
    delayMicroseconds(wait_time);
    digitalWrite(PUL, LOW);
    delayMicroseconds(wait_time);
  }
   delay(3000); // 暂停10秒
}

  

 

posted on 2023-07-17 15:33  MKT-porter  阅读(2949)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3