Latência da Interrupção para leitura de encoder em quadratura com ESP32

Projetos de ESP32
almadajack
Novato
Mensagens: 1
Registrado em: 30/Out/2018, 20:57

Latência da Interrupção para leitura de encoder em quadratura com ESP32

Mensagem por almadajack » 12/Abr/2019, 23:32

Olá,
Eu gostaria de ler um encoder incremental de 2500 pulsos por volta em baixa velocidade e outro de 2000 pulsos a 3000 RPM, ao mesmo tempo, ambos em quadratura.
Andei pesquisando e vi que a latência (demora para reagir a um estímulo) da interrupção no ESP32 era de aproximadamente 2 microssegundos ou 480 ciclos de clock.

Fiz um experimento para verificar se um método de teste acessível, em liguagem de alto nível era muito pior que isso e constatei que a latência era a mesma.

Como um dos meus encoderes pode trabalhar a 400kHz eu fiquei preocupado com a possibilidade de perder pulsos e gostaria de saber se alguém tem/conhece uma solução de baixo nível do meu código para comparar e ver se é possível diminuir a latência.

O código usado no teste foi esse:

Código: Selecionar todos

int interruptPin = 36; //Pino que lerá a interrupção
int outPin = 32; //Pino que irá gerar o sinal a ser lido pela interrupção
int flagPin = 25; //Pino que copiará o nível do sinal lido

void leInterrupcao(){
  int estado = digitalRead(outPin);
  digitalWrite(flagPin,estado);
}

void setup() {
  pinMode(interruptPin,INPUT);
  pinMode(outPin,OUTPUT);
  pinMode(flagPin,OUTPUT);
  
  attachInterrupt(digitalPinToInterrupt(interruptPin), leInterrupcao, CHANGE);
}

void loop() {
  digitalWrite(outPin, 1);
  delayMicroseconds(10);
  digitalWrite(outPin, 0);
  delayMicroseconds(10);
}
Esse é o resultado usando uma variação do código acima que resulte numa frequência de saída de 1kHz

Imagem

E esse e o resultado usando 100kHz

Imagem

As imagens mostram a mesma latência de ~2us para as frequência de 1 e 100kHz

Então repito novamente a pergunta, alguém tem ou sabe um código de baixo nível para que eu possa testar se a latência diminui?
Obrigado.

Responder