ESP32 не может обрабатывать сигнал 20 кГц на выводе прерывания.
Мне нужно рассчитать обороты двигателя.
Максимальное число оборотов в минуту составляет 16000. Коленчатый вал имеет ротор с 40 зубцами. Итак, 40 импульсов за оборот.
Я запрограммировал Arduino для отправки сигнала в цикле 50 микросекунд LOW, 50 микросекунд HIGH.
Я взял код из одного из учебных пособий по прерываниям. Я новичок в ESP32
Странно, что весь код с добавленным подсчетом времени для пропущенного зуба, работающего на Arduino, работает хорошо, и на гораздо более быстром ESP32 он дает сбой. Почему?
const byte interruptPin = 25;
volatile int interruptCounter = 0; // unhandled interrupts
int numberOfInterrupts = 0; // number of total interrupts
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
void IRAM_ATTR handleInterrupt() {
portENTER_CRITICAL_ISR(&mux);
interruptCounter++;
portEXIT_CRITICAL_ISR(&mux);
}
void setup() {
Serial.begin(115200);
Serial.println("Monitoring interrupts: ");
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, RISING);
}
void loop() {
if(interruptCounter>0){ // if there is unhandled interrupts
portENTER_CRITICAL(&mux);
interruptCounter--; // decrease unhandled counter
portEXIT_CRITICAL(&mux);
numberOfInterrupts++;
Serial.print("Total: "); Serial.print(numberOfInterrupts);
Serial.print("now: "); Serial.println(interruptCounter);
}
else {
Serial.println("all handled"); // never riched
}
}
Ожидается - все прерывания обрабатываются, так что я могу рассчитывать время между зубами и вычислять обороты.
Actual - interruptCounter всегда> 1, если я напишу некоторый код в handleInterrupt (), например, для расчета времени, ESP32 перезапустится навсегда.