Arduino:控制步进电机/旋转台

  • Post author:
  • Post category:其他


这两天入门arduino,用来控制旋转台。arduino集成度高,可以快速出效果,这一点确实真切感受到了。做的过程中编程不难,麻烦的是找资料,官网的电机转台只给了一张表,刚接触有点看不懂。

上图是使用到的DB9,那个厂家的就找他们的说明吧,图一的颜色分配和图二的不一致。是有一套颜色标准的,但是百度上的图和这厂家的图颜色分配有出入……

只需要用到四个引脚,对应端口接四个到步进电机驱动器即可。总体连接如下图,ENA端口可不接,DIR-与PUL-最好共地,试了下不共地问题不大。这里使用到的电压源给到24V左右。

转动比是指电机转动90圈,台面转动1圈,也就是说电机转一圈,台面转4°。步距角是指一个脉冲电机转动1.8°,电机需要200个脉冲才能转一圈,总共90*200=18000个脉冲转台才转一圈,在算上步进电机驱动器的细分精度(该实验选择的细分进度为4),那么电机需要800个脉冲才能转一圈,总共90*800=72000个脉冲转台才转一圈,下图是步进电机驱动器的设置对照表。

上位机指令:

格式:rotxxxx

bit

num

说明

1~3

rot

指令起始位rotate

4

0

自行设置

1

使用默认顺时针旋转5°,后续bit位无效

5

0

设置逆时针旋转

1

设置顺时针旋转

6~7

theta

一次旋转角度

代码:

/
//            	       参数定义                      
/
#define Moto1_drivel 3			
#define Moto1_drive2 4
#define Moto1Dir1_negative 5
#define Moto1Dir1_positive 6

int theta;

///
//              		起始定义                         //
///
void setup()
{
	pinMode(Moto1_drivel,OUTPUT);		//设置引脚为输出引脚
	pinMode(Moto1_drive2,OUTPUT);
	pinMode(Moto1Dir1_negative,OUTPUT);
	pinMode(Moto1Dir1_positive,OUTPUT);//定义波特率9600
	Serial.begin(9600);  
}


///
//              		主循环                               //
///
void loop()		//主循环
{ 
if(Serial.available()){
  command ();
  rotate(theta);
}
else
 delay(1000);
}


// 800脉冲电机转一圈
// 电机转一圈转台转4°
// 200个脉冲转台转动1°,rotate_unit为转一度;太快了电机扛不住

void rotate_unit() 
{
int i;
 for(i=0;i<200;i++) { 
 digitalWrite(Moto1_drivel,HIGH);
 delayMicroseconds(500);
 digitalWrite(Moto1_drivel,LOW);
 delayMicroseconds(10);
 }
}


//              转多少度                          //

void rotate(int theta)
{
  u32 k;
  char str_temp[50] = {0};
  for (k = 1; k <= theta; k++)
  {
    rotate_unit();
  }
}



//              分析上位机的命令                   //

void command()
{
  char buffer[8] =  {0};  
  for(int j=0;j<8;j++){
	if(Serial.available()){
		buffer[j]=Serial.read();
	}
  }
  if(buffer[0]==114&&buffer[1]==111&&buffer[2]==116){
	if(buffer[3]==49) {//第一位为1则设置默认选项,顺时针转5° 
		digitalWrite(Moto1Dir1_negative,HIGH);
		theta=5;
		Serial.print("direction:");
		Serial.println("顺时针");
		Serial.println("theta=5");    
	}
	
	if(buffer[3]==48){
		if(buffer[4]==49)   { 
		digitalWrite(Moto1Dir1_negative,HIGH);   
		Serial.print("direction:");
		Serial.println("顺时针");
		}
		if(buffer[4]==48)   {
		digitalWrite(Moto1Dir1_negative,LOW); 
		Serial.print("direction:");
		Serial.println("逆时针");
		} 
		theta  = (buffer[5]-48)*10  + buffer[6]-48;
		Serial.print("theta=");
		Serial.println(theta);
	}  
  }
}

实物图:



版权声明:本文为cxis0原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。