Управление функцией включения на драйвере микрошагового устройства

У меня возникли проблемы с использованием контакта ВКЛЮЧЕНИЯ на микрошаговом драйвере, я не уверен в точной модели, но она выглядит точно так же, как на картинке здесь

Микрошаговый драйвер

Вот мой код:

#define MAX_LEN 8
#define MIN_INCREMENT 0.5
#define LIMIT_SWITCH 3
#define ENABLE 10
float buoyancymass = 4401.425;
float centrebuoyancy = 14.164;
float mainarm = 14.3;
float nosearm = 1.8;
float adc = 11.4;
float meanadc = 22.65; 
volatile byte enable_state = LOW;


#include <Stepper.h>

const int stepsPerRevolution = 1600;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;         // number of steps the motor has taken
float stepinch = 0.00524; // 1 step = x"

void setup() {
  // initialize the serial port:
  Serial.begin(9600);
  pinMode(LIMIT_SWITCH, INPUT_PULLUP);
  pinMode(ENABLE, OUTPUT);
  //enable motor
  digitalWrite(ENABLE, enable_state);
  //interrupt
  attachInterrupt(digitalPinToInterrupt(LIMIT_SWITCH), limitbrake, FALLING);
  // set the speed
  myStepper.setSpeed(30);
}

void limitbrake() {
  digitalWrite(ENABLE, !enable_state);
}

Проблема,которую я замечаю, заключается в том, что, когда я устанавливаю PIN-режим(ВКЛЮЧИТЬ, ВЫВОД); мой шаговый двигатель не потребляет ток и, следовательно, не работает. Это происходит независимо от того, установил ли я значение enable_state в ВЫСОКОЕ или НИЗКОЕ.

Достаточно забавно, когда я устанавливаю его в PIN-режим(ВКЛЮЧИТЬ,ВВОД); он действительно потребляет ток и приводит в действие двигатель, но, к сожалению, мой концевой выключатель, к которому я подключил прерывание, не отключает двигатель при его нажатии.

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

Вот остальная часть моего кода, если вам было интересно.

float calc_margin(float pos, float mass) {
  // calculate margin
  Serial.print("Distance: ");Serial.println(pos);
  float batterymoment = mass*pos;
  Serial.println(batterymoment);
  float totalmass = mass + 12404;
  Serial.println(totalmass);
  float totalmoment = 149650+batterymoment;
  Serial.println(totalmoment);
  float buoyancymoment = buoyancymass*centrebuoyancy;
  Serial.println(buoyancymoment);
  float wheelmoment = totalmoment - buoyancymoment;
  Serial.println(wheelmoment);
  float wheelweight = totalmass - buoyancymass;
  Serial.println(wheelweight);
  float cgwheels = wheelmoment/wheelweight;
  Serial.println(cgwheels);
  float maindistance = mainarm - cgwheels;
  Serial.println(maindistance);
  float nosedistance = cgwheels - nosearm;
  Serial.println(nosedistance);
  float mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  Serial.println(mainmass);
  float nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  Serial.println(nosemass);
  float mainmoment = mainmass*mainarm;
  Serial.println(mainmoment);
  float nosemoment = nosemass*nosearm;
  Serial.println(nosemoment);
  float netmoment = buoyancymoment+(mainmoment*2)+(nosemoment*2);
  Serial.println(netmoment);
  float netcg = netmoment/totalmass;
  Serial.println(netcg);
  float staticmargin = adc - netcg;
  Serial.println(staticmargin);
  float answer = staticmargin/meanadc;
  Serial.println(answer);
  float percentage = answer*100;
  Serial.print(percentage); Serial.println("%");
  float result = answer;
  return result;
}

boolean check_margin(float test_margin) {
  if (test_margin > -0.04 && test_margin < -0.02)
    return true;
  return false;
}

float armcalc(float mass) {
  for(float x=0;x<MAX_LEN;x+=MIN_INCREMENT) {
    // calculate margin
    float margin = calc_margin(x,mass);
    if (check_margin(margin)) {
      return x;
    }
  }
  return -1;
}

float stepcalc(float arm){
  int arminch = arm*12;
  float numberofsteps = arminch/stepinch;
  int result = numberofsteps;
  Serial.print("Calculated steps: "); Serial.println(result);
  return result;
}


void loop() {
  // read input
  Serial.println("Enter mass: ");
  while (!Serial.available());
  float mass = Serial.parseFloat();
  float arm = armcalc(mass);
  if (arm < 0) {
    // Error message
    Serial.println("Error!");
    return;
  }
  Serial.print("Arm distance is "); Serial.println(arm);
  // step
  const int steplength = (int) stepcalc(arm);
  Serial.print("Number of steps is "); Serial.println(steplength);
  myStepper.step(-steplength);

  while(1);

}

, 👍0

Обсуждение

Процедура обслуживания прерываний, которая *переключает* состояние, звучит так, как будто вы просто напрашиваетесь на неприятности. Даже если это не является причиной вашей проблемы, вам, вероятно, будет лучше с помощью логики уверенно установить правильный уровень. Знаете ли вы о проблеме "контактного отскока"? Это может привести к тому, что вы переключите состояние двигателя несколько случайным образом, а результат будет зависеть от того, четное оно или нечетное..., @Chris Stratton

Я вожу их с напряжением *12 Вольт* от порта принтера. Я помню, что мой тоже должен быть совместим с 5V. Кроме того, у меня такое чувство, что вы точно не знаете, как работают эти драйверы..., @ansi_lumen


1 ответ


Лучший ответ:

1

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

  1. Подключите ваш двигатель к A+, A-, B+, B- (a-одна катушка, b-другая)

  2. Подключите питание (думаю, 12+ вольт, у меня до 48 В) к GND и V+

  3. Либо подключите 5 В к ENA+(+5 В), либо бесплатный вывод arduino и ENA-(ENA) к GND. Этот вывод включает/отключает драйвер. Если на этом выводе нет ввода, драйвер не будет работать.

  4. Подключите DIR+(+5 В) к свободному контакту arduino и DIR-(DIR) к GND. Этот штифт управляет направлением. ВЫСОКОЕ значение заставляет двигатель поворачиваться вправо, в то время как НИЗКОЕ значение на этом штифте заставляет двигатель поворачиваться влево.

  5. Подключите PUL+(+5 В) к свободному контакту arduino и PUL-(PUL) к GND. Этот штифт управляет скоростью. Чем больше импульсов в секунду подается, тем быстрее вращается двигатель. (До определенного предела, конечно).

Скетч должен быть легким.

Плюс: вы можете отключить управляющие соединения, подключив все контакты +5 В к 5 В и используя INPUT_PULLUP для переключения тока на отрицательных линиях. Я знаю, что эти драйверы оптическиизолированы и потребляют всего 10 мА от контакта, если вообще получают. Так что вы должны быть в безопасности.

,

Я исправил функцию включения, и я могу управлять двигателем, но я все еще не могу использовать свой концевой выключатель, чтобы включить или выключить контакт включения. У вас есть какие-нибудь идеи относительно того, почему это так?, @Jertise