Почему при задержке шаговый двигатель останавливается? И почему команда 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-ти проводный степпер.
@12944qwerty, 👍1
Обсуждение2 ответа
... почему вызывается команда 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
Проще говоря: break() буквально вырывается из непосредственного цикла, в котором он находится. Поскольку вы не были в цикле [void loop() — это не ваши обычные функции цикла, это просто Arduino — для бесконечного повторения того, что внутри . Вы можете использовать цикл for/while в setup() для того, сколько раз вы хотите, чтобы он запускался, а затем использовать break().] delay(время в мс), как следует из названия, просто приостанавливает Arduino, как мозговой пердеж, для того, как много раз, когда вы ставите в качестве параметра. Вы можете проверить эту ссылку в будущем для получения информации о встроенных функциях и других сомнениях, связанных с языком.
- Управление направлением шагового двигателя с помощью кнопок.
- Шаговый двигатель не работает с платой A4988
- Grbl на Arduino Uno (Elegoo) с неработающим шаговым двигателем DM542 + nema24
- Кнопка сброса не работает + не могу загрузить код, что не так?
- Принципиальная схема для работы биполярного шагового двигателя с использованием LDR
- Непрерывное обнаружение кнопок для шагового управления
- Справка по библиотеке AccelStepper - Одновременное управление двигателем
- Как позволить шаговому двигателю вращаться постоянно?
Я не уверен, что операторы печати могут поддерживать скорость, но вы можете попробовать (распечатать соответствующие переменные, чтобы вы могли видеть, где что-то идет не так), для этого вы можете временно закомментировать файл digitalWrites. Также совет, чтобы дать вашим переменным хорошее имя (например, _on, я ожидаю, что это логическое значение)., @Michel Keijzers
@мишел кейзерс. Я исправил, задержка в конце исправляет почему-то. Я не знаю почему., @12944qwerty
Хорошо, приятно слышать :-), @Michel Keijzers