From 91c9e5209356ce1f710638f431b0b2c3641708d2 Mon Sep 17 00:00:00 2001 From: AlexGyver Date: Tue, 17 Nov 2020 14:32:46 +0300 Subject: [PATCH] Update Tacho.h --- minimLibs/tachometer/Tacho.h | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/minimLibs/tachometer/Tacho.h b/minimLibs/tachometer/Tacho.h index 694af26..0990a0c 100644 --- a/minimLibs/tachometer/Tacho.h +++ b/minimLibs/tachometer/Tacho.h @@ -3,7 +3,9 @@ // класс тахометра v1.1 // встроенный медианный фильтр // вызывай tick() в прерывании по фронту -// забирай getRPM() в оборотах в минуту и getHz() - в Герцах +// забирай getRPM() частоту в оборотах в минуту +// забирай getHz() частоту в Герцах +// забирай getPeriod() период в мкс #define _TACHO_TICKS_AMOUNT 10 // количество тиков для счёта времени #define _TACHO_TIMEOUT 1000000 // таймаут прерываний (мкс), после которого считаем что вращение прекратилось @@ -11,9 +13,8 @@ class Tacho { public: void tick() { // tachoTime - время в мкс каждых _TACHO_TICKS_AMOUNT тиков - ticks++; - if (ticks == _TACHO_TICKS_AMOUNT) { - ticks = 0; + if (!ticks--) { + ticks = _TACHO_TICKS_AMOUNT - 1; tachoTime = micros() - tachoTimer; tachoTimer += tachoTime; //== tachoTimer = micros(); ready = true; @@ -23,7 +24,7 @@ class Tacho { uint16_t getRPM() { if (ready) { // если готовы новые данные ready = false; - if (tachoTime != 0) rpm = 60ul * _TACHO_TICKS_AMOUNT * 1000000 / median3(tachoTime); + if (tachoTime != 0) rpm = (uint32_t)_TACHO_TICKS_AMOUNT * 60000000 / median3(tachoTime); } if (micros() - tachoTimer > _TACHO_TIMEOUT) rpm = 0; return rpm; @@ -38,6 +39,10 @@ class Tacho { return hz; } + uint32_t getPeriod() { + return median3(tachoTime); + } + private: // быстрая медиана long median3(long value) { @@ -54,7 +59,7 @@ class Tacho { volatile uint32_t tachoTimer = micros(); volatile int ticks = 0; volatile bool ready = false; - long buf[3] = {100000, 100000, 100000}; // для плавного старта значений + uint32_t buf[3] = {100000, 100000, 100000}; // для плавного старта значений byte counter = 0; int rpm = 0; float hz = 0.0;