цифровая электроника
вычислительная техника
встраиваемые системы

 

Превращаем шаговый двигатель в энкодер

Автор: Mike(admin) от 16-07-2018, 06:55

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


Превращаем шаговый двигатель в энкодер

Применение шагового мотора в качестве датчика имеет смысл. Если катушки в двигателе могут перемещать вал, то перемещение вала должно вызвать ток в катушках. Однако следует заметить, что при низких скоростях вы можете пропустить импульсы. Опять же, устройство не оптимизировано для этого типа операций.


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


Превращаем шаговый двигатель в энкодер

Когда вал поворачивается в одном направлении, один импульс будет следовать за другим. При вращении в другом направлении последовательность импульсов будет реверсирована.


Превращаем шаговый двигатель в энкодер

Для проверки работоспособности концепции можно собрать схему из Arduino, двух двигателей и драйвера A4988.


Превращаем шаговый двигатель в энкодер

А можно с одним двигателем и светодиодным кольцом AdaFruit NeoPixel в качестве индикатора, как на видео ниже.



В любом случае считывать импульсы с датчика/двигателя поможет следующий код:



#include <Encoder.h> // https://github.com/PaulStoffregen/Encoder
#define dir 12   // Stepping
#define stp 13   // Direction
Encoder myEnc(3, 2);

void setup() {
  pinMode(dir, OUTPUT);
  pinMode(stp, OUTPUT);

}

int newPosition=0;
int oldPosition = 0;
int diff=0;
void loop() {
  oldPosition=newPosition;
  newPosition = myEnc.read();
  diff=newPosition-oldPosition;
  if(diff!=0){
    if(diff> 0){
      digitalWrite(dir, HIGH);
    }else{
      digitalWrite(dir, LOW);
    }
    diff=abs(diff);
    for(int i=0;i< diff;i++){
      digitalWrite(stp,HIGH);
      delay(50);
      digitalWrite(stp,LOW);
    }
  }
}



© digitrode.ru


Теги: Arduino, шаговый двигатель




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

Комментарии:

Оставить комментарий