Проблема прерывания ESP32 с сигналом 20 кГц - PullRequest
0 голосов
/ 19 января 2019

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 перезапустится навсегда.

...