bool flag = false; // для кнопки
uint32_t btnTimer = 0;
const uint8_t knop=2;
uint32_t count = 0; //счетчик
int32_t t_count = 0; //целевое количество шагов
uint32_t cnt = 0;
const float a1 = 7.7591e-6; //у = a1*x2 + a2*x + a3
const float a2 = 1.2526; // для корректировки реальной частоты надо задовать то что хочется иметь
const float a3 = -3.073e2; // и считать y, который задавать
float x;
uint32_t y;
bool k = 0;
bool kl =1 ;
bool flg = true;
uint32_t clk=0;
bool p=0;
uint32_t myTimer; // переменная времени
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;
Timer tmr2 (500);
/////////////////////////////////////////////////////////////////////////////////////
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);
digitalWrite( pin_ENA, 0 ); // Разрешаем работу двигателя
}
///////////////////////////////////////////////////////////////////////////////////////
void loop() {
if (Serial.available()) {
char data[100];
int amount = Serial.readBytesUntil(';',data,100);
data[amount]=NULL;
uint32_t val = atol(data);
Serial.println(val);
motor_start (2*val,20000);
}
knopka ();
motor();
if(count == t_count and count !=0 and flg ==true) {flg = false; Serial.print("count = "); Serial.println(count);
uint32_t tt = millis()- myTimer; Serial.println(tt); Serial.print("w= "); Serial.print((float) count/tt/2*1000);
}
/*
if (count< t_count) {sekundomer ();
if (tmr2.ready()) {
Serial.println(count/2/clk*1000);
;}
}
*/
}
////////////////////////////////////////////////////////////////////////////////
void motor (){
if (abs(count) < t_count and flag_stop ==false) {
if (tmr1.ready()) {
motor_step ();}
}
}
//////////////////////////////////////////////////////////////////////////////////
void motor_stop () {
flag_stop = true;
}
/////////////////////////////////////////////////////////////////////////////////
void motor_step () {
p = !p; digitalWrite( pin_PUL, p ); count++;
}
////////////////////////////////////////////////////////////////////////////
void motor_start (int32_t shag, uint32_t speed) {
// y = a1*speed*speed+a2*speed+a3;
x = 1000000/speed/2;
Serial.println(x);
tmr1.setPeriod (x);
t_count = shag;
count = 0;
cnt =0;
clk = 0;
p=0;
flag_stop = false;
myTimer = millis();
flg = true;
}
///////////////////////////////////////////////////////////////////////////////
void sekundomer (){
if (millis() - myTimer >= 1) {
myTimer = millis(); // сбросить таймер
clk ++; // вкл/выкл
// Serial.println(count);
}
}
////////////////////////////////////////////////////////////////////////////
void digitalWriteFast(uint8_t pin, bool x) {
/* // раскомментируй, чтобы отключать таймер<br class="darkmysite_style_txt_border darkmysite_processed" data-darkmysite_alpha_bg="rgba(0, 0, 0, 0)"> /*switch (pin) {
case 3: bitClear(TCCR2A, COM2B1);
break;
case 5: bitClear(TCCR0A, COM0B1);
break;
case 6: bitClear(TCCR0A, COM0A1);
break;
case 9: bitClear(TCCR1A, COM1A1);
break;
case 10: bitClear(TCCR1A, COM1B1);
break;
case 11: bitClear(TCCR2A, COM2A1); // PWM disable
break;
}*/
if (pin < 8) {
bitWrite(PORTD, pin, x);
} else if (pin < 14) {
bitWrite(PORTB, (pin - 8), x);
} else if (pin < 20) {
bitWrite(PORTC, (pin - 14), x); // Set pin to HIGH / LOW
}
}