Почему при задержке шаговый двигатель останавливается? И почему команда break вызывает ошибку?

Я использую шаговый двигатель для проекта, который хочу остановить. Я попробовал циклы for, пока и оператор if. Все они были помещены внутрь цикла void, поскольку вызывали ошибку.

Мой код с циклом if:

//Эта программа делает примерно 1 оборот или 4100 шагов. Программа должна уметь останавливать шаговый двигатель после того, как он сделает один оборот.
int Pin1 = 8;
int Pin2 = 9;
int Pin3 = 10;
int Pin4 = 11;
int _step = 0;
int _on = 4100;
int _switches = 0;
boolean direct = false;
void setup() {
  pinMode (Pin1, OUTPUT);
  pinMode (Pin2, OUTPUT);
  pinMode (Pin3, OUTPUT);
  pinMode (Pin4, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (_on > 0) {
    switch(_step) 
    {
      case 0:
        digitalWrite (Pin1, LOW);
        digitalWrite (Pin2, LOW);
        digitalWrite (Pin3, LOW);
        digitalWrite (Pin4, HIGH);
      break;
      case 1:
        digitalWrite (Pin1, LOW);
        digitalWrite (Pin2, LOW);
        digitalWrite (Pin3, HIGH);
        digitalWrite (Pin4, HIGH);
      break;
      case 2:
        digitalWrite (Pin1, LOW);
        digitalWrite (Pin2, LOW);
        digitalWrite (Pin3, HIGH);
        digitalWrite (Pin4, LOW);
      break;
      case 3:
        digitalWrite (Pin1, LOW);
        digitalWrite (Pin2, HIGH);
        digitalWrite (Pin3, HIGH);
        digitalWrite (Pin4, LOW);
      break;
      case 4:
        digitalWrite (Pin1, LOW);
        digitalWrite (Pin2, HIGH);
        digitalWrite (Pin3, LOW);
        digitalWrite (Pin4, LOW);
      break;
      case 5:
        digitalWrite (Pin1, HIGH);
        digitalWrite (Pin2, HIGH);
        digitalWrite (Pin3, LOW);
        digitalWrite (Pin4, LOW);
      break;
      case 6:
        digitalWrite (Pin1, HIGH);
        digitalWrite (Pin2, LOW);
        digitalWrite (Pin3, LOW);
        digitalWrite (Pin4, LOW);
      break;
      case 7:
        digitalWrite (Pin1, HIGH);
        digitalWrite (Pin2, LOW);
        digitalWrite (Pin3, LOW);
        digitalWrite (Pin4, HIGH);
      break;
      case 8:
        digitalWrite (Pin1, LOW);
        digitalWrite (Pin2, LOW);
        digitalWrite (Pin3, LOW);
        digitalWrite (Pin4, LOW);
      break;
    }

    if(direct == false) {
      _step++;
      _switches++;
      direct = false;
    }else{
      _step--;
      _switches--;
      direct = true;
    }

    Serial.println(_switches);

    if(_step>7) {
      _step=0;
    }

    if(_step<0) {
      _step=7;
    }
    _on--;
    delay(1); // Это решает.
  }
  break; // Это вызывает ошибку при использовании с циклом for.
}

Может ли кто-нибудь помочь, почему задержка останавливает его? А почему вызывается команда break и ошибка?

Ардуино УНО. 5-ти проводный степпер.

, 👍1

Обсуждение

Я не уверен, что операторы печати могут поддерживать скорость, но вы можете попробовать (распечатать соответствующие переменные, чтобы вы могли видеть, где что-то идет не так), для этого вы можете временно закомментировать файл digitalWrites. Также совет, чтобы дать вашим переменным хорошее имя (например, _on, я ожидаю, что это логическое значение)., @Michel Keijzers

@мишел кейзерс. Я исправил, задержка в конце исправляет почему-то. Я не знаю почему., @12944qwerty

Хорошо, приятно слышать :-), @Michel Keijzers


2 ответа


1

... почему вызывается команда break и возникает ошибка?

Потому что вы используете его неправильно! break завершает цикл и используется в операторах switch...case. Прочтите документацию по break, если вам нужно узнать больше

Я исправил, задержка в конце почему-то исправляет. Я не знаю почему.

Вы на самом деле не исправили это, если не знаете, почему. Похоже, вы пытаетесь напрямую управлять 5-проводным шаговым двигателем, я предполагаю, что ваши контакты должны управлять транзистором или чем-то еще, поскольку сами контакты arduino не будут работать.

Причина, по которой это работает, заключается в том, что шаговому механизму требуется время для подачи питания и движения. Если вы не будете ждать достаточно долго, он не сработает, ваш файл serial.print должен быть достаточно длинным, так как задержка (1) должна производить Задержка 1 мс, что слишком мало.

Вы неправильно управляете шаговым двигателем, у вас есть настройка кода для управления полушагом, но у вас есть 9 состояний, состояние 8 не требуется.

вы дублируете усилия, которые вам не нужны, как с _steps, так и с _switches, они всегда имеют одно и то же значение.

Вы также можете улучшить свой код:

int dir = 1
int c = 0

// в цикле
c += dir

if (c > max)
{
  dir *= -1
  c = max
}

if (c < min)
{
  dir *= -1
  c = min
}

Благодаря этому вам не нужно проверять направление изменения ваших переменных.

,

Просто для ясности: степпер не останавливается, потому что ему нужна задержка, чтобы вычислить, что делать дальше? Кроме того, разрыв должен прервать основной цикл **void loop()**. И, наконец, я впервые использую Arduino и C. Я не умею работать с кодом так же хорошо, как многие из вас, ребята., @12944qwerty

@ 12944qwerty __void loop()__ — это функция, вы возвращаетесь из функций, вы выходите из циклов; присвоение имени циклу функции не делает его циклом; он называется loop(), потому что основная библиотека Arduino вызывает loop() в цикле!, @esoterik

@ 12944qwerty шаговому двигателю нужна задержка для __ФИЗИЧЕСКОГО__ движения; катушкам требуется время, чтобы подать питание и создать магнитное поле, затем двигатель перейдет к следующему шагу., @esoterik


0

Проще говоря: break() буквально вырывается из непосредственного цикла, в котором он находится. Поскольку вы не были в цикле [void loop() — это не ваши обычные функции цикла, это просто Arduino — для бесконечного повторения того, что внутри . Вы можете использовать цикл for/while в setup() для того, сколько раз вы хотите, чтобы он запускался, а затем использовать break().] delay(время в мс), как следует из названия, просто приостанавливает Arduino, как мозговой пердеж, для того, как много раз, когда вы ставите в качестве параметра. Вы можете проверить эту ссылку в будущем для получения информации о встроенных функциях и других сомнениях, связанных с языком.

,