// 定义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 更稳定)
关键提醒:
- 代码里 ENA_PIN 是“低电平使能”,所以接线后,代码中 digitalWrite(ENA_PIN, LOW) 才能让驱动器工作;
- TB6600 的 PUL+、DIR+、ENA+ 三个引脚必须连在一起,再接到 12V 电源正极(和驱动器的 VCC 正极共接即可),不能悬空;
- 驱动器的 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("加速测试完成");
}
代码使用说明
- 参数匹配:若TB6600细分不是16(如8细分),需修改
MICROSTEP的值,确保与驱动器拨码一致; - 测试方法:上传代码后,打开Arduino IDE的“串口监视器”(波特率9600),发送数字1-4即可触发对应功能;
- 安全提示:若电机卡顿或发热,可增大
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("加速测试完成");
}
5040

被折叠的 条评论
为什么被折叠?



