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 为低电平有效
低电
低电平驱动
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秒 }