ESP32无法处理中断引脚上的20kHz信号。
我需要计算引擎的RPM。 最大RPM为16000。曲轴的转子带有40个齿。因此每转40脉冲。 我已经对Arduino进行了编程,使其可以在低50微秒,高50微秒的循环中发送信号。
我从中断教程之一中获取了代码。我是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
}
}
预期-处理所有中断,以便我可以计算齿间的时间并计算RPM。
实际-interruptCounter总是> 1,如果我在handleInterrupt()中编写一些代码,例如计算时间,ESP32将永远重启。