bool flag = false; // для кнопки
uint32_t btnTimer = 0;
const uint8_t knop=2;
const uint8_t pin_ENA = 6; // Вывод Arduino подключённый к входу драйвера ENA+.
const uint8_t pin_DIR = 4; // Вывод Arduino подключённый к входу драйвера DIR+.
const uint8_t pin_PUL = 5; // Вывод Arduino подключённый к входу драйвера PUL+.
// Вывод GND Arduino соединён с входами драйвера ENA-, DIR-, PUL-.
bool flag_stop = false; //флаг на прерывание
///////////////////////////////// класс на таймер //////////////////////////////////////
class Timer {
public:
Timer(uint32_t nprd = 0) {
setPeriod(nprd);
}
void setPeriod(uint32_t nprd) {
prd = nprd;
}
bool ready() {
return (prd && micros() - tmr >= prd) ? (tmr = micros(), 1) : 0;
}
private:
uint32_t tmr = 0, prd = 0;
};
/////////////////////////////////////////////////////////////////////////////////////
Timer tmr1;
/////////////////////////////////////////////////////////////////////////////////////
void knopka () {
// читаем инвертированное значение для удобства
bool btnState = !digitalRead(knop);
if (btnState && !flag && millis() - btnTimer > 80) {
flag = true;
btnTimer = millis();
Serial.println("stop");
}
if (!btnState && flag && millis() - btnTimer > 80) {
flag = false;
btnTimer = millis();
// Serial.println("release");
}
}
//////////////////////////////////////////////////////////////////////////////////////////
void setup() {
pinMode(knop, INPUT_PULLUP);
pinMode( pin_ENA, OUTPUT ); // Конфигурируем вывод Arduino как выход.
pinMode( pin_DIR, OUTPUT ); // Конфигурируем вывод Arduino как выход.
pinMode( pin_PUL, OUTPUT ); // Конфигурируем вывод Arduino как выход.
Serial.begin(9600);
Serial.setTimeout(50);
attachInterrupt(0, motor_stop, FALLING);
}
///////////////////////////////////////////////////////////////////////////////////////
void loop() {
if (Serial.available()) {
char data[100];
int amount = Serial.readBytesUntil(';',data,100);
data[amount]=NULL;
int32_t val = atol(data);
Serial.println(val);
motor (val,1000);
}
knopka ();
// motor (3200, 100);
}
//////////////////////////////////////////////////////////////////////////////////
void motor_stop () {
flag_stop = true;
}
/////////////////////////////////////////////////////////////////////////////////
void motor(int32_t step, uint32_t speed) { // указываем число шагов и скорость
int32_t count = 0;
uint32_t t = 1000000/speed-17; // расчет длительности импульсов. Меньше 40 мкс все равно около 45
bool p = 0;
int8_t dir= 0;
if (step >0) dir =1; // если что, поменять знаки наоборот
if (step <0) dir =0;
// Готовимся к движению вала: //
digitalWrite( pin_ENA, 0 ); // Разрешаем работу двигателя.
delayMicroseconds(5); // Выполняем задержку t1 .
digitalWrite( pin_DIR, dir ); // Выбираем направление вращения.
delayMicroseconds(5); // Выполняем задержку t2 .
// Поворачиваем вал на 2 оборота: //
tmr1.setPeriod(t); //установить период таймера для переключения с 1 на 0 на пине step
for (;;) {
if (step == 0) break;
if (tmr1.ready()){p = !p; digitalWrite( pin_PUL, p ); count++;}
if (count == abs(step*2) or flag_stop == true) {flag_stop = false; break;} //выход из цикла при достижении заданного количества шагов
}
// Останавливаем вал без удержания: //
digitalWrite( pin_ENA, 1 ); // Запрещаем работу двигателя, отключаем токи в обмотках.
delayMicroseconds(5);
}