TB6600驱动器与Arduino的连接引脚

// 定义TB6600驱动器与Arduino的连接引脚
const int PUL_PIN = 8; // 脉冲信号引脚(可换为其他数字IO)
const int DIR_PIN = 9; // 方向控制引脚
const int ENA_PIN = 10; // 使能引脚(高电平禁用,低电平使能)又是怎么连接引脚呢?

按代码定义的引脚,对应连接方式如下,核心是驱动器“-”接Arduino数字引脚,“+”接Arduino 5V,且必须共地:

  • TB6600的 PUL- → Arduino的 D8(代码里的PUL_PIN=8)
  • TB6600的 DIR- → Arduino的 D9(代码里的DIR_PIN=9)
  • TB6600的 ENA- → Arduino的 D10(代码里的ENA_PIN=10)
  • TB6600的 PUL+、DIR+、ENA+ → 全部接Arduino的 5V 引脚
  • TB6600的 GND → 接Arduino的 GND(共地,必须接,否则信号紊乱)

这样接和你代码里的引脚定义完全匹配,上传后就能直接用串口指令控制。需要我画一张简化的接线示意图吗?用文字标注清晰每根线的两端,避免接错。

TB6600驱动器6个SW拨码是ON-ON-OFF-ON-ON-ON。

你代码里定义的 PUL_PIN=8 、 DIR_PIN=9 、 ENA_PIN=10 ,对应 TB6600 驱动器的 信号引脚(PUL、DIR、ENA),采用 “共地单极性”连接(最常用、最稳定的接法),具体对应如下:

Arduino Uno R3 引脚 TB6600 驱动器引脚 功能说明
数字引脚 8(D8) PUL-(脉冲负) 传递脉冲信号,控制电机步数
数字引脚 9(D9) DIR-(方向负) 传递方向信号,控制正/反转
数字引脚 10(D10) ENA-(使能负) 控制驱动器启停(低电平使能)
GND(任意一个) GND(驱动器电源地) 必须共地,避免信号干扰
(无需接 5V) PUL+、DIR+、ENA+ 这三个引脚 直接短接后接 12V 电源的正极(或接 Arduino 的 5V,但 12V 更稳定)

关键提醒:

  1. 代码里 ENA_PIN 是“低电平使能”,所以接线后,代码中 digitalWrite(ENA_PIN, LOW) 才能让驱动器工作;
  2. TB6600 的 PUL+、DIR+、ENA+ 三个引脚必须连在一起,再接到 12V 电源正极(和驱动器的 VCC 正极共接即可),不能悬空;
  3. 驱动器的 VCC (12V 正极)、 GND (12V 负极)接你的 12V 电源,同时驱动器的 GND 必须再拉一根线接 Arduino 的 GND (共地是核心,否则电机可能乱转或不转)。

单轴42步进电机(TB6600驱动器)Arduino控制代码

以下代码适配Arduino Uno R3,包含正反转、调速、指定角度转动核心功能,关键参数可直接修改,复制到Arduino IDE即可使用。

// 定义TB6600驱动器与Arduino的连接引脚
const int PUL_PIN = 8;  // 脉冲信号引脚(可换为其他数字IO)
const int DIR_PIN = 9;  // 方向控制引脚
const int ENA_PIN = 10; // 使能引脚(高电平禁用,低电平使能)

// 电机参数(根据你的42步进电机型号调整)
const int STEPS_PER_REV = 200; // 电机固有步距角对应的每圈步数(42步进电机多为200步/圈)
const int MICROSTEP = 16;      // TB6600设置的细分(如16细分,需与驱动器拨码一致)
const float ANGLE_PER_STEP = 360.0 / (STEPS_PER_REV * MICROSTEP); // 每一步对应的角度

void setup() {
  // 设置引脚模式
  pinMode(PUL_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(ENA_PIN, OUTPUT);
  
  digitalWrite(ENA_PIN, LOW); // 使能驱动器(低电平有效)
  Serial.begin(9600); // 初始化串口,用于调试查看参数
  Serial.println("单轴步进电机控制已启动,可通过串口发送指令:");
  Serial.println("1:正转一圈  2:反转一圈  3:转动90度  4:加速转动");
}

void loop() {
  // 通过串口接收指令,测试不同功能
  if (Serial.available() > 0) {
    char cmd = Serial.read();
    switch(cmd) {
      case '1':
        rotateMotor(1, 500); // 1=正转,500=脉冲间隔(值越小转速越快)
        break;
      case '2':
        rotateMotor(0, 500); // 0=反转
        break;
      case '3':
        rotateByAngle(90, 500); // 转动指定角度(90度)
        break;
      case '4':
        speedUpTest(); // 加速测试(从慢到快)
        break;
    }
  }
}

// 函数1:控制电机转动一圈
// dir:1=正转,0=反转;delayUs:脉冲间隔(单位:微秒)
void rotateMotor(int dir, int delayUs) {
  digitalWrite(DIR_PIN, dir); // 设置转动方向
  int totalSteps = STEPS_PER_REV * MICROSTEP; // 一圈所需总步数(含细分)
  
  for (int i = 0; i < totalSteps; i++) {
    digitalWrite(PUL_PIN, HIGH);
    delayMicroseconds(delayUs);
    digitalWrite(PUL_PIN, LOW);
    delayMicroseconds(delayUs);
  }
  Serial.println("一圈转动完成");
}

// 函数2:控制电机转动指定角度
// targetAngle:目标角度;delayUs:脉冲间隔
void rotateByAngle(float targetAngle, int delayUs) {
  int neededSteps = targetAngle / ANGLE_PER_STEP; // 计算所需步数
  digitalWrite(DIR_PIN, 1); // 固定正转,需反转可改为0
  
  for (int i = 0; i < neededSteps; i++) {
    digitalWrite(PUL_PIN, HIGH);
    delayMicroseconds(delayUs);
    digitalWrite(PUL_PIN, LOW);
    delayMicroseconds(delayUs);
  }
  Serial.print(targetAngle);
  Serial.println("度转动完成");
}

// 函数3:加速测试(脉冲间隔从1000us减到100us,转速逐渐变快)
void speedUpTest() {
  digitalWrite(DIR_PIN, 1);
  for (int delayUs = 1000; delayUs >= 100; delayUs -= 50) {
    for (int i = 0; i < 100; i++) { // 每个速度转动100步
      digitalWrite(PUL_PIN, HIGH);
      delayMicroseconds(delayUs);
      digitalWrite(PUL_PIN, LOW);
      delayMicroseconds(delayUs);
    }
    Serial.print("当前脉冲间隔:");
    Serial.print(delayUs);
    Serial.println("us");
  }
  Serial.println("加速测试完成");
}

代码使用说明

  1. 参数匹配:若TB6600细分不是16(如8细分),需修改MICROSTEP的值,确保与驱动器拨码一致;
  2. 测试方法:上传代码后,打开Arduino IDE的“串口监视器”(波特率9600),发送数字1-4即可触发对应功能;
  3. 安全提示:若电机卡顿或发热,可增大delayUs(降低转速),或重新调节TB6600的电流电位器(不超过电机额定电流)。
// 定义TB6600驱动器与Arduino的连接引脚
const int PUL_PIN = 8;  // 脉冲信号引脚(可换为其他数字IO)
const int DIR_PIN = 9;  // 方向控制引脚
const int ENA_PIN = 10; // 使能引脚(高电平禁用,低电平使能)

// 电机参数(根据你的42步进电机型号调整)
const int STEPS_PER_REV = 200; // 电机固有步距角对应的每圈步数(42步进电机多为200步/圈)
const int MICROSTEP = 16;      // TB6600设置的细分(如16细分,需与驱动器拨码一致)
const float ANGLE_PER_STEP = 360.0 / (STEPS_PER_REV * MICROSTEP); // 每一步对应的角度

void setup() {
  // 设置引脚模式
  pinMode(PUL_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(ENA_PIN, OUTPUT);
  
  digitalWrite(ENA_PIN, LOW); // 使能驱动器(低电平有效)
  Serial.begin(9600); // 初始化串口,用于调试查看参数
  Serial.println("单轴步进电机控制已启动,可通过串口发送指令:");
  Serial.println("1:正转一圈  2:反转一圈  3:转动90度  4:加速转动  5:慢速转动");
}

void loop() {
  // 通过串口接收指令,测试不同功能
  if (Serial.available() > 0) {
    char cmd = Serial.read();
    switch(cmd) {
      case '1':
        rotateMotor(1, 500); // 1=正转,500=脉冲间隔(值越小转速越快)
        break;
      case '2':
        rotateMotor(0, 500); // 0=反转
        break;
      case '3':
        rotateByAngle(90, 500); // 转动指定角度(90度)
        break;
      case '4':
        speedUpTest(); // 加速测试(从慢到快)
        break;
      case '5':
                // 上电后自动慢速转1圈(正转,脉冲间隔2000微秒)
        rotateMotor(1, 2000);  // 正转1圈
        delay(1000);  // 转完后停顿1秒,避免重复转动
        break;





    }
  }
}

// 函数1:控制电机转动一圈
// dir:1=正转,0=反转;delayUs:脉冲间隔(单位:微秒)
void rotateMotor(int dir, int delayUs) {
  digitalWrite(DIR_PIN, dir); // 设置转动方向
  int totalSteps = STEPS_PER_REV * MICROSTEP; // 一圈所需总步数(含细分)
  
  for (int i = 0; i < totalSteps; i++) {
    digitalWrite(PUL_PIN, HIGH);
    delayMicroseconds(delayUs);
    digitalWrite(PUL_PIN, LOW);
    delayMicroseconds(delayUs);
  }
  Serial.println("一圈转动完成");
}

// 函数2:控制电机转动指定角度
// targetAngle:目标角度;delayUs:脉冲间隔
void rotateByAngle(float targetAngle, int delayUs) {
  int neededSteps = targetAngle / ANGLE_PER_STEP; // 计算所需步数
  digitalWrite(DIR_PIN, 1); // 固定正转,需反转可改为0
  
  for (int i = 0; i < neededSteps; i++) {
    digitalWrite(PUL_PIN, HIGH);
    delayMicroseconds(delayUs);
    digitalWrite(PUL_PIN, LOW);
    delayMicroseconds(delayUs);
  }
  Serial.print(targetAngle);
  Serial.println("度转动完成");
}

// 函数3:加速测试(脉冲间隔从1000us减到100us,转速逐渐变快)
void speedUpTest() {
  digitalWrite(DIR_PIN, 1);
  for (int delayUs = 1000; delayUs >= 100; delayUs -= 50) {
    for (int i = 0; i < 100; i++) { // 每个速度转动100步
      digitalWrite(PUL_PIN, HIGH);
      delayMicroseconds(delayUs);
      digitalWrite(PUL_PIN, LOW);
      delayMicroseconds(delayUs);
    }
    Serial.print("当前脉冲间隔:");
    Serial.print(delayUs);
    Serial.println("us");
  }
  Serial.println("加速测试完成");
}
// 定义TB6600驱动器与Arduino的连接引脚
const int PUL_PIN = 8;  // 脉冲信号引脚(可换为其他数字IO)
const int DIR_PIN = 9;  // 方向控制引脚
const int ENA_PIN = 10; // 使能引脚(高电平禁用,低电平使能)

// 电机参数(根据你的42步进电机型号调整)
const int STEPS_PER_REV = 200; // 电机固有步距角对应的每圈步数(42步进电机多为200步/圈)
const int MICROSTEP = 16;      // TB6600设置的细分(如16细分,需与驱动器拨码一致)
const float ANGLE_PER_STEP = 360.0 / (STEPS_PER_REV * MICROSTEP); // 每一步对应的角度

void setup() {
  // 设置引脚模式
  pinMode(PUL_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(ENA_PIN, OUTPUT);
  
  digitalWrite(ENA_PIN, LOW); // 使能驱动器(低电平有效)
  Serial.begin(9600); // 初始化串口,用于调试查看参数
  Serial.println("单轴步进电机控制已启动,可通过串口发送指令:");
  Serial.println("1:正转一圈  2:反转一圈  3:转动90度  4:加速转动  5:慢速转动");
}

void loop() {
  // 通过串口接收指令,测试不同功能
  if (Serial.available() > 0) {
    char cmd = Serial.read();
    switch(cmd) {
      case '1':
        rotateMotor(1, 500); // 1=正转,500=脉冲间隔(值越小转速越快)
        break;
      case '2':
        rotateMotor(0, 500); // 0=反转
        break;
      case '3':
        rotateByAngle(90, 500); // 转动指定角度(90度)
        break;
      case '4':
        speedUpTest(); // 加速测试(从慢到快)
        break;
      case '5':
                // 上电后自动慢速转1圈(正转,脉冲间隔3000微秒)
        rotateMotor(0, 2500);  // 反转1圈
        rotateMotor(1, 2500); // 1=正转,500=脉冲间隔(值越小转速越快)
        delay(1000);  // 转完后停顿1秒,避免重复转动
        break;





    }
  }
}

// 函数1:控制电机转动一圈
// dir:1=正转,0=反转;delayUs:脉冲间隔(单位:微秒)
void rotateMotor(int dir, int delayUs) {
  digitalWrite(DIR_PIN, dir); // 设置转动方向
  int totalSteps = STEPS_PER_REV * MICROSTEP; // 一圈所需总步数(含细分)
  
  for (int i = 0; i < totalSteps; i++) {
    digitalWrite(PUL_PIN, HIGH);
    delayMicroseconds(delayUs);
    digitalWrite(PUL_PIN, LOW);
    delayMicroseconds(delayUs);
  }
  Serial.println("一圈转动完成");
}

// 函数2:控制电机转动指定角度
// targetAngle:目标角度;delayUs:脉冲间隔
void rotateByAngle(float targetAngle, int delayUs) {
  int neededSteps = targetAngle / ANGLE_PER_STEP; // 计算所需步数
  digitalWrite(DIR_PIN, 1); // 固定正转,需反转可改为0
  
  for (int i = 0; i < neededSteps; i++) {
    digitalWrite(PUL_PIN, HIGH);
    delayMicroseconds(delayUs);
    digitalWrite(PUL_PIN, LOW);
    delayMicroseconds(delayUs);
  }
  Serial.print(targetAngle);
  Serial.println("度转动完成");
}

// 函数3:加速测试(脉冲间隔从1000us减到100us,转速逐渐变快)
void speedUpTest() {
  digitalWrite(DIR_PIN, 1);
  for (int delayUs = 1000; delayUs >= 100; delayUs -= 50) {
    for (int i = 0; i < 100; i++) { // 每个速度转动100步
      digitalWrite(PUL_PIN, HIGH);
      delayMicroseconds(delayUs);
      digitalWrite(PUL_PIN, LOW);
      delayMicroseconds(delayUs);
    }
    Serial.print("当前脉冲间隔:");
    Serial.print(delayUs);
    Serial.println("us");
  }
  Serial.println("加速测试完成");
}
// 定义TB6600驱动器与Arduino的连接引脚
const int PUL_PIN = 8;  // 脉冲信号引脚(可换为其他数字IO)
const int DIR_PIN = 9;  // 方向控制引脚
const int ENA_PIN = 10; // 使能引脚(高电平禁用,低电平使能)

// 电机参数(根据你的42步进电机型号调整)
const int STEPS_PER_REV = 200; // 电机固有步距角对应的每圈步数(42步进电机多为200步/圈)
const int MICROSTEP = 16;      // TB6600设置的细分(如16细分,需与驱动器拨码一致)
const float ANGLE_PER_STEP = 360.0 / (STEPS_PER_REV * MICROSTEP); // 每一步对应的角度

void setup() {
  // 设置引脚模式
  pinMode(PUL_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(ENA_PIN, OUTPUT);
  
  digitalWrite(ENA_PIN, LOW); // 使能驱动器(低电平有效)
  Serial.begin(9600); // 初始化串口,用于调试查看参数
  Serial.println("单轴步进电机控制已启动,可通过串口发送指令:");
  Serial.println("1:正转一圈  2:反转一圈  3:转动90度  4:加速转动  5:慢速转动");
}

void loop() {
  // 通过串口接收指令,测试不同功能
  if (Serial.available() > 0) {
    char cmd = Serial.read();
    switch(cmd) {
      case '1':
        rotateMotor(1, 500); // 1=正转,500=脉冲间隔(值越小转速越快)
        break;
      case '2':
        rotateMotor(0, 500); // 0=反转
        break;
      case '3':
        rotateByAngle(90, 500); // 转动指定角度(90度)
        break;
      case '4':
        speedUpTest(); // 加速测试(从慢到快)
        break;
      case '5':
                // 上电后自动慢速转1圈(正转,脉冲间隔3000微秒)
        rotateMotor(0, 2500);  // 第1圈
        rotateMotor(1, 2500); // 1=正转,500=脉冲间隔(值越小转速越快)
        delay(1000);  // 转完后停顿1秒,避免重复转动
        rotateMotor(1, 500);  // 1=正转,500=脉冲间隔(值越小转速越快)
        rotateMotor(0, 500); // 1=反转,500=脉冲间隔(值越小转速越快)


        break;





    }
  }
}

// 函数1:控制电机转动一圈
// dir:1=正转,0=反转;delayUs:脉冲间隔(单位:微秒)
void rotateMotor(int dir, int delayUs) {
  digitalWrite(DIR_PIN, dir); // 设置转动方向
  int totalSteps = STEPS_PER_REV * MICROSTEP; // 一圈所需总步数(含细分)
  
  for (int i = 0; i < totalSteps; i++) {
    digitalWrite(PUL_PIN, HIGH);
    delayMicroseconds(delayUs);
    digitalWrite(PUL_PIN, LOW);
    delayMicroseconds(delayUs);
  }
  Serial.println("一圈转动完成");
}

// 函数2:控制电机转动指定角度
// targetAngle:目标角度;delayUs:脉冲间隔
void rotateByAngle(float targetAngle, int delayUs) {
  int neededSteps = targetAngle / ANGLE_PER_STEP; // 计算所需步数
  digitalWrite(DIR_PIN, 1); // 固定正转,需反转可改为0
  
  for (int i = 0; i < neededSteps; i++) {
    digitalWrite(PUL_PIN, HIGH);
    delayMicroseconds(delayUs);
    digitalWrite(PUL_PIN, LOW);
    delayMicroseconds(delayUs);
  }
  Serial.print(targetAngle);
  Serial.println("度转动完成");
}

// 函数3:加速测试(脉冲间隔从1000us减到100us,转速逐渐变快)
void speedUpTest() {
  digitalWrite(DIR_PIN, 1);
  for (int delayUs = 1000; delayUs >= 100; delayUs -= 50) {
    for (int i = 0; i < 100; i++) { // 每个速度转动100步
      digitalWrite(PUL_PIN, HIGH);
      delayMicroseconds(delayUs);
      digitalWrite(PUL_PIN, LOW);
      delayMicroseconds(delayUs);
    }
    Serial.print("当前脉冲间隔:");
    Serial.print(delayUs);
    Serial.println("us");
  }
  Serial.println("加速测试完成");
}
// 定义TB6600驱动器与Arduino的连接引脚
const int PUL_PIN = 8;  // 脉冲信号引脚(可换为其他数字IO)
const int DIR_PIN = 9;  // 方向控制引脚
const int ENA_PIN = 10; // 使能引脚(高电平禁用,低电平使能)

// 电机参数(根据你的42步进电机型号调整)
const int STEPS_PER_REV = 200; // 电机固有步距角对应的每圈步数(42步进电机多为200步/圈)
const int MICROSTEP = 16;      // TB6600设置的细分(如16细分,需与驱动器拨码一致)
const float ANGLE_PER_STEP = 360.0 / (STEPS_PER_REV * MICROSTEP); // 每一步对应的角度

void setup() {
  // 设置引脚模式
  pinMode(PUL_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(ENA_PIN, OUTPUT);
  
  digitalWrite(ENA_PIN, LOW); // 使能驱动器(低电平有效)
  Serial.begin(9600); // 初始化串口,用于调试查看参数
  Serial.println("单轴步进电机控制已启动,可通过串口发送指令:");
  Serial.println("1:正转一圈  2:反转一圈  3:转动90度  4:加速转动  5:慢速转动");
}

void loop() {
  // 通过串口接收指令,测试不同功能
  if (Serial.available() > 0) {
    char cmd = Serial.read();
    switch(cmd) {
      case '1':
        rotateMotor(1, 500); // 1=正转,500=脉冲间隔(值越小转速越快)
        break;
      case '2':
        rotateMotor(0, 500); // 0=反转
        break;
      case '3':
        rotateByAngle(90, 500); // 转动指定角度(90度)
        break;
      case '4':
        speedUpTest(); // 加速测试(从慢到快)
        break;
      case '5':
                // 上电后自动慢速转1圈(正转,脉冲间隔3000微秒)
        rotateMotor(0, 2500);  // 第1圈
        rotateMotor(1, 2500); // 1=正转,2500=脉冲间隔(值越小转速越快)
        delay(1000);  // 转完后停顿1秒,避免重复转动
        rotateMotor(1, 200);  // 第1圈
        rotateMotor(0, 200); // 1=反转,200=脉冲间隔(值越小转速越快)


        break;





    }
  }
}

// 函数1:控制电机转动一圈
// dir:1=正转,0=反转;delayUs:脉冲间隔(单位:微秒)
void rotateMotor(int dir, int delayUs) {
  digitalWrite(DIR_PIN, dir); // 设置转动方向
  int totalSteps = STEPS_PER_REV * MICROSTEP; // 一圈所需总步数(含细分)
  
  for (int i = 0; i < totalSteps; i++) {
    digitalWrite(PUL_PIN, HIGH);
    delayMicroseconds(delayUs);
    digitalWrite(PUL_PIN, LOW);
    delayMicroseconds(delayUs);
  }
  Serial.println("一圈转动完成");
}

// 函数2:控制电机转动指定角度
// targetAngle:目标角度;delayUs:脉冲间隔
void rotateByAngle(float targetAngle, int delayUs) {
  int neededSteps = targetAngle / ANGLE_PER_STEP; // 计算所需步数
  digitalWrite(DIR_PIN, 1); // 固定正转,需反转可改为0
  
  for (int i = 0; i < neededSteps; i++) {
    digitalWrite(PUL_PIN, HIGH);
    delayMicroseconds(delayUs);
    digitalWrite(PUL_PIN, LOW);
    delayMicroseconds(delayUs);
  }
  Serial.print(targetAngle);
  Serial.println("度转动完成");
}

// 函数3:加速测试(脉冲间隔从1000us减到100us,转速逐渐变快)
void speedUpTest() {
  digitalWrite(DIR_PIN, 1);
  for (int delayUs = 1000; delayUs >= 100; delayUs -= 50) {
    for (int i = 0; i < 100; i++) { // 每个速度转动100步
      digitalWrite(PUL_PIN, HIGH);
      delayMicroseconds(delayUs);
      digitalWrite(PUL_PIN, LOW);
      delayMicroseconds(delayUs);
    }
    Serial.print("当前脉冲间隔:");
    Serial.print(delayUs);
    Serial.println("us");
  }
  Serial.println("加速测试完成");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Esoft Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值