Обратная связь по положению для шагового двигателя

Я хочу вращать шестерню с помощью шагового двигателя. Пока Arduino включен, все хорошо.

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

Предположим, что 2038 шагов вращают двигатель на один оборот. Например, при прохождении 1500 шагов и отключении питания. Червь уже на 6 см. И питание включено. Степпер работает от 6 см и проходит 2038 шагов. Сейчас он на 16-м см.

Если я использую сервопривод, то при включенном питании я могу записать двигатель в положение 0. Но я должен использовать шаговый двигатель. Как это исправить?

Шаговый двигатель: 28 BYJ 48 Драйвер: ULN2003A

Треска здесь;

int State;
int Wait;

void setup() {

  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);

  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  State = 8;
  Wait = 2; 
}

void loop() {

  turnRight(2038);
  delay(1000);
  turnLeft(2038);
  delay(1000);

  }


void turnRight(int Step) {
    for (int i = 0; i < Step ; i++){
      digitalWrite(State,HIGH);
      delay(Wait);
      digitalWrite(State,LOW);
      IncreaseState();
    }
}

void IncreaseState() {
  State++;
  if (State==12){
    State=8;
  }
}

void turnLeft(int Step) {
for (int i = 0; i < Step ; i++){
      digitalWrite(State,HIGH);
      delay(Wait);
      digitalWrite(State,LOW);
      DecreaseState();
    }

}

void DecreaseState() {
  State--;
  if(State==7){
    State=11;
  }
}

, 👍1


2 ответа


1

Есть несколько способов сделать это. Самый простой и наиболее часто используемый способ - использовать концевой выключатель в качестве датчика исходного положения. При запуске устройство сначала будет вращать двигатель в направлении концевого выключателя, пока выключатель не сработает. Теперь известно абсолютное положение на этой оси, и вы можете продолжить оттуда. (Станки с ЧПУ и 3D-принтеры в основном работают именно так. Часто они снова отходят от концевого выключателя и снова приближаются к выключателю с меньшей скоростью, чтобы повысить точность). Для этого вам просто нужен микропереключатель на оси и подключить его к одному входному контакту. В setup() вы двигаете шаговый двигатель в направлении концевого выключателя, пока он не активируется. После этого вы находитесь в нулевой позиции и можете продолжить свой набросок.

Более сложный способ – ввести в устройство функцию измерения положения. Сервопривод включает в себя потенциометр, соединенный с осью. Измеряя напряжение на этом потенциометре (по сути, это делитель напряжения), электроника сервопривода всегда может знать, где она находится в данный момент. Существуют также потенциометры фейдеров, в которых вы не вращаете ручку, а перемещаете фейдер по линейной направляющей. Вы можете найти потенциометр фейдера, который подходит к вашей шкале (10 см не так уж и много, может и есть).

Или вы можете сохранить текущую позицию в энергонезависимой памяти (например, EEPROM) и получить ее при запуске. Но так как отключение питания при записи позиции может привести к повреждению данных, придется пойти более сложным путем. Что-то вроде определения того, что питание было отключено, обеспечивая Arduino питанием через большой конденсатор, так что, когда он чувствует потерю питания, у него еще есть достаточно времени, чтобы записать текущую позицию в энергонезависимую память. (Это также лучше для EEPROM, чем постоянная запись в него, так как EEPROM имеет ограниченное количество циклов записи).

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

,

Спасибо за ответ, думаю, попробую концевой выключатель., @can


1

Еще один ответ, о котором не упомянул chrism, — использовать "поворотный энкодер абсолютного положения". Это устройство, которое выводит битовый шаблон с использованием «кода Грея» или «двоичного кода Грея», который сообщает вам положение вала. Чем больше битов в энкодере, тем точнее можно измерить положение. Битовая комбинация «код Грея» позволяет считывать изменяющееся положение без ложного считывания из-за дребезга контакта/датчика.

Однако, если вы хотите однозначно определить 2038 отдельных шагов, вам понадобится 12-битный поворотный энкодер, который будет немного дороже и займет много контактов интерфейса.

,

Спасибо за ваше добавление. Я использовал Limit Switch и пока работал хорошо. Я попробую вашу идею для улучшения в другом проекте., @can