arduino控制步进电机S形加速和梯形加速

目录

S形:

梯形: 


S形:

/*                        
 *                        ********   
 *                        *
 *                        ********
 *                               *
 * S型加速                 ********
 * 
 */

#define accel1_time 1000           //第一段加速时间
#define accel2_time 1000           //第二段加速时间
#define accel3_time 1000           //第三段加速时间
#define accel4_time 3000           //第四段匀速时间
#define accel5_time 1000           //第五段减速时间
#define accel6_time 1000           //第六段减速时间
#define accel7_time 1000           //第七段减速时间

class Motor{
  public:
    unsigned long velocity;       //电机转速,主要反应脉冲发射速度(频率)
    int dir=2;            //电机旋转方向控制IO口
    int stp=3;            //电机脉冲信号发射IO口
    int enable=4;        //电机使能,看接线方法,这里是高电平使能
    long accel=1;          //加速度系数
    unsigned long edge;
    Motor();
    void stp_motor()    //发送脉冲
    {
      digitalWrite(stp,HIGH);
      delayMicroseconds(int(1.00/2*float(velocity))*1000000);
      digitalWrite(stp,LOW);
      delayMicroseconds(int(1.00/2*float(velocity))*1000000);
    }
};

Motor::Motor()
{
  for(int i=2;i<=4;i++)
    pinMode(i,OUTPUT);
  digitalWrite(enable,HIGH);
  digitalWrite(dir,HIGH);
}

Motor mymotor;         //定义自己的电机

unsigned long last_time;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);         //设置通信波特率,查看结果
}

void loop() {
  // put your main code here, to run repeatedly:
  
  last_time=millis();
  mymotor.velocity=1;
  //加加速代码,加速1秒
  while((millis()-last_time)<=accel1_time)
  {
     mymotor.velocity=mymotor.accel*(millis()-last_time)*(millis()-last_time);
     if(mymotor.velocity==0)
        mymotor.velocity=1;
     mymotor.stp_motor();
     Serial.println(mymotor.velocity);
  }
  mymotor.edge=mymotor.velocity;
  
  //匀加速代码,加速1秒
  last_time=millis();
  while((millis()-last_time)<=accel2_time)
  {
     mymotor.velocity=mymotor.edge+100*(millis()-last_time);
     
     mymotor.stp_motor();
     Serial.println(mymotor.velocity);
  }
  mymotor.edge=mymotor.velocity;

  //减加速代码,加速1秒
  last_time=millis();
  while((millis()-last_time)<=accel3_time)
  {
     mymotor.velocity=mymotor.edge+(1000000-mymotor.accel*(1000-millis()+last_time)*(1000-millis()+last_time));
     mymotor.stp_motor();
     Serial.println(mymotor.velocity);
  }
  mymotor.edge=mymotor.velocity;

  //减速代码,1秒
  last_time=millis();
  while((millis()-last_time)<=accel4_time)
  {
     mymotor.velocity=mymotor.edge;
     mymotor.stp_motor();
     Serial.println(mymotor.velocity);
  }
  mymotor.edge=mymotor.velocity;

  //加减速代码,1秒
  last_time=millis();
  while((millis()-last_time)<=accel5_time)
  {
     mymotor.velocity=mymotor.edge-mymotor.accel*(millis()-last_time)*(millis()-last_time);
     mymotor.stp_motor();
     Serial.println(mymotor.velocity);
  }
  mymotor.edge=mymotor.velocity;

  //匀减速代码,减速1秒
  last_time=millis();
  while((millis()-last_time)<=accel6_time)
  {
     mymotor.velocity=mymotor.edge-100*(millis()-last_time);
     mymotor.stp_motor();
     Serial.println(mymotor.velocity);
  }
  mymotor.edge=mymotor.velocity;

  //匀减速代码,减速1秒
  last_time=millis();
  while((millis()-last_time)<=accel7_time)
  {
     mymotor.velocity=mymotor.accel*(accel7_time-(millis()-last_time))*(accel7_time-(millis()-last_time));
     if(mymotor.velocity<=1)
        mymotor.velocity=1;
     mymotor.stp_motor();
     Serial.println(mymotor.velocity);
  }
  mymotor.edge=mymotor.velocity;

}

梯形: 

/*
 * 
 *                ******
 *               *      *
 *              **********
 * T型加速
 * 
 */

#define accel_time 1000

class Motor{
  public:
    unsigned long velocity;       //电机转速,主要反应脉冲发射速度(频率)
    int dir=2;            //电机旋转方向控制IO口
    int stp=3;            //电机脉冲信号发射IO口
    int enable=4;        //电机使能,看接线方法,这里是高电平使能
    long accel=10;          //加速度系数
    Motor();
    void stp_motor()    //发送脉冲
    {
      
      digitalWrite(stp,HIGH);
      delayMicroseconds(int(1.00/2*float(velocity))*1000000);
      digitalWrite(stp,LOW);
      delayMicroseconds(int(1.00/2*float(velocity))*1000000);
    }
};

Motor::Motor()
{
  for(int i=2;i<=4;i++)
    pinMode(i,OUTPUT);
  digitalWrite(enable,HIGH);
  digitalWrite(dir,HIGH);
}

Motor mymotor;         //定义自己的电机

unsigned long last_time;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);         //设置通信波特率,查看结果
}

void loop() {
  // put your main code here, to run repeatedly:
  
  last_time=millis();
  
  //匀加速代码,加速10秒
  while((millis()-last_time)<=accel_time)
  {
     mymotor.velocity=mymotor.accel*(millis()-last_time);
     if(mymotor.velocity==0)
        mymotor.velocity=1;
     mymotor.stp_motor();
     Serial.println(mymotor.velocity);
  }


  //匀速代码
  last_time=millis();
  while((millis()-last_time)<=10000)
  {
     
     mymotor.velocity=accel_time*mymotor.accel;
     mymotor.stp_motor();
     Serial.println(mymotor.velocity);
  }


  //匀减速代码
  last_time=millis();
  while((millis()-last_time)<=accel_time)
  {
     mymotor.velocity=accel_time*mymotor.accel-mymotor.accel*(millis()-last_time);
     if(mymotor.velocity==0)
        mymotor.velocity=1;
     mymotor.stp_motor();
     Serial.println(mymotor.velocity);
  }
  
}

  • 11
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 下面是一个简单的 Arduino 控制步进电机的代码: ``` #include <Stepper.h> // 定义步进电机的引脚 #define IN1 8 #define IN2 9 #define IN3 10 #define IN4 11 // 步进电机类型 Stepper motor(2048, IN1, IN3, IN2, IN4); void setup() { // 设置步进电机速度 motor.setSpeed(10); } void loop() { // 顺时针旋转一圈 motor.step(2048); delay(1000); // 逆时针旋转一圈 motor.step(-2048); delay(1000); } ``` 在这个例子中,我们使用了 `Stepper` 库来控制步进电机。首先,我们定义了步进电机的引脚,然后创建了一个 `Stepper` 对象,并将步进电机的步数和引脚传递给构造函数。在 `setup` 函数中,我们设置步进电机的速度。在 `loop` 函数中,我们使用 `motor.step()` 方法来控制步进电机的旋转方向和步数,并使用 `delay()` 方法来控制每次旋转的间隔时间。 ### 回答2: Arduino是一种开源的物联网(IoT)开发平台,它可以用于控制各种电子设备,包括步进电机步进电机是一种特殊的电动机,它可以通过控制电子信号的频率和脉冲数来旋转一个固定角度。 要在Arduino控制步进电机,首先需要连接电机Arduino板。步进电机通常有四个或八个线圈,每个线圈都需要连接到Arduino的数字引脚。可以使用外部电源来为电机提供电源,或者使用Arduino板上的5V引脚。 下面是一个简单的Arduino代码示例,用于控制一个四线四相步进电机: ```c++ #include <Stepper.h> // 定义步进电机连接的引脚 const int stepsPerRevolution = 200; // 步进电机每转需要的步数 Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); // 创建步进电机对象,并指定引脚 void setup() { // 设置步进电机的速度,默认为60 RPM myStepper.setSpeed(60); } void loop() { // 顺时针旋转一圈 myStepper.step(stepsPerRevolution); delay(500); // 延迟0.5秒 // 逆时针旋转一圈 myStepper.step(-stepsPerRevolution); delay(500); // 延迟0.5秒 } ``` 在此示例中,我们导入了`Stepper.h`库来实现步进电机控制。然后,我们定义了步进电机每转需要的步数,并创建了一个`myStepper`对象,并指定连接到Arduino的引脚。在`setup()`函数中,我们设置步进电机的速度为60 RPM。在`loop()`函数中,我们使用`step()`函数来控制电机的旋转方向和步数。我们还使用`delay()`函数在每次旋转之间添加了0.5秒的延迟。 这只是一个基本的示例,你可以根据实际需求对代码进行修改和扩展。希望这个回答对你有帮助! ### 回答3: Arduino控制步进电机代码主要涉及以下几个方面: 1. 引入Stepper库:要在Arduino控制步进电机,首先需要引入Stepper库,这个库可以通过Arduino的库管理器进行安装。 2. 定义电机引脚:在代码中,需要指定步进电机所连接的引脚。通常步进电机会有四个线圈,因此需要四个引脚。可以使用Arduino的数字引脚作为电机引脚。 3. 设置步进电机参数:在代码中,需要指定步进电机的步距角度(如1.8度)以及其所连接的引脚。可以使用Stepper库提供的Stepper对象来实现这个功能。 4. 控制步进电机运动:通过设置步进电机运动的方式,可以控制电机向前、向后或以一定速度旋转等。例如,可以使用stepper.setSpeed(speed)设置步进电机的速度,然后使用stepper.step(steps)方法来控制电机运动。 整体而言,Arduino控制步进电机主要通过引入Stepper库、定义电机引脚、设置步进电机参数以及控制电机运动来实现。通过编写相应的代码,可以对步进电机进行精确控制,实现各种需要的运动模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen953

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值