Circuito simulador de RPM para testes de tacômetro e interrupções com ESP32

Caros amigos do laboratório de garagem.

Gostaria de deixar a minha contribuição para a comunidade com este projeto que utilizei em diversos testes de interrupção em processadores da Espressif e STMicroelectronics.


Este projeto utiliza um processador ESP32 para simular uma sequencia de pulsos equivalentes a rotações realizadas por motores elétricos ou a combustão que trabalham num range de 500 a 12.000 RPM (Rotações Por Minuto).
Este projeto cria um sinal digital similar ao emitidos pelos sensores instalados nos motores que costumam ser utilizados para controle de sua rotação. Também foi introduzido um pequeno  ruído simulado que para ajudar no desenvolvimento de uso de interrupções.

Vamos ao conceito matemático e físico:
RPM significa rotações por minuto que é a quantidade de rotações que um eixo realiza em torno de si mesmo por minuto ou 60 segundos.
Motores a combustão costumam trabalhar com 1.000 ou 1.200 RPM em velocidade lenta, assim temos um calculo de exemplo:


1.200 [RPM] / 60[s] = 20 voltas por segundo, portanto 1 volta tem um período de 50 [ms] (milissegundos) nessa rotação.
Isto significa que o motor que esta com seu eixo girando a 1200[RPM] que tenha algum sensor fixo pode emitir um pequeno sinal informando que completou uma volta a cada 50 milissegundos.

Este sinal pode ser detectado com um osciloscópio conforme exemplo a foto abaixo:

Este sinal de exemplo quando devidamente convertido para um pulso digital, é visto da seguinte forma:
O projeto visa criar o sinal acima para ser aplicado em qualquer projeto.
Para criar o circuito, precisamos da seguinte lista de componentes:

Processador ESP32
5 resistores de 2k2 ohms
Uma chave mini dip switch de 5 posições
1 LED e um resistor de 2k2 para monitorar a saída (opcional).

Pinos utilizados do processador:
Inputs digitais : 0, 1, 2, 3, 4.
Output digital: 6.

Ajuste de simulação usando código binário 2E4

// ####################### CÓDIGO DO PROGRAMA #################################

// Pulsadores
#define CDI_P1 6

// 20% de acrescimo de RPM
#define led20Percent LED_BUILTIN
// pinos de configuração

#define pin1 0
#define pin2 1
#define pin4 2
#define pin8 3
#define pinX 4

unsigned long pulso, off , RPM , ciclo, espuriaTime;
float fator;

//######################## AJUSTE DE PERIODO / RPM #####################

void vel()

{

// ajusta a quantidade simulada de rotações de acordo com o ajuste das chaves  dip switch


if (digitalRead(pin1) == LOW && digitalRead(pin2) == LOW && digitalRead(pin4) == LOW && digitalRead(pin8) == LOW) //0
{
RPM = 500;
}
else if (digitalRead(pin1) == HIGH && digitalRead(pin2) == LOW && digitalRead(pin4) == LOW && digitalRead(pin8) == LOW) //0
{
RPM = 1000;
}
else if (digitalRead(pin1) == LOW && digitalRead(pin2) == HIGH && digitalRead(pin4) == LOW && digitalRead(pin8) == LOW) //0
{
RPM = 2000;
}
else if (digitalRead(pin1) == HIGH && digitalRead(pin2) == HIGH && digitalRead(pin4) == LOW && digitalRead(pin8) == LOW) //0
{
RPM = 3000;
}
else if (digitalRead(pin1) == LOW && digitalRead(pin2) == LOW && digitalRead(pin4) == HIGH && digitalRead(pin8) == LOW) //0
{
RPM = 4000;
}
else if (digitalRead(pin1) == HIGH && digitalRead(pin2) == LOW && digitalRead(pin4) == HIGH && digitalRead(pin8) == LOW) //0
{
RPM = 5000;
}
else if (digitalRead(pin1) == LOW && digitalRead(pin2) == HIGH && digitalRead(pin4) == HIGH && digitalRead(pin8) == LOW) //0
{
RPM = 6000;
}
else if (digitalRead(pin1) == HIGH && digitalRead(pin2) == HIGH && digitalRead(pin4) == HIGH && digitalRead(pin8) == LOW) //0
{
RPM = 7000;
}
else if (digitalRead(pin1) == LOW && digitalRead(pin2) == LOW && digitalRead(pin4) == LOW && digitalRead(pin8) == HIGH) //0
{
RPM = 8000;
}
else if (digitalRead(pin1) == HIGH && digitalRead(pin2) == LOW && digitalRead(pin4) == LOW && digitalRead(pin8) == HIGH) //0
{
RPM = 9000;
}
else if (digitalRead(pin1) == LOW && digitalRead(pin2) == HIGH && digitalRead(pin4) == LOW && digitalRead(pin8) == HIGH) //0
{
RPM = 10000;
}
else if (digitalRead(pin1) == HIGH && digitalRead(pin2) == HIGH && digitalRead(pin4) == LOW && digitalRead(pin8) == HIGH) //0
{
RPM = 11000;
}
else if (digitalRead(pin1) == LOW && digitalRead(pin2) == LOW && digitalRead(pin4) == HIGH && digitalRead(pin8) == HIGH) //0
{
RPM = 12000;
}
else if (digitalRead(pin1) == HIGH && digitalRead(pin2) == LOW && digitalRead(pin4) == HIGH && digitalRead(pin8) == HIGH) //0
{
RPM = 13000;
}
else if (digitalRead(pin1) == LOW && digitalRead(pin2) == HIGH && digitalRead(pin4) == HIGH && digitalRead(pin8) == HIGH) //0
{
RPM = 14000;
}
else if (digitalRead(pin1) == HIGH && digitalRead(pin2) == HIGH && digitalRead(pin4) == HIGH && digitalRead(pin8) == HIGH) //0
{
RPM = 15000;
}

else
{
RPM = 0;
}

//#################ACRESCIMO DE 20% DO VALOR ESCOLHIDO NAS CHAVES
if (digitalRead(pinX) == HIGH)
{
RPM = RPM * 1.2;
digitalWrite(led20Percent, HIGH);
}
else{
digitalWrite(led20Percent, LOW);
}
}

// ##########################SETUP#########################

void setup()
{

pinMode(led20Percent, OUTPUT);
pinMode(CDI_P1, OUTPUT);
pinMode(pin1, INPUT);
pinMode(pin2, INPUT);
pinMode(pin4, INPUT);
pinMode(pin8, INPUT);
pinMode(pinX, INPUT);
espuriaTime = 33;
vel();
}

// ##########################LOOP #######################

void loop()
{
// sub rotina que define a variação de RPM
// e esta variação pode ser modificada sem necessidade de reiniciar o processador
vel();

fator = 1; // utilize este valor para corrigir o período dos pulsos caso exista imprecisão no seu processador.
ciclo = (1000000 / (RPM / 60)) * fator ;
pulso = 50 ;
off = (ciclo - (2 * pulso) - espuriaTime);

digitalWrite(CDI_P1, HIGH);
digitalWrite(led20Percent, HIGH);
delayMicroseconds(pulso);
digitalWrite(CDI_P1, LOW);
digitalWrite(led20Percent, LOW);
// ####################espurio simulado
delayMicroseconds(espuriaTime);
digitalWrite(CDI_P1, HIGH);
digitalWrite(led20Percent, HIGH);
delayMicroseconds(pulso);
digitalWrite(CDI_P1, LOW);
digitalWrite(led20Percent, LOW);
//delayMicroseconds(500);

//
delayMicroseconds(off);

}

 

Exibições: 1241

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Carlos Biazoto em 16 outubro 2021 às 18:17

Que show show Lucas!!
Quando li seu comentário, fiquei muito contente.
Toda essa documentação vai ajudar muito ao desenvolvimento de circuitos que trabalham sincronizados como as injeções eletrônicas.
Abs

Comentário de LUCAS RABELO SETUBAL BORGES em 14 outubro 2021 às 18:51

Só complementando o meu ultimo comentário....

Esta aqui alguns exemplos desses sinais sincronizados para aqueles que não esão familiarizados com o assunto:

Comentário de LUCAS RABELO SETUBAL BORGES em 14 outubro 2021 às 18:46

Boa tarde Carlos!

Meus parabéns pelo projeto, muito bom!

Isso me fez lembrar que a um tempo atrás, desenvolvi injetores de Rotação e fase para empresas que trabalham com consertos de módulos de injeção a diesel. Eram simuladores que reproduziam os sinais da roda fônica e do eixo de comando de válvulas sincronizados. Ainda tenho os Hex's da programação que fiz na época pra cada montadora ksks... 

Fiz com o mid Range  PIC12F675...

Fica a sugestão ai para desenvolvimento se ainda não fez, ou se quiser saber mais sobre esses projetos só dar um alô \0/

Att

Lucas Borges 

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço