Двухканальный тахометр (ESP8266 + Gyver Tachometr). Как убрать помехи?

-=FISHER=-

✩✩✩✩✩✩✩
14 Май 2023
12
1
Всем привет!

Передо мной встала задача отслеживать обороты двигателя и скорость в автомобиле (по сути измерять частоту сигнала), чтобы среагировать на их превышение (типа Shift Light и Speed Limit). Проект на адресных светодиодах с настройкой через Wi-Fi, поэтому я использую ESP8266 и библиотеку "Tachometr" от Алекса Гайвера. Она очень быстро и очень точно измеряет частоту сигнала, как на столе (когда сигнал приходит от генератора частоты), так и в автомобиле. Однако, присутствуют ложные срабатывания функции превышения оборотов и скорости, в момент включения мощной нагрузки в автомобиле (центральный замок, дворники и т п). Я предполагаю что это происходит из-за помех по питанию. Ниже я приведу схему, а так же фрагмент кода.

Внимание вопрос: правильно ли я понимаю природу ложных срабатываний и как в таком случае избавиться от помех?

Тах и спид.JPG

Код:
//      НАСТРОЙКИ ТАЙМЕРА
    
#include <TimerMs.h>                            // подключаем библиотеку таймера от Алекса Гайвера

TimerMs main_tmr(1, 1, 0);                    // создаём объект таймера (период, 1 мс), (0 не запущен / 1 запущен), (режим: 0 период / 1 таймер)

//      НАСТРОЙКИ ТАХОМЕТРА

#include <Tachometer.h>                        // подключаем библиотеку тахометра от Алекса Гайвера
Tachometer tacho;                                   // создаём объект тахометра
Tachometer speed;                                  // создаём объект спидометра

void ICACHE_RAM_ATTR tach_isr();     // объявляем функцию-обработчик прерывания тахометра
void ICACHE_RAM_ATTR speed_isr();  // объявляем функцию-обработчик прерывания спидометра

#define TACH_PIN 5                                // пин тахометра
#define SPEED_PIN 4                              // пин тахометра

void tach_isr()
{
    tacho.tick();                                          // вызываем тикер тахометра в прерывнии
}

void speed_isr()
{
    speed.tick();                                        // вызываем тикер спидометра в прерывнии
}   

void main_tmr_func()                            // функция основного таймера
{
    if((tacho.getHz() > 100)&&(tacho.getHz() < 290))  // если значение оборотов превысило установленное значение
    {
        // среагируем на это
    }
    else                                              // если значение оборотов вернулось в нормальные границы
    {
        // среагируем на это
    }
    
    if((speed.getHz() > 150)&&(speed.getHz() < 350))  // если значение скорости превысило установленное значение
    {
        // среагируем на это
    }
    else                                              // если значение скорости вернулось в нормальные границы
    {
        // среагируем на это
    }
}

void setup()
{

    attachInterrupt(TACH_PIN, tach_isr, FALLING);        // подключаем прерывание для чтения оборотов двигателя
    attachInterrupt(SPEED_PIN, speed_isr, FALLING);   // подключаем прерывание для чтения скорости автомобиля
    
    main_tmr.attach(&main_tmr_func);                            // подключаем функцию-обработчик события таймера
}

void loop()
{
    main_tmr.tick();        // обработка тиканья главного таймера
}
 

Сотнег

★★★★★★★
15 Янв 2020
4,261
1,468
@-=FISHER=-,
видимо, будет достаточно просто не реагировать на краткосрочное превышение.
Измерьте длительность ошибочных сигналов и добавьте паузу и повторную проверку.
Или лучше повторные проверки на время ложных сигналов без паузы.
 

-=FISHER=-

✩✩✩✩✩✩✩
14 Май 2023
12
1
видимо, будет достаточно просто не реагировать на краткосрочное превышение.
Как же я сразу не догадался! Большое спасибо, буду пробовать - по результату отпишусь.

@Boroda22, кондёры по питанию 3.3 В ? Честно признаться никак, просто поставил как обычно.
 

-=FISHER=-

✩✩✩✩✩✩✩
14 Май 2023
12
1
про фильтрацию сигналов
Я пробовал некоторые из этих фильтров, они сильно замедляют время чтения сигнала...

Вот тут подробно расписано про фильтрацию сигналов.
Подскажите пожалуйста, в каких единицах задаётся "скорость изменения значения" ?

Фильтр Калмана:
// ============== Упрощённый Калман ==============
GKalman(float mea_e, float est_e, float q);
// разброс измерения, разброс оценки, скорость изменения значений
 

-=FISHER=-

✩✩✩✩✩✩✩
14 Май 2023
12
1
Измерьте длительность ошибочных сигналов и добавьте паузу и повторную проверку.
Я сделал следующее:
1. Если пришло значение частоты в нужном диапазоне;
2. Проверяю ещё несколько раз в течении примерно 0.3 сек;
3. Если за это время частота уверенно держится в этом диапазоне и не падает - принимаю решение что сигнал верный, а не помеха.

Этот подход убрал значительную часть ложных срабатываний, но всё же ложные срабатывания всё ещё случаются. Это очень странно, но к примеру вчера когда я заглушил машину и стрелка скорости была на нуле, вдруг сработало предупреждение о превышении частоты от датчика скорости. Длительность сигнала была примерно 0.3-0.5 секунды.

В связи с этим мне пришла в голову идея проверять как бы прогнозируемое значение частоты. Допустим измерять частоту и постоянно сравнивать её с предыдущим значением, и если предположим новое значение отличается от предыдущего более чем на 10 Гц то считать эти показания ложными, так как они нереалистичны и скорее всего это помеха.

Как вы думаете, такой подход имеет место быть?
 

Сотнег

★★★★★★★
15 Янв 2020
4,261
1,468
@-=FISHER=-,
методом тыка многое можно нафильтровать.
Но правильнее будет записать показания и посмотреть, чем отличаются ложные от корректных.
Может быть, обороты по показаниям вообще пробивают потолок реальности и совершенно не похожи на те, что способен выдать двигатель в свои лучшие годы?
 

-=FISHER=-

✩✩✩✩✩✩✩
14 Май 2023
12
1
Может быть, обороты по показаниям вообще пробивают потолок реальности и совершенно не похожи на те, что способен выдать двигатель в свои лучшие годы?
У меня стоит ограничение по измерению. То есть предупреждение срабатывает когда частота попадает в определённые границы. По оборотам например от 150 до 350 Гц

Но правильнее будет записать показания и посмотреть, чем отличаются ложные от корректных.
Ничем, кроме того что они происходят не во время. Стрелка на спидометре например показывет 40 км/ч, включается мощная нагрузка и зажигается предупреждение о превышении. Ну с этим я думаю что решил проблему, повторными проверками, на удержание стабильного превышения частоты, а не кратковременного всплеска.