【Arduino步进电机】【3】步进电机/电缸/电推杆接线+定位+控制

一.接线、原理参考

共阴极接法

原理篇
arduino控制步进电机接线
https://blog.youkuaiyun.com/RickyWasYoung/article/details/132301936?spm=1001.2014.3001.5501

接线篇
arduino控制步进电机接线+控制[2]
https://blog.youkuaiyun.com/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 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");//串口监视器输出Forward Ends
  delay(1000); // 暂停1秒
  
//2.逆转1001步 
  Serial.println("Backward Begins");//串口监视器输出Backward Begins
  digitalWrite(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 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); //暂停一秒
}

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.youkuaiyun.com/hhaowang/article/details/86359014?spm=1001.2014.3001.5506

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值