目录
2、使用runToNewPosition函数控制电机绝对位置方式运动
步进电机介绍和接线都有介绍。
关于AccelStepper类讲解的其它参考博客
在库管理器中搜索AccelStepper、点击安装,安装完成后重新启动编译器。
#include <AccelStepper.h>
#include <MultiStepper.h>
使用AccelStepper类控制多个步进电机。多个电机控制,就是使用多个AccelStepper实例化对象去控制。
停止
stepper.stop();
/*库函数说明
* setMaxSpeed ----------设置步进电机最大运行速度
* setAcceleration ------设置步进电机加速度
* setSpeed--------------设置步进电机运行速度
* targetPosition--------获取步进电机运行目标位置
* currentPosition ------获取步进电机运行当前位置
* setCurrentPosition----复位步进电机初始位置
* move------------------设置步进电机运动的相对目标位置
* moveTo----------------设置步进电机运动的绝对目标位置
* run-------------------步进电机运行(先加速后减速模式)
* runSpeed--------------步进电机运行(匀速模式)
* runToNewPosition------电机运行到用户指定位置值,目标位置为绝对位置。此函数将“block”程序运行。即电机没有到达目标位置前,Arduino将不会继续执行后续程序内容。这一点很像Arduino官方Stepper库中的step函数。
*/
电机先转3圈、再回到零位。如此往复。
#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圈
绝对位置方式回到零位
#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)添加引用#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();
#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:
}