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);
}

E esse e o resultado usando 100kHz

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.