Шаговый двигатель с концевыми выключателями

У меня есть код ниже, который является моей попыткой управлять направлением шагового двигателя, который перемещает каретку вправо и влево. Кроме того, на каждом конце пути есть ограничения, которые при активации останавливают движение в соответствующем направлении. Моя проблема в том, что двигатель отлично работает в левом и правом направлениях, но я могу заставить работать только один из концевых выключателей. Буду признателен за любые предложения.

int PUL = 7; //определить импульсный вывод
int DIR = 6; //определить направление вывода
int ENA = 5; //определить пин включения
int RGT = 3;
int LFT = 2;
int potPin = A5;
int count = 0;
int interval = 1000;
int val = 0;
int Spd = 500;

#define Limit01 8  // Контакт 2 подключен к выходу концевого выключателя
#define Limit02 9  // Контакт 3 подключен к выходу концевого выключателя

void setup() {
  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (ENA, OUTPUT);
  Serial.begin(9600);
}


void loop() {

  if (digitalRead(LFT) == LOW) {  // Если джойстик перемещен влево
    if (digitalRead(Limit01) == HIGH) {} // проверяем, активирован ли концевой выключатель

    else {  // если концевой выключатель не активирован, вращаем двигатель по часовой стрелке


      digitalWrite(DIR, LOW);
      digitalWrite(ENA, HIGH);
      digitalWrite(PUL, HIGH);
      delayMicroseconds(500);
      digitalWrite(PUL, LOW);
      delayMicroseconds(500);
    }
  }

  if (digitalRead(RGT) == LOW) { // Если джойстик перемещен вправо

    if (digitalRead(Limit02) == HIGH) {} // проверяем, активирован ли концевой выключатель

    else {  // если концевой выключатель не активирован, вращаем двигатель против часовой стрелки

      digitalWrite(DIR, HIGH);
      digitalWrite(ENA, HIGH);
      digitalWrite(PUL, HIGH);
      delayMicroseconds(500);
      digitalWrite(PUL, LOW);
      delayMicroseconds(500);


    }
  }
}

, 👍2

Обсуждение

Вы не инициализировали входы. Похоже, что у переключателя есть pull-down, поэтому нет внутреннего pull-up, но в любом случае инициализируйте их в начале. Затем... Вы уверены, что переключатель работает? Вы пробовали использовать скетч для считывания состояния переключателей, чтобы проверить, работают ли они?, @frarugi87

Можете ли вы предоставить схему подключения выключателей? Вы измерили напряжение на входах концевого выключателя при открытом и закрытом положении выключателя?, @linhartr22


2 ответа


1

Из вашего вопроса я понял, что вам нужен только один концевой выключатель для управления шаговым двигателем в обоих направлениях. Вот код, который может вам пригодиться в этом случае:

int dirpin_T1 = 2;
int dirH_T1 = 3;
int steppin_T1 = 4;
int limit = 10; // ПРЕДПОЛАГАЕМ, ЧТО КОНЦЕВОЙ ВЫКЛЮЧАТЕЛЬ РАЗМЕЩЕН В ПРАВОМ УГЛУ
void setup() {
  pinMode(limit,INPUT);


  pinMode(dirpin_T1, OUTPUT);
  pinMode(dirH_T1, OUTPUT);
  pinMode(steppin_T1, OUTPUT);

}

void loop() { //ШАГОВЫЙ ДВИЖЕНИЕ СЛЕВА НАПРАВО

    digitalWrite(dirpin_T1, LOW );     
    digitalWrite(dirH_T1, LOW);
   do
   {
      digitalWrite(steppin_T1, LOW);  // Это изменение с LOW на HIGH создает
      digitalWrite(steppin_T1, HIGH); // "Нарастающий фронт", чтобы easydriver знал, когда делать шаг.
      delayMicroseconds(50);

   }(digitalRead(limit)==HIGH); //ПРИ НАЖАТИИ КОНЦЕВОГО ВЫКЛЮЧАТЕЛЯ ДВИГАТЕЛЬ ОСТАНАВЛИВАЕТСЯ
  delay(500);
  //ПРИЧИНЕ НИЗКОГО КОНЦЕВОГО ВЫКЛЮЧАТЕЛЯ ИЗМЕНИТЕ НАПРАВЛЕНИЕ ВРАЩЕНИЯ ДВИГАТЕЛЯ
  if(digitalRead(limit)==LOW)
  {
      digitalWrite(dirpin_T1, LOW ); //ИЗМЕНЕНИЕ НАПРАВЛЕНИЯ ВРАЩЕНИЯ ДВИГАТЕЛЯ (С НИЗКОГО НА ВЫСОКИЙ)
      digitalWrite(dirH_T1, HIGH);
     for(int i=0; i<36000;i++)
      { //попробуйте изменить значение i, так как оно зависит от того, на сколько оборотов вы хотите, чтобы ваш двигатель сделал шаг вперед

      digitalWrite(steppin_T1, LOW);  // Это изменение с LOW на HIGH создает
      digitalWrite(steppin_T1, HIGH); // "Нарастающий фронт", чтобы easydriver знал, когда делать шаг.
      delayMicroseconds(50);
     }

  }
}

Простая логика заключается в том, чтобы вращать двигатель в одном направлении до тех пор, пока концевой выключатель не станет ВЫСОКИМ. И вращать его в другом направлении, когда он станет НИЗКИМ, т. е. уже нажатым. Поправьте меня, если я ошибаюсь, и попробуйте изменить код в соответствии с этой логикой. Однако вам нужно изменить свой код в зависимости от того, какой тип драйвера вы используете. Сейчас я использую драйвер TB6560. Вы можете использовать цикл if вместо цикла do while, чтобы было проще понять.

,

это концевой выключатель, @Sonali_B

это пустой цикл, который остановит двигатель, когда digitalRead(S01)==HIGH, в противном случае двигатель продолжит вращаться, @Sonali_B

Более ранний комментарий отсутствовал, поэтому это привело к небольшой путанице, как и выше. Комментарии — это строки в программе, которые используются для информирования вас или других о том, как работает программа. Они игнорируются компилятором и не экспортируются в процессор, поэтому они не занимают места во флэш-памяти микроконтроллера. Единственная цель комментариев — помочь вам понять (или запомнить) или информировать других о том, как работает ваша программа., @Sonali_B


0

Использование в то время как (условие) { код для выполнения } убедившись, что сам код «короткий», чтобы не выйти за пределы условия

Если вы используете конструкцию while вместо do / while, вы сначала проверяете условие перед выполнением кода. пока (не на пределе) переместить степпер на один шаг Также активное состояние концевого выключателя должно быть заземлено, а не +V. Вопрос безопасности. Если вы случайно заземлите сигнал, он будет действителен, если же путь сигнала уже заземлен, то случайное подключение к нему +V не будет обнаружено.

,