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
暂无评论