Go Down

Topic: Programa ficando lento (Read 849 times) previous topic - next topic

tiagocamana

Galera estou com um problema, no meu código... quando adiciono uma certa programação para ler RPM o programa fica lento...

Estou tentando fazer um logger e um gerenciamento para bico suplementar no meu carro turbo...

a questão do gerenciamento do bico (pulsar) de acordo com sensor de pressão e de mistura, já esta funcionando, mas queria poder registrar todos esses dados junto com a determinada rpm...

mas no momento que coloco o código para ler a rpm o programa fica lento.

segue codigo

Code: [Select]


//----------------------------------------LER RPM---------------------------------------------------
int rev = 12;
unsigned long duration;
unsigned long rpm;

//----------------------------------------PULSADOR---------------------------------------------------
int ledPin = 13;                // LED conectado ao pino digital 13
int value = LOW;                // último valor do LED
long previousMillis = 0;        // último momento que o LED foi atualizado
long interval = 1000;           // tempo de transição entre estados (milisegundos)
int tempoinj = 100 ;
//----------------------------------------PRESAO E LAMBDA--------------------------------------------
int pressao = A0;   //defenir o pino analógico para pressao do turbo
int lambda = A1;   //define pino para leitura da sonda

int val = 0;  // criação da variável para armazenar o estado do turbo(variação:0~1024)
int val1 = 0; // criacao da variavel para armazenar o estado da sonda
//---------------------------------------------------------------------------------------------------
void setup()
{
 
  pinMode(ledPin, OUTPUT);      // configura o pino digital como saída
  Serial.begin(230400);//processo para a comunicação serial
//  pinMode(rev, INPUT);
}

  //--------------------------------------------------------------------------------------------
void loop()
{
//--------------------------------------LER RPM---------------------------------------------------
[color=red]
[b]Serial.print("RPM: ");
Serial.println(rpm);
duration = pulseIn(rev, HIGH);
rpm = 30000000 / duration;[/b][/color]
   
  //----------------------------------------------------------------------------------------------
 val = analogRead(pressao); //linha de código para armazenar os valores obtidos do potênciómetro da variável "Val"

  val = map(val,0,1023,0,101.5);
  val = (val * 0.068948) - 1.03 ;
 // Serial.print("Pressao Turbo : ");
//  Serial.println(val);//envia o valor armazenado na variável "val" para a porta serial
// Para ler a pressao do turbo

  val1 = analogRead(lambda); //linha de código para armazenar os valores obtidos do potênciómetro da variável "Val"
  val1 = map(val1,0,204.6,1,1000);
 //Serial.print("Sonda Lambda : ");
 //Serial.println(val1);//envia o valor armazenado na variável "val" para a porta serial
  // Para ler a sonda



  if (val1 <= 100 ) {
   tempoinj = 5 ;
  }else if(val1 <= 200) {
   tempoinj = 10 ;
 }else if(val1 <= 300) {
   tempoinj = 15 ;
 }else if(val1 <= 400) {
   tempoinj = 20 ;
 }else if(val1 <= 500) {
   tempoinj = 25 ;
 }else if(val1 <= 600) {
   tempoinj = 30 ;
 }else if(val1 <= 700) {
   tempoinj = 35 ;
 }else if(val1 <= 800) {
   tempoinj = 40 ;
 }else if(val1 <= 900) {
   tempoinj = 45 ;
 }else if(val1 <= 1000) {
   tempoinj = 50 ;
 }else{
  value = HIGH;
 }

interval = tempoinj ;
Serial.print("Tempo de inj : ");
    Serial.println(tempoinj);


  if (millis() - previousMillis > interval) {
    previousMillis = millis();   // lembre-se do último tempo que piscamos o LED

    // se o LED está apagado, acenda-o e vice-versa.
    if (value == LOW)
      value = HIGH;
    else
      value = LOW;

    digitalWrite(ledPin, value);

  }
  }

bubulindo

Se dissesses que parte do código é que torna o programa lento seria bastante mais simples de te ajudar.

Dito isto, se leres a explicação da função PulseIn(), possivelmente terás a tua resposta. Fica aqui o link:

https://www.arduino.cc/en/Reference/pulseIn

Qual é a frequência do sinal de RPM??
This... is a hobby.

tiagocamana

#2
May 15, 2017, 06:10 pm Last Edit: May 15, 2017, 06:17 pm by tiagocamana
Se dissesses que parte do código é que torna o programa lento seria bastante mais simples de te ajudar.

Dito isto, se leres a explicação da função PulseIn(), possivelmente terás a tua resposta. Fica aqui o link:

https://www.arduino.cc/en/Reference/pulseIn

Qual é a frequência do sinal de RPM??
opa... coloquei em negrito e vermelho a parte do código mais não foi,

a parte do codigo q coloco e o programa fica lento e essa


Serial.print("RPM: ");
Serial.println(rpm);
duration = pulseIn(rev, HIGH);
rpm = 30000000 / duration;


q é a que faz medição da rpm , esses programa eu tirei da internet
a frenquencia e entre 30 hz e 500 hz variando conforme a rpm do motor

bubulindo

O que faz a medição é a função pulseIn()... E essa instrução fica à espera de ver um pulso antes de iniciar. Certamente que à medida que a frequência aumenta, o programa vai ficar mais rápido porque a função pulseIn() bloqueia.

Outra coisa a teres em conta é como tens ligado o sensor de rpm... que sensor é e como está ligado??
This... is a hobby.

tiagocamana

estou pegando o pulso negativo da bobina(12v) ligado a um fotoacoplador 4n25.

ela gera um pulso na lenta 33 hz,

encontrei outro codigo para ler a frequencia

Code: [Select]
// Frequency counter sketch, for measuring frequencies low enough to execute an interrupt for each cycle
// Connect the frequency source to the INT0 pin (digital pin 2 on an Arduino Uno)

volatile unsigned long firstPulseTime;
volatile unsigned long lastPulseTime;
volatile unsigned long numPulses;

void isr()
{
 unsigned long now = micros();
 if (numPulses == 1)
 {
   firstPulseTime = now;
 }
 else
 {
   lastPulseTime = now;
 }
 ++numPulses;
}

void setup()
{
 Serial.begin(230400);    // this is here so that we can print the result

}

// Measure the frequency over the specified sample time in milliseconds, returning the frequency in Hz
float readFrequency(unsigned int sampleTime)
{
 numPulses = 0;                      // prime the system to start a new reading
 attachInterrupt(0, isr, RISING);    // enable the interrupt
 delay(sampleTime);
 detachInterrupt(0);
 return (numPulses < 3) ? 0 : (1000000.0 * (float)(numPulses - 2))/(float)(lastPulseTime - firstPulseTime);
}

void loop()
{
 float freq = readFrequency(1000);
 Serial.println(freq,3);

}


ele le corretamente a frequência mas com uma taxa de atualização muito lenta, e ainda sim quando jogo ele para o programa de pulsar o bico, ele acaba ficando lento

bubulindo

Esse código lê a frequência de segundo a segundo... se te desses ao trabalho de perceber o que faz o 1000 na chamada da função readFrequency, talvez tivesses melhorado isto um pouco.
This... is a hobby.

tiagocamana

Esse código lê a frequência de segundo a segundo... se te desses ao trabalho de perceber o que faz o 1000 na chamada da função readFrequency, talvez tivesses melhorado isto um pouco.
ja consegui diminuir ao maximo de 250, com uma boa leitura... mas mesmo assim meu programa de pulsar nao fica legal...

Grato

bubulindo

Tens de explicar o que entendes por legal...
This... is a hobby.

Go Up