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=""; }
