ESP32 20kHz信号中断问题

时间:2019-01-19 13:26:27

标签: interrupt arduino-ide esp32

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将永远重启。

0 个答案:

没有答案