uint32_t count = 0; //счетчик
int32_t t_count = 0; //целевое количество шагов
uint32_t cnt = 0;
bool flag = false;
bool k = 0;
bool kl =1 ;
uint32_t clk=0;
bool p=0;
uint32_t myTimer; // переменная времени
uint32_t f;
uint32_t t; // Определяем длительность импульсов
const uint8_t pin_ENA = 6; // Вывод Arduino подключённый к входу драйвера ENA+.
const uint8_t pin_DIR = 4; // Вывод Arduino подключённый к входу драйвера DIR+.
const uint8_t pin_PUL = 9; // Вывод Arduino подключённый к входу драйвера PUL+.
///////////////////////////////// класс на таймер //////////////////////////////////////
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 setup() {
Serial.begin(9600);
pinMode(8, INPUT);
pinMode( pin_ENA, OUTPUT ); // Конфигурируем вывод Arduino как выход.
pinMode( pin_DIR, OUTPUT ); // Конфигурируем вывод Arduino как выход.
pinMode( pin_PUL, OUTPUT ); // Конфигурируем вывод Arduino как выход.
Serial.println("Start");
delay(500);
//motor(100000, 10000);
}
void loop() {
if (Serial.available()>0) {
char data[30];
int amount = Serial.readBytesUntil(';',data,30);
data[amount]=NULL;
uint32_t val = atol(data);
Serial.println(val);
motor (100, val);}
if (abs(count) < t_count) {
if (tmr1.ready()) {
motor_step ();}
}
proverka();
}
/////////////////////////////////////////////////////////////////////////////////////////////
void motor_step () {
p = !p; digitalWrite( pin_PUL, p ); count++;
}
void motor (int32_t shag, uint32_t speed) {
tmr1.setPeriod (1000000/speed);
t_count = shag;
f = speed;
count = 0;
cnt =0;
clk = 0;
flag = true;
p=0;
}
void proverka () {
if (flag == true ){
k = digitalRead(8);
if (k==kl) {cnt++; kl=!kl; // Serial.println(count);
}
if (count == t_count) {flag = false; Serial.print("шаги ="); Serial.print(cnt); Serial.print(" мс: "); Serial.print(clk); Serial.println("");}
if (millis() - myTimer >= 1) {
myTimer = millis(); // сбросить таймер
clk ++; // вкл/выкл
// Serial.println(count);
}
}
}