Arduino中使用库函数方式控制步进电机

发布时间:2023年12月26日

目录

一、编译器中库添加

1、添加库

2、安装AccelStepper

3、新的程序工程中添加头文件使用

二、步进电机单轴控制方式

1、类和库函数介绍

2、使用runToNewPosition函数控制电机绝对位置方式运动

(1)实现功能

(2)代码

(3)运行效果

3、增量式运动、绝对式位置运动

(1)代码

三、步进电机多个电机一起控制方式

1、MultiStepper使用方法

2、代码


接博客继续Arduino中使用步进电机-CSDN博客

步进电机介绍和接线都有介绍。

关于AccelStepper类讲解的其它参考博客

AccelStepper库-CSDN博客

AccelStepper库 – 太极创客

一、编译器中库添加

1、添加库

2、安装AccelStepper

在库管理器中搜索AccelStepper、点击安装,安装完成后重新启动编译器。

3、新的程序工程中添加头文件使用

#include <AccelStepper.h>
#include <MultiStepper.h>

二、步进电机单轴控制方式

1、类和库函数介绍

使用AccelStepper类控制多个步进电机。多个电机控制,就是使用多个AccelStepper实例化对象去控制。

停止

stepper.stop();

/*库函数说明
* setMaxSpeed ----------设置步进电机最大运行速度
* setAcceleration ------设置步进电机加速度
* setSpeed--------------设置步进电机运行速度
* targetPosition--------获取步进电机运行目标位置
* currentPosition ------获取步进电机运行当前位置
* setCurrentPosition----复位步进电机初始位置
* move------------------设置步进电机运动的相对目标位置
* moveTo----------------设置步进电机运动的绝对目标位置
* run-------------------步进电机运行(先加速后减速模式)
* runSpeed--------------步进电机运行(匀速模式)
* runToNewPosition------电机运行到用户指定位置值,目标位置为绝对位置。此函数将“block”程序运行。即电机没有到达目标位置前,Arduino将不会继续执行后续程序内容。这一点很像Arduino官方Stepper库中的step函数。
*/

2、使用runToNewPosition函数控制电机绝对位置方式运动

(1)实现功能

电机先转3圈、再回到零位。如此往复。

(2)代码

#include <AccelStepper.h>
#include <MultiStepper.h>

#define STEPPER1_DIR_PIN    6
#define STEPPER1_STEP_PIN   7
#define STEPPER2_DIR_PIN    8
#define STEPPER2_STEP_PIN   9

#define Ena_PIN             10            //使能位为引脚10。(低电平电机禁止运动,高电平电机有效)

AccelStepper stepper1(AccelStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN);   // 配置电机1 的脉冲引脚 方向引脚
AccelStepper stepper2(AccelStepper::DRIVER, STEPPER2_STEP_PIN, STEPPER2_DIR_PIN);   // 配置电机2 的脉冲引脚 方向引脚

#define CIRCLE_Puls          1600         //电机旋转一圈的脉冲数
long positions[2];                        //2个电机坐标位置


/*库函数说明
* setMaxSpeed ----------设置步进电机最大运行速度
* setAcceleration ------设置步进电机加速度
* setSpeed--------------设置步进电机运行速度
* targetPosition--------获取步进电机运行目标位置
* currentPosition ------获取步进电机运行当前位置
* setCurrentPosition----复位步进电机初始位置
* move------------------设置步进电机运动的相对目标位置
* moveTo----------------设置步进电机运动的绝对目标位置
* run-------------------步进电机运行(先加速后减速模式)
* runSpeed--------------步进电机运行(匀速模式)
* runToNewPosition------电机运行到用户指定位置值,目标位置为绝对位置。此函数将“block”程序运行。即电机没有到达目标位置前,Arduino将不会继续执行后续程序内容。这一点很像Arduino官方Stepper库中的step函数。
*/


void setup() 
{
   //
  Serial.begin(9600);
  //
  pinMode(Ena_PIN, OUTPUT);
  digitalWrite(Ena_PIN, 1);

  //  
  stepper1.setMaxSpeed(CIRCLE_Puls*1.5);      //设置1#电机最大速度
  stepper1.setSpeed(CIRCLE_Puls*1.0);         //设置1#电机速度
  stepper1.setAcceleration(CIRCLE_Puls/4);    //设置1#电机加速度
  stepper2.setMaxSpeed(CIRCLE_Puls*1.5);
  stepper2.setSpeed(CIRCLE_Puls*1.0);
  stepper2.setAcceleration(CIRCLE_Puls/4);
  delay(1000); 
}

void loop() 
{
 /*================1、绝对位置运动1---向前转3圈=============================*/
  //设置电机的目标位置
  positions[0] = CIRCLE_Puls*3;
  positions[1] = CIRCLE_Puls*3;
  stepper1.runToNewPosition(positions[0]);
  //串口反馈1#电机当前的位置
  Serial.print("1# Motor Current Position is: ");
  Serial.println(stepper1.currentPosition());
  delay(2000);

 /*================2、绝对位置运动2---到零位=============================*/
  //设置电机的目标位置
  positions[0] = CIRCLE_Puls*0;
  positions[1] = CIRCLE_Puls*0;
  stepper1.runToNewPosition(positions[0]);
  //串口反馈1#电机当前的位置
  Serial.print("1# Motor Current Position is: ");
  Serial.println(stepper1.currentPosition());
  delay(2000);
}

(3)运行效果

根据设置的加速度,速度以梯形曲线方式进行加减速运动。启动和停止相对来说比较柔和。

绝对位置方式转3圈

绝对位置方式回到零位

3、增量式运动、绝对式位置运动

(1)代码

#include <AccelStepper.h>
#include <MultiStepper.h>

#define STEPPER1_DIR_PIN    6
#define STEPPER1_STEP_PIN   7
#define STEPPER2_DIR_PIN    8
#define STEPPER2_STEP_PIN   9

#define Ena_PIN             10            //使能位为引脚10。(低电平电机禁止运动,高电平电机有效)

AccelStepper stepper1(AccelStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN);   // 配置电机1 的脉冲引脚 方向引脚
AccelStepper stepper2(AccelStepper::DRIVER, STEPPER2_STEP_PIN, STEPPER2_DIR_PIN);   // 配置电机2 的脉冲引脚 方向引脚

#define CIRCLE_Puls          1600         //电机旋转一圈的脉冲数
long positions[2];                        //2个电机坐标位置


/*库函数说明
* setMaxSpeed ----------设置步进电机最大运行速度
* setAcceleration ------设置步进电机加速度
* setSpeed--------------设置步进电机运行速度
* targetPosition--------获取步进电机运行目标位置
* currentPosition ------获取步进电机运行当前位置
* setCurrentPosition----复位步进电机初始位置
* move------------------设置步进电机运动的相对目标位置
* moveTo----------------设置步进电机运动的绝对目标位置
* run-------------------步进电机运行(先加速后减速模式)
* runSpeed--------------步进电机运行(匀速模式)
* runToNewPosition------电机运行到用户指定位置值,目标位置为绝对位置。此函数将“block”程序运行。即电机没有到达目标位置前,Arduino将不会继续执行后续程序内容。这一点很像Arduino官方Stepper库中的step函数。
*/


void setup() 
{
   //
  Serial.begin(9600);
  //
  pinMode(Ena_PIN, OUTPUT);
  digitalWrite(Ena_PIN, 1);

  //  
  stepper1.setMaxSpeed(CIRCLE_Puls*1.5);      //设置1#电机最大速度
  stepper1.setSpeed(CIRCLE_Puls*1.0);         //设置1#电机速度
  stepper1.setAcceleration(CIRCLE_Puls);    //设置1#电机加速度
  stepper2.setMaxSpeed(CIRCLE_Puls*1.5);
  stepper2.setSpeed(CIRCLE_Puls*1.0);
  stepper2.setAcceleration(CIRCLE_Puls/4);
  delay(1000); 

  
}

void loop() 
{
  //1、增量式运动---2秒运行一次
  //stepper1.move(CIRCLE_Puls*4);
  //stepper1.runToPosition();
  //delay(2000);

  //2、绝对位置运动--2秒运行一次
  stepper1.moveTo(CIRCLE_Puls*4);
  stepper1.runToPosition();
  delay(2000);
  stepper1.moveTo(CIRCLE_Puls*0);
  stepper1.runToPosition();
  delay(2000);
}

三、步进电机多个电机一起控制方式

如果是多个电机,不想用AccelStepper实例化对象对多个电机 一个个控制。可以使用MultiStepper类来进行控制。需要添加头文件#include <MultiStepper.h>

1、MultiStepper使用方法

(1)添加引用#include <MultiStepper.h>头文件

(2)定义一个MultiStepper对象,将多个步进电机的AccelStepper 实例化对象添加到MultiStepper实例化对象中。

实例化对象定义

AccelStepper stepper1(AccelStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN);   // 配置电机1 的脉冲引脚 方向引脚
AccelStepper stepper2(AccelStepper::DRIVER, STEPPER2_STEP_PIN, STEPPER2_DIR_PIN);   // 配置电机2 的脉冲引脚 方向引脚
MultiStepper steppers;

添加

  steppers.addStepper(stepper1);
  steppers.addStepper(stepper2);

(3)执行运动。只能以恒速运动的方式,运行到给定的绝对位置。

  //电机运行执行
  steppers.moveTo(positions);
  steppers.runSpeedToPosition();

2、代码

#include <AccelStepper.h>
#include <MultiStepper.h>

#define STEPPER1_DIR_PIN    6
#define STEPPER1_STEP_PIN   7
#define STEPPER2_DIR_PIN    8
#define STEPPER2_STEP_PIN   9

#define Ena_PIN             10        //使能位为引脚10。(低电平电机禁止运动,高电平电机有效)

AccelStepper stepper1(AccelStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN);   // 配置电机1 的脉冲引脚 方向引脚
AccelStepper stepper2(AccelStepper::DRIVER, STEPPER2_STEP_PIN, STEPPER2_DIR_PIN);   // 配置电机2 的脉冲引脚 方向引脚
MultiStepper steppers;

#define CIRCLE_Puls          1600       //电机旋转一圈的脉冲数
long positions[2];                      //2个电机坐标位置

void setup() 
{
   //
  Serial.begin(9600);
  //
  pinMode(Ena_PIN, OUTPUT);
  digitalWrite(Ena_PIN, 1);

  //  
  stepper1.setMaxSpeed(CIRCLE_Puls*1.5);      //设置1#电机最大速度
  stepper1.setSpeed(CIRCLE_Puls*1);         //设置1#电机速度
  stepper1.setAcceleration(CIRCLE_Puls/4);  //设置1#电机加速度
  stepper2.setMaxSpeed(CIRCLE_Puls*1.5);
  stepper2.setSpeed(CIRCLE_Puls*1);
  stepper2.setAcceleration(CIRCLE_Puls/4);

 /*==============1、转动=========================*/
  //设置电机的目标位置
  positions[0] = CIRCLE_Puls*3;
  positions[1] = CIRCLE_Puls*3;
  
  //添加到多轴中
  steppers.addStepper(stepper1);
  steppers.addStepper(stepper2);  
  //电机运行执行
  steppers.moveTo(positions);
  steppers.runSpeedToPosition();  

  //串口反馈1#电机当前的位置
  Serial.print("1# Motor Current Position is: ");
  Serial.println(stepper1.currentPosition());
  delay(2000);

/*==============2、反转=========================*/
  //设置电机的目标位置
  //positions[0] = CIRCLE_Puls*0;
  //positions[1] = CIRCLE_Puls*0;
  positions[0] = 1;
  positions[1] = 1;
  
  //添加到多轴中
  steppers.addStepper(stepper1);
  steppers.addStepper(stepper2);  
  //电机运行执行
  steppers.moveTo(positions);
  steppers.runSpeedToPosition();

  //串口反馈1#电机当前的位置
  Serial.print("1# Motor Current Position is: ");
  Serial.println(stepper1.currentPosition());
  delay(2000);
  
}

void loop() 
{
  // put your main code here, to run repeatedly:

}

文章来源:https://blog.csdn.net/panjinliang066333/article/details/135224781
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。