ARDUINO Прошу помощи разобраться с управлением шаговым мотором

Андрей К.

★✩✩✩✩✩✩
25 Май 2019
287
23
Москва. Щукино
Попросили написать программу, в которой моторы через рандомный промежуток времени меняют направление и скорость вращения.
Направление вращения меняет, время смены направления тоже работает... а вот скорость почему то никак не меняется... Где то вероятно у меня ошибка...
Подскажите...
Проблема в 55-58 строках. Там задается промежуток времени через который должна меняться скорость вращения мотора
По логике все должно работать, но собрав макет, не получилось что задумано...

Скетчик на управление моторами:
// Скетчик на управление моторами для тира.

uint32_t myTimer1, myTimer2;    // время, скорость

#define pinStep 4            // сигнал Step на драйвер. Каждый импульс от этого контакта — это перемещение мотора на один шаг
#define pinDir1 3            // пин Direction на драйвер. Наличие лог-1 мотор вращается в одну сторону, отсутствие - в другую
#define pinDir2 2            // пин Direction на драйвер. Наличие лог-1 мотор вращается в одну сторону, отсутствие - в другую
#define Smin 1000            // скорость минимальная ??? Нужно подбирать величины...
#define Smax 500             // скорость максимальная ??? Нужно подбирать величины...
#define Tmin 5000            // время для движения минимальное в милисекундах (5сек)
#define Tmax 30000           // время для движения максимальное в милисекундах (30сек)
#define STmin 3000           // время для изменения скорости движения минимальное в милисекундах (3сек)
#define STmax 10000          // время для изменения скорости движения максимальное в милисекундах (10сек)

void setup() {

  pinMode(pinDir1, OUTPUT);   // мотор 1  пин DIR
  pinMode(pinDir2, OUTPUT);   // мотор 2  пин DIR
  pinMode(pinStep, OUTPUT);   // к моторам для вращения на пин STEP
  digitalWrite(pinDir1, LOW);   // задаем начальное направление вращения 1 мотор туда
  digitalWrite(pinDir2, HIGH);  // задаем начальное направление вращения 2 мотор обратно

}
  // начальные установки
int t = 10000;   // 10 сек едет при первом включении
int p = 1;    
int s = Smin;    // нач скорость
int st = STmin;  // нач время

void loop() {

  if (millis() - myTimer1 >= t) {           // таймер времени движения мишени
    myTimer1 = millis();                        // сброс таймера
    t = (random(Tmin, Tmax));               // генерируем время

    p = p + 1 ;                             // счетчик для переключения направления
    if (p > 2) {
      p = 1;
    }

    if ( p == 1) {
      digitalWrite(pinDir1, LOW);             // задаем направление вращения 1 мотор туда
      digitalWrite(pinDir2, HIGH);            // задаем направление вращения 2 мотор обратно

    }
    if ( p == 2) {
      digitalWrite(pinDir1, HIGH);             // задаем направление вращения 1 мотор обратно
      digitalWrite(pinDir2, LOW);              // задаем направление вращения 2 мотор туда

    }
  }

  // задаем скорость и время для изменения скорости

  if (millis() - myTimer2 >= st) {             // таймер на скорость
    myTimer2 = millis();                       // сброс таймера
    s = (random(Smin, Smax));                  // генерируем скорость
    st = (random(STmin, STmax));               // генерируем время для изменения скорости
  }

  // формируем импульсы на вращение к моторам, сигнал STEP

  digitalWrite(pinStep, HIGH);
  delayMicroseconds(s);
  digitalWrite(pinStep, LOW);
  delayMicroseconds(s);

}
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
3,062
912
а то что у вас минимум скорости больше, чем максимум - это так задумано?
C++:
#define Smin 1000            // скорость минимальная ??? Нужно подбирать величины...
#define Smax 500             // скорость максимальная ??? Нужно подбирать величины...
 
  • Лойс +1
Реакции: Андрей К.

Андрей К.

★✩✩✩✩✩✩
25 Май 2019
287
23
Москва. Щукино
Нет, так не задумано, но в этом получается ошибка и была.
Там указывается пауза, а чем она больше, тем медленнее крутится ... Как бы обратная зависимость
В общем разобрался.
Ошибка была в строке
s = (random(Smin, Smax));
а из-за того что там обратное написание, он не понимал что хотят вероятно. Когда поправил на
s = (random(Smax, Smin));
все заработало.