Arduino UNO步进电机控制

1.开发环境:Arduino IDE

2.步进电机驱动器:雷赛DM860

3.单片机程序


//定义了板上的控制端DIR,8作为方向控制端
const int DIRPIN = 2;

//定义了板上的步数端PUL,9作为步数控制端
const int STEPPIN = 5;

//定义了限位开关引脚
 int key1 = 10;
 int key2 = 11;

 //存储限位开关状态的变量,取值HIGH、LOW
 int k1;
 int k2;
//定义串口接受数据的全局变量
String comdata = "";

//定义输入指令接收变量,存储电机运动状态
int comflag=0;

//定义控制PWM脉冲波宽度的变量,通过控制脉冲宽度可以控制步进电机转速
int stepperSpeed=10;//初始值为1,电机慢速转动

//步进电机是否可以正转、反转
boolean is_control_stepper_right=false;
boolean is_control_stepper_left =false;

 //初始化
void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600); //设置串口比特率为9600
  
  //定义输出引脚
  pinMode(DIRPIN, OUTPUT);
  pinMode(STEPPIN, OUTPUT);
  
  //定义输入引脚
  pinMode(key1, INPUT_PULLUP);
  pinMode(key2, INPUT_PULLUP);
}

//检测限位开关状态
void ChecKeyState()
{
    k1 = digitalRead(key1);//查询限位开关1的状态
    k2 = digitalRead(key2);//查询限位开关2的状态
    
    //如果两个限位开关有一个为低电平则电机停转
    if (k1==LOW)
    {
      //analogWrite(STEPPIN, 0);//速度控制引脚9输出0,电机停止
      Serial.println("K1Pressed");
      is_control_stepper_right = false;//k1为低电平,电机不能正转
      is_control_stepper_left  = true;
      //comflag=0;//开关按下,存储电机运动状态的变量置0,即停止
      digitalWrite(DIRPIN, LOW);//电机方向控制引脚输出低电平,电机反转
      Serial.println("stop forward");
      delay(1000);
    }
    else if(k2==LOW)
    {
     // analogWrite(STEPPIN, 0);//速度控制引脚9输出0
      Serial.println("K2Pressed");
      is_control_stepper_left  = false;//k2为低电平,电机不能反转
      is_control_stepper_right = true;
     // comflag=0;//开关按下,存储电机运动状态的变量置0,即停止
      digitalWrite(DIRPIN, HIGH);//电机方向控制引脚输出高电平,电机正转
      Serial.println("stop backward");
      delay(1000);
    }
    //两个限位开关均为高电平电机使能
    else 
    {
      
      is_control_stepper_right = true;
      is_control_stepper_left  = true;
      Serial.println("can control the stepper.");
      //delay(1000);
    }
}

//读串口发过来的数据
void RdmySerial()
{
  char val;//读串口的变量
  while (Serial.available() > 0)//读串口发过来的数据
  {
    //comdata += char(Serial.read());
    val = char(Serial.read());//读串口
    if ((val != '\r') && (val != '\n'))//把val的值附给comdata
    {
      comdata += val;
    }
    delay(2);
  }

  if (comdata.length() > 0)
  {
    Serial.println(comdata + " rcv ok.");
    Serial.println(comdata);
    delay(2);

    //判断是否为正转指令
    if(comdata == "right") 
    {
      comflag=1;
      Serial.println(comflag);
    }
    //判断是否为反转指令
    else if (comdata == "left") 
    {
      comflag=2;
      Serial.println(comflag);
    }
    //判断是否为停止指令
    else if (comdata == "stop")
    {
      comflag=0;
      Serial.println(comflag);
    }
    //检测输入是否为调速指令
    else
    {
      //开始读取输入的数字
      boolean is_number = true;
      //逐个字符读入检查是否数字
      for (int i = 0; i < comdata.length(); i++)
      {
        int inChar = comdata[i];
        if (!(isDigit(inChar)))
        {
          is_number = false;
          Serial.println(comdata +" 未知指令");
        }
      }

      //检查是否为数字(速度值)
      if (is_number)
      {
        //设置步进电机的速度0-255
        stepperSpeed = comdata.toInt(); //步进电机越大速度越快
        //开始控制电机
        analogWrite(STEPPIN, stepperSpeed);
        Serial.println("stepperSpeed:" + comdata + ".");
      }
    }
    
  }
  comdata="";
}
void loop()
{
     ChecKeyState();
     RdmySerial();
    if((comflag==1)&& (is_control_stepper_right==true))
     {
        //步进电机正转
        Serial.println("Forward Begins");
        digitalWrite(DIRPIN, HIGH);//电机方向控制引脚输出高电平,电机可以正转
        analogWrite(STEPPIN, stepperSpeed);
 
      }
     else if ((comflag==2) && (is_control_stepper_left == true))
      {
         //步进电机反转
         Serial.println("Backward Begins");
         digitalWrite(DIRPIN, LOW);//电机方向控制引脚输出低电平,电机反转
         analogWrite(STEPPIN,stepperSpeed);//控制电机转动
      }
     else if (comflag==0)
      {
         //控制步进电机停止
         analogWrite(STEPPIN, 0);//速度控制引脚9输出0
         Serial.println("stop");
         delay(300);
      }
      else 
      {
        Serial.println(comdata +" 未知指令");
        comdata="";
      }
     comdata="";
}
  

版权声明:本文为CSDN博主「Young_Bobooo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Young_Bobooo/article/details/121559062

生成海报
点赞 0

Young_Bobooo

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

【单片机】Arduino进阶应用

前期教程 【单片机】Arduino(以UNO R3为例)—— 基本函数汇总【单片机】Arduino供电总结【嵌入式模块】舵机使用详解 前言 作为最容易入门的单片机之一,Arduino总是可以用非常简

8522A+7段数码管显示实验

1、8255A简介 8255A是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。 其各口功能可由软件选择,

嵌入式体系结构复习笔记

寄存器表示C语言的对应关系 R0: 存储C语言函数返回值R14 : 存储C的函数返回地址R15 : 当前执行程序的代码地址 ARM的常用指令 将数据加载到寄存器:MOV/LDR子程序调用指令: BL软中断调用指

基于arduino的温度计

使用器件:arduino uno,LM35模块,LCD602模块,10k电位器,面包板,杜邦线 线路连接 LCD1602模块连接 VSS(电源地)GNDVD