Boa noite pessoal, estou com uma séria dificuldade pra desenvolver meu TCC que é um projeto de uma injeção eletrônica com arduino, basicamente estou querendo fazer a leitura do RPM, Ãngulo de posição da borboleta, e gerar um pulso PWM onde o duty cicle vai variar conforme o potenciometro da borboleta. Tenho o código que estarei inserindo abaixo que por enquanto não funciona, gostaria de ver se alguém tem alguma luz sobre o que está errado nesse código. 

/* Firmware - controleInjecaoEletronica
Renato Silva de Carvalho


Este firmware tem a finalidade de fazer o controle
da injecao de combustivel atraves do sensoriamento
da rotacao e sensor de posicao da borboleta
*/

#include <LiquidCrystal.h>


LiquidCrystal lcd(13,12,11,10,9,8);


// Variaveis

int injetor = 6;
int borboleta = A0;
int janela = 0;
float Borboleta;
float tps; //Variavel para receber a variação da posição da borboleta
const long int periodo = 500000; // definindo o periodo
unsigned long voltaVolante = 0; // Rotacao do motor
unsigned long time = 0; // Tempo total
unsigned long tempRotMot = 0 ;
unsigned long ti = 0 ;
unsigned long tioff = 0 ;


void rotacaoMotorInterrupt()
{
long aux = 0;
time = millis(); //mili S
aux = time - voltaVolante; // diferença entre o tempos
voltaVolante = time;
tempRotMot = aux;
}

void setup ()

{

lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("INJ ELETRONICA");

pinMode (injetor, OUTPUT);

delay (2000);

attachInterrupt(0, rotacaoMotorInterrupt, RISING); // Interrupcao na saida da porta 2 (0 = a porta 2)


}

void loop ()

{

Borboleta = analogRead(borboleta);

// map it to the range of the analog out:
tps = map(Borboleta, 0, 1023, 0, 90);

janela = ((1/(tempRotMot/60))* 1000);

// vai iniciar um duty cicle minimo de 5% da janela
// somando a porcentagem de 0 a 90% que sera referente ao
// angulo de aceleracao

ti = ( (janela * 0.05) + ((janela * tps) / 100) );
tioff = (janela - ti);

// acionamento do Injetor

digitalWrite (injetor, HIGH);
delay (ti);
digitalWrite (injetor, LOW);
delay (tioff);

}

void telaLcd()
{

lcd.setCursor(0, 0);
lcd.print("PER.:");
lcd.print(janela);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("TPS:");
lcd.print(tps);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print("RPM:");
lcd.print(tempRotMot);
lcd.print(" ");

}

Exibições: 10104

Responder esta

Respostas a este tópico

    É necessário que eu utilize dois arduinos, no mesmo arduino não é possível fazer a leitura da rotação e a geração do pwm ajustável?

Oi RSC.

Acho que é possível sim.

Estou tentando aqui.

Você quer gerar um pulso com largura variável. Correto?

A largura será definida por um potenciômetro, e o pulso será iniciado por

um pulso vindo de um distribuidor?

E quem fornece o pulso para a medida da RPM?

Rui

Grande Rui, acho que sou perfeccionista ! he he
Veja a sua lista com as variações ( as que eu disse que o Arduino produz ) .

33,33 x 60 = 1999,8 rpm
33,50 x 60 = 2010 rpm

Como eu já disse, pode fazer uma gambiarra, e usar a média das leituras e provavelmente conseguirá encontrar os 2000 rpm.

Essa precisão não atende ao meu objetivo...
Valeu pela força,
Abraços

Gustavo

Jose Gustavo de acordo com o clock interno do arduino(digo AVR) precisão ele tem! O ploblema é o sincronismo entre uma medição e outra, pois qualquer pulso a mais ou a menos vai te dar a sensação de não servir para seu propósito. Creio que um código bem elaborado possa nos surpreender.

Aquele exemplo de tacômetro onde o arduino conta os pulsos atraves de uma borda de subida gerando uma interrupção externa, não é uma boa prática. O ideal é utilizar o modo contador. E um contador de 16bits tem uma boa resolução!

Não quero contrariar seu ponto de vista. este é apenas o meu.

Jonas , já testei vários sketches. modifquei alguns. 

Já usei a função micros() , timers, prescalers,  pulseIN , interrupções, etc. 

Li, acho que no Datasheet do ATmega 328, que o processador pode perder alguns pulsos de clock, ao capturar os dados dos Timers. Acho que é isso que prejudica na precisão da contagem de tempo. 

O que eu pretendo fazer é um tacometro de precisão para Motores de passo. 

Se motor gira a 2000 RPM. quero que o tacomentro leia 2000, para mim não serve 1999 ou 2001. 

Obrigado. 

Renato , leia e entenda esse tópico  no forum Arduino :

http://forum.arduino.cc/index.php?topic=186375.0

Speed of an Arduino (Uno) for fuel injection system

Essa é a questão ! Um Arduino aguenta o processamento de uma injeção eletrônica (fuel injection) ??

No meu humilde conhecimento de injeção eletrônica (autodidata) , um atraso de alguns milisegundos no controle dos pistãos poderá fazer perder potência ou até explodir o seu motor ( pensando em altos RPMs como 4000, 5000, 6000, etc) 

Alguns já conseguiram com Arduino, mas para motores estacionários com baixa rotação:

Oi RSC,

veja se este code atende sua necessidade, se não,  modifique ele para atender.

Rui

Anexos

  Rui, o código parece bastante consistente, mas simulei aqui no isis e não funcionou a saída do PWM, vou continuar tentando. Obrigado.

 

   Um detalhe que eu iria te falar é que o sinal para leitura de rotação é o mesmo que será sincronizado ao PWM de saída. 

OI JGAM, bom dia.

Veja agora este resultado na imagem abaixo.

Não imaginei que você precisava de um desvio tão pequeno.

O desvio anteior (33,33 x 60 = 1999,8 rpm, 33,50 x 60 = 2010 rpm ) era da

ordem de 0,5% ou  5%%.

Este agora é da ordem de 0,05% ou 0,5%%.

Mas analisando com detalhes ainda fico n a duvida se o valor nã é mais preciso,

pois esta variação de 1 pulso pode ser ocasionada pela falta de sincronismo entre o

tempo de sample e o tempo que ocorre o pulso externo.

Ou ainda que o PWM gerado estar entre 2004 e 2005 Hz.

Eu usei como gerador um arduino Due, 

Se acha o uso de Timer complexo, verá que é muito mais complexo ao usar em um

arduino DUE

Rui

Rui bom dia. Qual sketch usou ? Pode disponibiliza-lo ? Obrigado 

esse sincronismo deve-se ao fato de que a hora do pulso injetor tem de ser no momento exato (momento da admissão) que é monitorado através de um sensor de posição do virabequim (sim, o mesmo da RPM). semana passada meu carro folgou o parafuso que prende esta peça(um disco dentado ,com um dente faltando, mas não é exatamente faltado , apenas diferenciado. Este informa a posicão do virabrequim). Isto bagunçou a injeção. O carro ficou sem força, mas tão fraco que não aguentava o ar condicionado(acredite, tive de mante-lo desligado pra poder chegar em casa). Daí achei que fosse problema interno no motor, fiquei triste porque já havia feito o motor no inicio do ano. Quando levei na oficina bastou recolocar a peça na posição correta e ficou bom novamente e eu suspirei profundamente.

Este controle que vc pretende implementar não é tão complicado assim, apenas pense num dimmer pois o que vc quer é a mesma coisa!

dimmer = aumentando a largura do pulso aumenta a potência.

estude os exemplos de dimmers com arduino.

espero ter ajudado.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço