Go Down

Topic: Ayuda! Calcular revoluciones de un motor de combustion con Simulink (Read 5073 times) previous topic - next topic

J_DRM

Buenas tardes a todos,

Estoy tratando de calcular las revoluciones de giro de un motor de combustión con un modelo de Simulink, que gira hasta 11.000 revoluciones.

La señal de entrada que recibe el arduino es un pulso por revolución. Hasta ahí todo bien, pero el problema viene a la hora de hacer un modelo para calcular el periodo entre dos pulsos, o la frecuencia. Para poder así calcular las revoluciones a las que gira el motor.

¿Alguien podría darme alguna pista de por donde tirar?

Muchas gracias de antemano !!!



vffgaston

Quote
Buenas tardes a todos,

Estoy tratando de calcular las revoluciones de giro de un motor de combustión con un modelo de Simulink, que gira hasta 11.000 revoluciones.

La señal de entrada que recibe el arduino es un pulso por revolución. Hasta ahí todo bien, pero el problema viene a la hora de hacer un modelo para calcular el periodo entre dos pulsos, o la frecuencia. Para poder así calcular las revoluciones a las que gira el motor.

¿Alguien podría darme alguna pista de por donde tirar?

Muchas gracias de antemano !!!


A ver, hombre, alguna pista más:

¿Lo tienes ya conectado al arduino?

¿Cómo sabes que ya tienes la señal detectada?

Si lo tienes postea el código.

Saludos

surbyte


J_DRM

Veamos por donde empiezo...

No he usado la señal del cigüeñal en este modelo,  pero ya he comprobado con el osciloscopio en Real Time que el arduino lee la señal de entrada. (El arduino era prestado, y no lo tengo ahora)

La señal que manda el cigüeñal es un pulso por cada vuelta que da, y por eso, en el modelo que estoy creando ahora Offline, estoy empleando un generador de pulsos que emula a la señal del motor a unas revoluciones fijas.

Lo que quiero conseguir es calcular la frecuencia de los pulsos que me entran al modelo, ya que dependiendo de la frecuencia de giro, seleccionaré un avance u otro.

Con el propio  código de Arduino ya he conseguido leer las revoluciones a partir de este sensor con la ayuda de un coleguilla, pero mi problema es que no se como plantearlo en el diagrama de flujo de Simulink. Y el hecho de usar Simulink  lo hago porque no soy muy habilidoso programando, y porque más adelante vendrán unos mapas  de datos de 3D, que no tengo ni idea de como los podría meter en el propio código de Arduino...jejej 

No se si con estos datos podéis ver algo más claro lo que quiero hacer.

De todos modos muchas gracias por la ayuda !! ;)

surbyte

estas usando el módulo de arduino para matlab?
no mire aun tu código simulink porque lo tengo instalado en el trabajo y hoy estoy en mi casa.

J_DRM


Eso es, uso el modulo de arduino para Matlab.  Así puedo meter mi modelo de Simulink  directamente al arduino.

Como verás en el modelo no hay gran cosa, pero al quedarme atascado en el primer paso, no puedo seguir con el.

Saludos y gracias por la ayuda!

carmeloco

Creo entender que quieres hacer algún tipo de CDI o ECU para un motor de combustión, usando Arduino. La verdad es que no tengo muy claro que Arduino sea lo suficientemente rápido como para poder hacer una función así.

surbyte


J_DRM

Muy buenos los links!

Seguro que me son de gran ayuda! El objetivo es crearme el CDI y meterle algúna que otra función más que el CDI de serie, como alguna compensación por knocking .

Pero de momento estoy por simular el modelo en Simulink, que es lo que más problemas me va a dar....conseguir que el modelo me funcione. y que haga lo que yo quiera. jeje

Cuando vaya consiguiendo que las cosas funcionen ya lo iré publicando.

Un saludo y gracias por vuestra ayuda!  XD

pincho41700

#9
Oct 14, 2014, 01:27 pm Last Edit: Oct 14, 2014, 07:06 pm by pincho41700 Reason: 1
hola jdrm,
te dejo un tacometro que hice para mi coche que esta comprobado y funciona muy bien.Tambien te digo que lo hice para un diesel pero cambiando unas variables funcionara perfectanmente.

/*frecuencia del cristal=16mhz
T=1/f  = 62.5ns
overflow=62.5x2^16-1=65535*prescaler64=0,26214seg=262ms
cada pulso seria  62,5*64=4us
tiene que estar entre 5ms y 130ms para no haber desbordamiento.
activo timer1;
*/
unsigned long Rpm;
unsigned long Ticks;
unsigned long Overflow;

int dis1;    // display 1
int dis2;    // display 2
int dis3;    // display 3
int dis4;    // display 4

int display1[10]={63,6,91,79,102,109,125,7,127,111};  //array con los 10 numeros en base 10 ya calculados
int display2[10]={191,134,219,207,230,237,253,135,255,239};  //array con los 10 numeros en base 10 ya calculados
int display3[10]={63,6,91,79,102,109,125,7,127,111};  //array con los 10 numeros en base 10 ya calculados
int display4[10]={63,6,91,79,102,109,125,7,127,111};  //array con los 10 numeros en base 10 ya calculados

const int latchPin=4;
const int dataPin=7;
const int clockPin=8;



void setup() {
 
  cli();                     // se desactivan las interrupciones
  Serial.begin(9600);
 
  EIMSK=1<<INT0;             // elijo la interrupcion 0 externa es el pin2
  EICRA=1<<ISC01 |1<<ISC00;  // elijo en rising ( en flanco de subida)
  TCNT1=0;                   //contador a cero del timer1
 
  //registros del Timer1
  TCCR1A=0;
  TCCR1B=0;
  TIMSK1=(1<<TOIE1);         // se activa los registros por overflow
  TCCR1B |= (1<<CS10);       // sin prescaler
  TIFR1=(0<<TOV1);           //el flag a 0
  Overflow=1;                //contador de flag a 1
  sei();                     // se activan las interrupciones
}

void loop() {
 

//1 vuelta la conviertes en rpm
Rpm=(0.16/((2*Overflow)+Ticks)*(1+65535))*60;      //teoricamente da 64000, es por el oscilador

  dis1 = (Rpm%10);             // unidades
  dis2 = (Rpm%100)/10;         // decenas
  dis3 = (Rpm/100);            // centenas
  dis4 = (Rpm/1000);           //millares
 
  digitalWrite(latchPin,LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, display4[ dis4]);
  shiftOut(dataPin, clockPin, MSBFIRST, display3[ dis3]);
  shiftOut(dataPin, clockPin, MSBFIRST, display2[ dis2]);
  shiftOut(dataPin, clockPin, MSBFIRST, display1[ dis1]);
  digitalWrite(latchPin,HIGH);
 
Serial.println(Rpm);
//Serial.print("O: ");
//Serial.println((Overflow*65535)+Ticks);

}

ISR(INT0_vect)
{
 
  Ticks=TCNT1;  //vuelca el valor de contador en una variable
  TCNT1=0;  //pon el contADOR A CERO
  //empieza a contar el contador timer 1 desde 0
  Overflow=1;
}

ISR (TIMER1_OVF_vect)
{
  Overflow++;
}

Surbyte , la leche, eres un maquina , lo encuentras todo, que alegria ,ajajja

surbyte

Si me has leido que digo siempre:
TODO ESTA EN GOOGLEEEEEEEE y la gente arma post pidiendo algo que en 2 segundos se encuentra.
Claro que a veces no es tan facil, eso lo sabemos todos.

Ahora una nota para tu mensaje, creo que te equivocaste de marcadores y quedó como un link todo tu código cuando quisiste usar [ quote ] [ /quote ]. Modifica el mismo para que se lea apropiadamente el código. Gracias.
Pincho, agrega al menos un esquema de tu circuito electrónico. Se nota por el codigo que usas 595 shift registers
los numeros del array podrian estar en un solo array ya que es justamente la referencia para saber que mostrar en el display LED pero no entiendo porque dis2 es distinto?
El primer digito de dis2[0] es 10111111 = 191 en base 10
el generico es 00111111 = 63  ahhh ya veo. agregaste un led para el punto decimal? Se desprende al compararlos que el bit mas significativo se activa y como normalmente no es necesario en un LED 7 segmentos es porque activas un 8vo segmentos que debe ser el punto decimal.

Por otro lado, tengo la misma idea que max_saeta y es que al nutrirme de toda la variedad de problemas aprendo y al aprender mejoro.
Mi mente requiere cosas nuevas o se aburre, por eso la tengo a full al menos por ahora, jajaja.

pincho41700

tienes razon surbyte, puedo poner los 4 arrays unidos.
los integrados son los clasicos 75hc595,
los esquemas no los hago en ordenador , siempre enapel, que le vamos a hacer soy de la vieja escuela.
ahh otra cosa surbyte
hay algun integrado que contenga varios 595 en uno solo, tee lo digo porque necesito 6 display y la placa es muy pequeña y no me van a entrar 6 595.
un saludo maquina.

surbyte

#12
Oct 14, 2014, 07:59 pm Last Edit: Oct 14, 2014, 08:02 pm by surbyte Reason: 1
Debirias armar un nuevo post pero te respondo acá y si quieres lo abres y lo debatimos ahi.

Sugerencias o alternativas

1) Usar montaje superficial SMD con los 595 claro.

2) Max7219 puede hacerlo con un solo chip ya que tiene la posibilidad de manejar 8 LEDs multiplexados

No se los costos de una alternativa vs la otra


pincho41700

venga te lo pongo en otro post y debatimos,
a ver si puedo darte un dia caña y me dices que no losabes ,ajajjaaj

J_DRM

Muchas gracias a todos los que habeis aportado vuestras ideas e incluso código de otros proyectos!
Leyendo los posts me han ido viniendo más ideas a la cabeza sobre como hacerlo.
Pero me da que voy a tener que aplazarlo por lo menos hasta diciembre, que con la de trabajo que tengo ahora no me da para dedicarle tiempo!

Pero cuando dé con la frecuencia de Simulink ya lo postearé  para que la gente sepa como se hace..jaja

Un saludo y gracias de nuevo!

Go Up