Ardunio建立电机类控制步进电机转角与转向、转速

步进电机驱动一般通过脉冲数进行对应控制。

输入一个脉冲,则转动一个指定角度。通过驱动细分,一般会有不同的细分结果,以下程序为200/转,表示每转对应200个脉冲。即360°/200=1.8°,一般步进电机默认就是每个输入一个脉冲转1.8°。脉冲输出口为PUL

一、单脉冲驱动电机正反转控制程序

一般的电机除了通过脉冲口PUL控制转角,还需要通过一个DIR控制其转向。即给定DIR低电平,电机顺时针转动,给定DIR高电平,电机逆时针转动

#define PUL 9// 脉冲位
#define DIR 8//方向位

void setup() {
  // 
  pinMode(PUL,OUTPUT);//设置输出口
  pinMode(DIR,OUTPUT);//设置输出口
  Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("Forward Begins");//输入正转开始
  digitalWrite(DIR,HIGH);//设置逆时针转
  for(int x=0;x<200;x++)
  {
    digitalWrite(PUL,HIGH);
    delayMicroseconds(500);
    digitalWrite(PUL,LOW);
    delayMicroseconds(500);
    //一个脉冲转一个步长    总步数为200步/圈    循环一次实现一个脉冲
  }
  Serial.println("Forward ENDs");//输入正转结束
  delay(1000);
  
  //改变转向
   Serial.println("Backward Begins");//输入正转开始
  digitalWrite(DIR,LOW);//设置顺时针转
  for(int x=0;x<600;x++)
  {
    digitalWrite(PUL,HIGH);
    delayMicroseconds(500);
    digitalWrite(PUL,LOW);
    delayMicroseconds(500);
    //一个脉冲转一个步长    总步数为200步/圈    循环一次实现一个脉冲  总计转三圈
  }
  Serial.println("Backward ENDs");//输入反转结束
  delay(2000);
}

二、双脉冲输入电机正反转控制

双脉冲输入指的是PUL输入脉冲时,电机顺时针转动,DIR输入脉冲时,电机逆时针转动。

为了实现电机能够转动指定的角度,并可以调整电机的转速,又定义了一个电动机的类函数,并补充修改了算法,具体如下:

class STEPPER//定义一个电机类函数
{
  public:
    byte DirPin, PulPin, EnaPin;//定义步进电机控制信号输出引脚
    byte APin, BPin;//定义编码器输入引脚对应A相与B相信号输入
    long StepTime = 1000;//steptime表示每步的时间
    long CurrentStep = 0, TargetStep = 0;//当前步数与目标步数

    STEPPER(byte dir, byte pul, byte en, byte a, byte b)//设置引脚信息
    {//定义输出引脚,byte is 数据类型字节,从0-225
      DirPin = dir;
      PulPin = pul;
      EnaPin = en;
      //设置为输出引脚
      pinMode(DirPin, OUTPUT);
      pinMode(PulPin, OUTPUT);
      pinMode(EnaPin, OUTPUT);
      //初始化为低电平
      digitalWrite(DirPin, 0);
      digitalWrite(PulPin, 0);
      digitalWrite(EnaPin, 0);
      //定义编码器输入引脚
      APin = a;
      BPin = b;
      //设置为输入引脚
      pinMode(APin, INPUT);
      pinMode(BPin, INPUT);
    }
    bool IsRunToTarget()//是否走到目标
    {
      return TargetStep == CurrentStep;
    }
    //采用现有频率控制步进电机转动指定角度
    bool RunTo(long target)//只输入目标步长
    {
      TargetStep = target;//赋值目标步数给targetstep
      while(IsRunToTarget() == false)//调用函数判断是否走到了目标步数
      {
          runStep(CurrentStep < target);//走步
      }
      CurrentStep=0;//运行一次后需要将当前步数清零以进行下一次控制
      return IsRunToTarget();
    }
    //采用指定频率控制步进电机转动指定角度
    bool RunTo(long target, long stepTime)//既输入目标步长 又输入周期也是频率 用于调节速度
    {
      TargetStep = target;//修改目标
      StepTime = stepTime;//修改周期
      while(IsRunToTarget() == false)
      {
          runStep(CurrentStep < target);
      }
      CurrentStep=0;//运行一次后需要将当前步数清零以进行下一次控制
      return IsRunToTarget();
    }


  private:
    void runStep(bool dir)//, unsigned long st,bool pulpin,bool dirpin
    {      
      if(dir==0)//如果CurrentStep>target,顺时针赚
     {digitalWrite(PulPin, 1);
      delayMicroseconds(StepTime/2);//高电平保持1/2周期
      digitalWrite(PulPin, 0);
      delayMicroseconds(StepTime/2);//低电平保持1/2周期
      CurrentStep += (dir ? 1 : -1);
     }
     else//逆时针转
     {digitalWrite(DirPin, 1);
      delayMicroseconds(StepTime/2);
      digitalWrite(DirPin, 0);
      delayMicroseconds(StepTime/2);
      CurrentStep += (dir ? 1 : -1);
     }
    }
};

STEPPER  MyStepperA(10, 9, 4,6,5);//步进电机数字引脚对应接口
//采用此方法可以控制多个电机,例如设置MyStepperB

void setup()
{
    
    MyStepperA.RunTo(400,5000);
    //电机设置400步/圈,表明每个脉冲转0.9°,这里要求电机转400步,即刚好转一圈
    //5000是脉冲周期,单位微秒,对应频率为200HZ
    delay(500);
    MyStepperA.RunTo(400,1000);//正转一圈
    delay(500);
    MyStepperA.RunTo(-400,300); //反转一圈
    delay(2000);
}

void loop()//闭循环
{
}




  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值