"Ошибка медитации гуру: Ядро 1 запаниковало (загрузка запрещена)." Сам так же в панике )))

ну да если датчик тормознуть. то перезагружаться не будет )))

Зачем используешь float, если целевая переменная имеет тип int? Что вообще там происходит поясни своими словами.
Мало того что инт, так еще и в прерывании (на сколько я понял) используется. Почему не volatile?
Измени на volatile float RPM для интереса. И скажи какое значение выдаёт.

Частоту генерирует NE555 вместо магнитного датчика Холла и меньше 50Гц не подстроить по данной схеме так как резистор и ёмкости подогнаны под 1-1,5 КГц. При 55 Гц самое меньшее и 2.8 КГц самое большое ошибка та же. Если пин считывания отвязать то счёт 0 и без ошибок.)))В “холостую” работает )))

надо через PCNT_UNIT_0 делать и это почитать

Вычисление частоты зная за какое время случилось прерывание.
Прочитав про прерывание на esp подумал что через инт не существенно изменит что то. Значит надо ещё не раз и по внимательнее изучить)). Дело было во второй половине пятницы и на работе. Все галопом)))
Интересные идеи - придется выйти на работу завтра и испытать)))

Это не идеи, это здравый смысл. Скорее всего у вас там ноль будет получаться при любом раскладе. Но проделайте мой эксперимент, чтобы подтвердить или развенчать мои домыслы.

ты очень долго висишь в прерывании, если к примеру будешь присваивать переменной значение микрос валится перестанет )))

Знаю про мультизадачность но пришел с ардуино и не сталкивался. Думал что это касается только при больших вычислениях а не в обработке функции по времени.

Подозревал про это но не сильно был уверен в правдивость этой версии и по этому не поднимал частоту до МГц-ных значений для проверки.

Нет никакой разницы с ардуино или нет, в прерывании любого мк происходит примерно тоже самое. Я не сильный специалист по прерываниям, но ничего критичного там не вижу. Хоть и операции с плавающей точкой достаточно энергоемкие (в плане процессорного времени) они должны нормально там отрабатывать (укладываться в допуск прерывания). Проделайте эксперимент и будет наглядно видно.

Все варианты будут использованы и испробованы.

Не узнаем истину пока не подтвердим на практике.
Всем хорошего пятничного вечера!

А паника ядра то ушла при данном коде или нет?

ладно, держи идею, математику сам поправишь:

volatile int lastflash[10];
float RPM;
bool flag_isr = false;
int counter;

void Isr() {
  if (!flag_isr) {
    lastflash[counter] = micros();
    counter++;
    if (counter == 9) {
      flag_isr = true;
      counter = 0;
    }
  }
}



  void setup() {
    Serial.begin(115200);
    pinMode(13, OUTPUT);
    attachInterrupt(12, Isr, RISING);
    digitalWrite(13, HIGH);
  }


  void loop() {
    if ((micros() - lastflash[9]) > 1000000) {
      RPM = 0;
    }

    
    if (flag_isr) {
      RPM = 60 / ((float)(lastflash[8] - lastflash[7]) / 1000000);
      flag_isr = false;
    }

    Serial.println(RPM);
    delay(1000);
  }

100 герц

6000.00
5999.40
5999.40
5999.40
6000.00
6000.00
6000.00
6000.00
5999.40
5999.40
5999.40
5999.40
6000.00
6000.00
6000.00
6000.00
5999.40

ТС, дорогой! У тебя если контроллер живой и это не “харваре проблем”, то единственная ошибка - отсутствие атрибута у обработчика прерывания.
Вот что пишет ЧатЖПТ:
ПРОМПТ

дай мне пример правильного использования прерывания по фронту сигнала для МК ESP32 в среде Ардуино. С нужным атрибутом у обработчика.

ОТВЕТ

Для использования прерывания по фронту сигнала на ESP32 в среде Arduino можно использовать функцию attachInterrupt(). Обработчик прерывания для ESP32 должен быть помечен атрибутом IRAM_ATTR, чтобы быть доступным в области памяти, которая позволяет его выполнение из прерывания.

Пример кода:

volatile bool interruptFlag = false; // Флаг для обработки прерывания

// Обработчик прерывания
void IRAM_ATTR onInterrupt() {
    interruptFlag = true; // Устанавливаем флаг в обработчике
}

void setup() {
    Serial.begin(115200);

    pinMode(15, INPUT_PULLUP); // Настраиваем пин 15 как вход с подтяжкой
    attachInterrupt(digitalPinToInterrupt(15), onInterrupt, RISING); // Прерывание по фронту (RISING)
}

void loop() {
    if (interruptFlag) { // Проверяем флаг
        interruptFlag = false; // Сбрасываем флаг
        Serial.println("Прерывание сработало!");
    }
}

Пояснения:

  1. Обработчик с атрибутом IRAM_ATTR:
    • Этот атрибут указывает компилятору разместить функцию в памяти SRAM, так как обработчики прерываний на ESP32 не могут вызываться из флеш-памяти.
  2. Использование флага interruptFlag:
    • Прямую обработку сложной логики в прерываниях лучше избегать. Вместо этого обработчик устанавливает флаг, который проверяется и обрабатывается в основном цикле (loop).
  3. Функция attachInterrupt:
    • Она связывает обработчик с конкретным GPIO и типом события (в данном случае — фронт RISING).

Если нужны дополнительные пояснения, дай знать! :blush:

1000 -:- 1500 уже моросит

60000.00
60000.00
60000.00
60000.00
60000.00
60000.00
60000.00
60000.00
60000.00
84033.61
90090.09
89955.02
89955.02
90090.09
89955.02
89955.02
90090.09
89955.02
90090.09
89955.02
89955.02
89955.02
89955.02
90090.09

Была же тема не так давно
https://forum.arduino.ru/t/kak-rabotaet-enkoder/15234/128
см#128 и #131. Т .е. работать будет, но медленно

float использовал так как считал с аналогового входа.
Значений нет, только ошибка.

А какая связь?

А датчику нужно минимум 4.5в