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(" ");
}
Tags:
É 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
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.
Renato bom dia ,
O uso dos Timers do ATmega 328 é um dos temas mais complexos para se entender no Arduino.
Tive que estudar bastante e fazer vários testes para começar a entende-lo.
Esses tutoriais me ajudaram bastante :
Sobre Timers:
http://www.embarcados.com.br/timers-do-atmega328-no-arduino/
https://arduino-info.wikispaces.com/Timers-Arduino
http://sphinx.mythic-beasts.com/~markt/ATmega-timers.html
http://letsmakerobots.com/node/28278
https://oscarliang.com/arduino-timer-and-interrupt-tutorial/
Sobre PWM:
https://arduino-info.wikispaces.com/PWM
https://arduino-info.wikispaces.com/Arduino-PWM-Frequency
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por