阳信做网站网络推广优化方案
一.接线、原理参考
共阴极接法
原理篇
arduino控制步进电机接线
https://blog.csdn.net/RickyWasYoung/article/details/132301936?spm=1001.2014.3001.5501
接线篇
arduino控制步进电机接线+控制[2]
https://blog.csdn.net/RickyWasYoung/article/details/132405984?spm=1001.2014.3001.5501
二.电机参数
2.1参数示意图
图注
1.脉冲pps指每秒的脉冲数
2.线速度越大,力矩特性越小。但是小电流难以支持快速度(电流小难以克服电机内阻)
3.单个脉冲间隔时长=1(秒)/脉冲频率(pps)=1000,000(微秒)/脉冲频率(pps)。
单个脉冲间隔时长/2是HIGH/LOW电位delay时长(即单个脉冲间隔时间=电位供电时间*2)
4.个人测试,1.0A下,电机脉冲间隔时间=100微秒(即HIGH/LOW电位delay时长=50微秒)可行,对应线速度254mm/s
2.2额外参数计算
360/步距角=360/1.8=200
即正常情况(不细分情况)下,转一圈需要200步
因此当TB6600设置细分数为200时,电机步数没有被细分
有效行程/整步步长=25.40/0.0254=1000
即有效行程在不细分的条件下对应1000步,也就是转5圈
三.代码,能用
注意:此电机正转时推杆缩回,逆转时伸出
由于步进电缸/电推杆有限位作用(推杆伸到头之后电机空转,此时电机会产生强烈的振动),导致步进电缸/电推杆不能像普通的旋转式步进电机可以一直转下去。
因此步进电缸/电推杆在没有限位传感器/计数传感器的条件下,想精确定位很困难,需要先转到头(让推杆缩/伸到末端)再进行控制,因此提供以下代码,使电机在初次运行时两个方向各转1001步(前提是无细分,即TB6600细分数为200,细分条件下需要乘以细分倍数,即细分数/200*1000)
3.0. 代码零:测试代码,无循环,使电机伸到最末端(定位到最末端)
然后静止
注意,代码里digitalWrite(STEPPIN, HIGH/LOW);后面的delayMicroseconds()影响了电机旋转的角速度,也影响了推杆伸缩的线速度
即
脉冲总数影响推杆伸缩总距离
脉冲频率影响推杆伸缩速度
删除第三段(//3.正转500步归中归中)即可定位到伸长最末端
#define STEPPIN 9 //脉冲位为9
#define DIRPIN 8 //方向位为8
#define bushu 300 //循环时的脉冲步数void setup() {pinMode(STEPPIN, OUTPUT);pinMode(DIRPIN, OUTPUT);Serial.begin(9600);//不论电机初始位置如何,使电机超量程运动,以达到复位效果
//1.正转1001步Serial.println("Forward Begins");//串口监视器输出引号内容digitalWrite(DIRPIN, HIGH);//方向引脚高电位,正转// 正向转(1001步)for (int x = 0; x < 1001; x ++) {digitalWrite(STEPPIN, HIGH);delayMicroseconds(500);//Microseconds是微秒digitalWrite(STEPPIN, LOW);delayMicroseconds(500);//Microseconds是微秒}Serial.println("Forward Ends");//串口监视器输出引号内容delay(1000); // 暂停1秒//2.逆转1001步 Serial.println("Backward Begins");//串口监视器输出引号内容digitalWrite(DIRPIN, LOW);//方向引脚低电位,逆转// 反向转(bushu脉冲)for (int x = 0; x < 1001; x ++) {digitalWrite(STEPPIN, HIGH);delayMicroseconds(500);//Microseconds是微秒digitalWrite(STEPPIN, LOW);delayMicroseconds(500);//Microseconds是微秒}Serial.println("Backward Ends");//串口监视器输出引号内容delay(1000); //暂停1秒//3.正转500步归中归中归中归中归中归中归中归中归中归中归中归中Serial.println("Forward Begins");//串口监视器输出引号内容digitalWrite(DIRPIN, HIGH);//方向引脚高电位,正转// 正向转(500步)for (int x = 0; x < 500; x ++) {digitalWrite(STEPPIN, HIGH);delayMicroseconds(500);digitalWrite(STEPPIN, LOW);delayMicroseconds(500);}Serial.println("Forward Ends");//串口监视器输出引号内容delay(1000); // 暂停1秒
}//循环
void loop() {}
3.1. 代码一:使电机伸到最末端(定位到最末端)
然后以1000步缩-伸-缩-伸-…循环
#define STEPPIN 9 //脉冲位为9
#define DIRPIN 8 //方向位为8
#define bushu 1000 //循环时的脉冲步数void setup() {pinMode(STEPPIN, OUTPUT);pinMode(DIRPIN, OUTPUT);Serial.begin(9600);//不论电机初始位置如何,使电机超量程运动,以达到复位效果
//1.正转1001步Serial.println("Forward Begins");//串口监视器输出Forward BeginsdigitalWrite(DIRPIN, HIGH);//方向引脚高电位,正转// 正向转(1001步)for (int x = 0; x < 1001; x ++) {digitalWrite(STEPPIN, HIGH);delayMicroseconds(500);//Microseconds是微秒digitalWrite(STEPPIN, LOW);delayMicroseconds(500);//Microseconds是微秒}Serial.println("Forward Ends");//串口监视器输出Forward Endsdelay(1000); // 暂停1秒//2.逆转1001步 Serial.println("Backward Begins");//串口监视器输出Backward BeginsdigitalWrite(DIRPIN, LOW);//方向引脚低电位,逆转// 反向转(bushu脉冲)for (int x = 0; x < 1001; x ++) {digitalWrite(STEPPIN, HIGH);delayMicroseconds(500);digitalWrite(STEPPIN, LOW);delayMicroseconds(500);}Serial.println("Backward Ends");//串口监视器输出Backward Endsdelay(1000); //暂停1秒
}//循环
void loop() {
//1.正转//使电机向特定方向运动Serial.println("Forward Begins");//串口监视器输出引号内容digitalWrite(DIRPIN, HIGH);//方向引脚高电位,正转// 正向转(bushu脉冲)for (int x = 0; x < bushu; x ++) {digitalWrite(STEPPIN, HIGH);delayMicroseconds(500);digitalWrite(STEPPIN, LOW);delayMicroseconds(500);}Serial.println("Forward Ends");//串口监视器输出引号内容delay(1000); // 暂停一秒//2.逆转 //使电机向反方向运动Serial.println("Backward Begins");//串口监视器输出引号内容digitalWrite(DIRPIN, LOW);//方向引脚低电位,逆转// 反向转(bushu脉冲)for (int x = 0; x < bushu; x ++) {digitalWrite(STEPPIN, HIGH);delayMicroseconds(500);digitalWrite(STEPPIN, LOW);delayMicroseconds(500);}Serial.println("Backward Ends");//串口监视器输出引号内容delay(1000); //暂停一秒
}
3.2. 代码二:使电机伸到最末端后缩500步(定位到中间)
然后以300步缩-伸-缩-伸-…循环
#define STEPPIN 9 //脉冲位为9
#define DIRPIN 8 //方向位为8
#define bushu 300 //循环时的脉冲步数void setup() {pinMode(STEPPIN, OUTPUT);pinMode(DIRPIN, OUTPUT);Serial.begin(9600);//不论电机初始位置如何,使电机超量程运动,以达到复位效果
//1.正转1001步Serial.println("Forward Begins");//串口监视器输出引号内容digitalWrite(DIRPIN, HIGH);//方向引脚高电位,正转// 正向转(1001步)for (int x = 0; x < 1001; x ++) {digitalWrite(STEPPIN, HIGH);delayMicroseconds(500);//Microseconds是微秒digitalWrite(STEPPIN, LOW);delayMicroseconds(500);//Microseconds是微秒}Serial.println("Forward Ends");//串口监视器输出引号内容delay(1000); // 暂停1秒//2.逆转1001步 Serial.println("Backward Begins");//串口监视器输出引号内容digitalWrite(DIRPIN, LOW);//方向引脚低电位,逆转// 反向转(bushu脉冲)for (int x = 0; x < 1001; x ++) {digitalWrite(STEPPIN, HIGH);delayMicroseconds(500);//Microseconds是微秒digitalWrite(STEPPIN, LOW);delayMicroseconds(500);//Microseconds是微秒}Serial.println("Backward Ends");//串口监视器输出引号内容delay(1000); //暂停1秒//3.正转500步归中归中归中归中归中归中归中归中归中归中归中归中Serial.println("Forward Begins");//串口监视器输出引号内容digitalWrite(DIRPIN, HIGH);//方向引脚高电位,正转// 正向转(500步)for (int x = 0; x < 500; x ++) {digitalWrite(STEPPIN, HIGH);delayMicroseconds(500);digitalWrite(STEPPIN, LOW);delayMicroseconds(500);}Serial.println("Forward Ends");//串口监视器输出引号内容delay(1000); // 暂停1秒
}//循环
void loop() {
//1.正转//使电机向特定方向运动Serial.println("Forward Begins");//串口监视器输出引号内容digitalWrite(DIRPIN, HIGH);//方向引脚高电位,正转// 正向转(bushu脉冲)for (int x = 0; x < bushu; x ++) {digitalWrite(STEPPIN, HIGH);delayMicroseconds(500);digitalWrite(STEPPIN, LOW);delayMicroseconds(500);}Serial.println("Forward Ends");//串口监视器输出引号内容delay(1000); // 暂停一秒//2.逆转 //使电机向反方向运动Serial.println("Backward Begins");//串口监视器输出引号内容digitalWrite(DIRPIN, LOW);//方向引脚低电位,逆转// 反向转(bushu脉冲)for (int x = 0; x < bushu; x ++) {digitalWrite(STEPPIN, HIGH);delayMicroseconds(500);digitalWrite(STEPPIN, LOW);delayMicroseconds(500);}Serial.println("Backward Ends");//串口监视器输出引号内容delay(1000); //暂停一秒
}
串口监视器显示:
参考:
1.步进电机转速和方向控制
https://blog.csdn.net/hhaowang/article/details/86359014?spm=1001.2014.3001.5506