Arduino论坛
直播中

杨韬

7年用户 5经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[问答]

求助:arduino uno+4988脱机控制

       作为小白一只,近两天因为项目需要做一个arduino uno通过A4988控制42步进电机正反转一定角度加一个角度微调
      
然后在面包板上接好电路后发现按钮不给信号时电机也在转动,单独每个接口测试都正常,一起接到板上就有问题,想问下是怎么回事。

做出来的如下:
面包板图.png
       其中4个按钮作用分别是令步进电机正转90°,正转30°,反转30°,反转90°,旋转电位器步进电机也会转过一个比较小的角度。

arduino的代码如下:


int EN=6;                                                //EN
int X_DIR=4;                                //DIR
int X_STP=5;                                //STEP
int s1=9;                                                //s1 input
int s2=10;                                        //s2 input
int s3=11;                                        //s3 input
int s4=12;                                        //s4 input
int potpin=1;                                //电位器input
  
  int    val1=0;
  int    val2=0;
  int    val3=0;
  int    val4=0;
  int    col=0;
  int    x,y;
  
//步进电机step控制函数
void step(boolean dir, byte dirPin, byte stepperPin, int steps)
{
digitalWrite(dirPin, dir);
  delay(50);
  for (int i = 0; i < steps; i++)
  {
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(800);  
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(800);  
  }}

  
void setup()  
{  //定义I/O口输入/输出
  pinMode(EN,OUTPUT);
  pinMode(X_STP,OUTPUT);
  pinMode(X_DIR,OUTPUT);
  digitalWrite(EN,LOW);
  pinMode(s1,INPUT);
  pinMode(s2,INPUT);
  pinMode(s3,INPUT);
  pinMode(s4,INPUT);
  Serial.begin(9600);
}  
  

void loop()  
{
//开关s1-4控制步进电机转动,3600细分为一圈
  val1=digitalRead(s1);
  delay(10);
  if  (HIGH==val1)  step(HIGH, X_DIR, X_STP, 800);//电机正转800细分,就是90°
  val2=digitalRead(s2);
  delay(10);
  if  (HIGH==val2)  step(HIGH, X_DIR, X_STP, 800/3);//电机正转800/3细分,就是30°
  val3=digitalRead(s3);
  delay(10);
  if  (HIGH==val3)  step(LOW, X_DIR, X_STP, 800/3);//电机反转800/3细分,就是30°
  val4=digitalRead(s4);
  delay(10);
  if  (HIGH==val4)  step(LOW, X_DIR, X_STP, 800);//电机反转800细分,就是90°

   
//旋转电位器,步进电机转动,采用模拟输入
  y=x;
  x=analogRead(potpin);
  delay(10);
  if  (x>y)
    { int r=(x-y)/5;
      step(HIGH, X_DIR, X_STP, r);
    }
  else
    { int r=(y-x)/5;
      step(LOW, X_DIR, X_STP, r);
    };

//串口控制
  col=Serial.read();
  delay(10);
  switch(col)
  {       
    case 'A':step(HIGH, X_DIR, X_STP, 200);
    delay(1000);
    break;
    case 'B':step(HIGH, X_DIR, X_STP, 400);
    delay(1000);
    break;
    case 'C':step(HIGH, X_DIR, X_STP, 800);
    delay(1000);
    break;
    case 'D':step(HIGH, X_DIR, X_STP, 1600);
    delay(1000);
    break;
    case 'E':step(HIGH, X_DIR, X_STP, 3200);
    delay(1000);
    break;
  }
}  



回帖(4)

SCCHAM

2017-11-3 21:48:06
A4988  模式选择端MS1、MS2、MS3。。。。。。。。如果全部接地 就是 0 0 0模式。一圈是200个步进值,一个值也就是1.8°。;另外是1/4 1/8 1/16。 最多是3200步进值是一圈,你写的貌似是3600。。。。
举报

杨韬

2017-11-16 15:11:31
引用: SCCHAM 发表于 2017-11-3 21:48
A4988  模式选择端MS1、MS2、MS3。。。。。。。。如果全部接地 就是 0 0 0模式。一圈是200个步进值,一个值也就是1.8°。;另外是1/4 1/8 1/16。 最多是3200步进值是一圈,你写的貌似是3600。。。。

手误,手误。。。。。
举报

yujunyummy

2018-3-27 13:56:42
你好 我也实验了你这个代码,请问解决了吗?
举报

h1654155352.2135

2021-2-23 08:15:37
先收藏起来,有时间研究一下
举报

更多回帖

发帖
×
20
完善资料,
赚取积分