【问题标题】:How to for loop a stepper motor with half steps如何用半步循环步进电机
【发布时间】:2021-07-10 14:56:38
【问题描述】:

我有四个数字引脚存储在数组inPins[4] 中,它们为步进电机的不同相位供电。波函数很简单,因为永远不会超过一个相位。我的波函数如下所示:

void waveClockwise()
{
  for (int i = 0; i < 4; i++)
  {
    digitalWrite(inPins[i], HIGH);
    delay(delayTime);
    digitalWrite(inPins[i], LOW);
  }
  
  return;
}

这个 ^ 在循环中被重复调用。然而,在实现 halfStep 函数时,我很难理解如何在 for 循环中完成。

对于halfStep,顺序如下:

  1. in1:开
  2. in2:开
  3. in1:关闭
  4. in3:开
  5. in2:关闭

... 以此类推,因为它围绕阶段走了半步。我用下面的代码完成了它,但我只是好奇我怎么能在一个循环中做到这一点。有什么建议或想法吗?

void halfStepClockwise()
{
  digitalWrite(inPins[0], HIGH);
  delay(delayTime);
  digitalWrite(inPins[1], HIGH);
  delay(delayTime);
  digitalWrite(inPins[0], LOW);
  delay(delayTime);
  digitalWrite(inPins[2], HIGH);
  delay(delayTime);
  digitalWrite(inPins[1], LOW);
  delay(delayTime);
  digitalWrite(inPins[3], HIGH);
  delay(delayTime);
  digitalWrite(inPins[2], LOW);
  delay(delayTime);
  digitalWrite(inPins[0], HIGH);
  delay(delayTime);
  digitalWrite(inPins[3], LOW);
  delay(delayTime);
}

【问题讨论】:

    标签: c for-loop arduino stepper


    【解决方案1】:

    inPins 数组的索引和极性放入它们自己的数组中:

    int indices[] = { 0, 1, 0, 2, 1, 3, 2, 0, 3 };
    // Assuming HIGH and LOW are defined as ints
    int polarities = { HIGH, HIGH, LOW, HIGH, LOW, HIGH, LOW, HIGH, LOW };
    int size = sizeof(indices) / sizeof(int);
    

    然后你可以:

    for (int i = 0; i < size; i++)
    {
        digitalWrite(inPins[indices[i]], polarities[i]);
        delay(delayTime);
    }
    

    【讨论】:

    • 您的答案是错误的,因为您正在向所有引脚写入高电平,而某些引脚必须设置为低电平。
    • 很容易修复,@mike。
    • 更好的是,他们可以参数化索引和极性,并在其他场景中使用此解决方案。并不是说有很多保存的代码。
    • @Oppen 它并没有为一个函数节省很多代码,但我看到我确实必须实现一个逆时针函数,它确实在那里节省了一些代码。
    【解决方案2】:

    首先,划分pin处理的顺序,找到一些模式:

    void halfStepClockwise()
    {
      digitalWrite(inPins[0], HIGH);
      delay(delayTime);
    
      digitalWrite(inPins[1], HIGH);
      delay(delayTime);
      digitalWrite(inPins[0], LOW);
      delay(delayTime);
    
      digitalWrite(inPins[2], HIGH);
      delay(delayTime);
      digitalWrite(inPins[1], LOW);
      delay(delayTime);
    
      digitalWrite(inPins[3], HIGH);
      delay(delayTime);
      digitalWrite(inPins[2], LOW);
      delay(delayTime);
    
      digitalWrite(inPins[0], HIGH);
      delay(delayTime);
      digitalWrite(inPins[3], LOW);
      delay(delayTime);
    }
    

    除了第一个块外,线将引脚n mod 4转为高电平,然后将引脚n-1转为低电平。

    让我们编写代码:

    void halfStepClockwise()
    {
      digitalWrite(inPins[0], HIGH);
      delay(delayTime);
    
      for (int i = 1; i <= 4; i++)
      {
        digitalWrite(inPins[i % 4], HIGH);
        delay(delayTime);
        digitalWrite(inPins[i - 1], LOW);
        delay(delayTime);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 1970-01-01
      • 2022-07-15
      • 2021-12-12
      • 2020-05-30
      • 1970-01-01
      • 2018-08-22
      • 2018-07-29
      • 2021-10-23
      相关资源
      最近更新 更多