Управление функцией включения на драйвере микрошагового устройства
У меня возникли проблемы с использованием контакта ВКЛЮЧЕНИЯ на микрошаговом драйвере, я не уверен в точной модели, но она выглядит точно так же, как на картинке здесь
Микрошаговый драйвер
Вот мой код:
#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);
}
@Jertise, 👍0
Обсуждение1 ответ
Лучший ответ:
Эти драйверы отличаются от конструкции H-моста, описанной здесь. Вам не нужно генерировать импульсы для катушек, как это было бы с классическим H-мостом.
Подключите ваш двигатель к
A+
,A-
,B+
,B-
(a-одна катушка, b-другая)Подключите питание (думаю, 12+ вольт, у меня до 48 В) к
GND
иV+
Либо подключите 5 В к
ENA+(+5 В)
, либо бесплатный вывод arduino иENA-(ENA)
к GND. Этот вывод включает/отключает драйвер. Если на этом выводе нет ввода, драйвер не будет работать.Подключите
DIR+(+5 В)
к свободному контакту arduino иDIR-(DIR)
кGND
. Этот штифт управляет направлением.ВЫСОКОЕ
значение заставляет двигатель поворачиваться вправо, в то времякак НИЗКОЕ
значение на этом штифте заставляет двигатель поворачиваться влево.Подключите
PUL+(+5 В)
к свободному контакту arduino иPUL-(PUL)
кGND
. Этот штифт управляет скоростью. Чем больше импульсов в секунду подается, тем быстрее вращается двигатель. (До определенного предела, конечно).
Скетч должен быть легким.
Плюс: вы можете отключить управляющие соединения, подключив все контакты +5 В к 5 В и используя
INPUT_PULLUP
для переключения тока на отрицательных линиях. Я знаю, что эти драйверы оптическиизолированы и потребляют всего 10 мА от контакта, если вообще получают. Так что вы должны быть в безопасности.
Я исправил функцию включения, и я могу управлять двигателем, но я все еще не могу использовать свой концевой выключатель, чтобы включить или выключить контакт включения. У вас есть какие-нибудь идеи относительно того, почему это так?, @Jertise
- Где я ошибаюсь в изменении Timer0 и прерываний ISR в этом примере?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Как правильно использовать volatile переменные в Arduino?
- Запустить два степпера одновременно
- Как прервать функцию цикла и перезапустить ее?
- 4-битный счетчик вверх и вниз
Процедура обслуживания прерываний, которая *переключает* состояние, звучит так, как будто вы просто напрашиваетесь на неприятности. Даже если это не является причиной вашей проблемы, вам, вероятно, будет лучше с помощью логики уверенно установить правильный уровень. Знаете ли вы о проблеме "контактного отскока"? Это может привести к тому, что вы переключите состояние двигателя несколько случайным образом, а результат будет зависеть от того, четное оно или нечетное..., @Chris Stratton
Я вожу их с напряжением *12 Вольт* от порта принтера. Я помню, что мой тоже должен быть совместим с 5V. Кроме того, у меня такое чувство, что вы точно не знаете, как работают эти драйверы..., @ansi_lumen