Ayuda! Calcular revoluciones de un motor de combustion con Simulink

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 !!!

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

lo que tengas del Simulink tambien.

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 !! :wink:

var_1.0.mat (1.65 KB)

V_1_0.mdl (58.6 KB)

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.

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!

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í.

Te recomiendo leas esto
http://forum.arduino.cc/index.php/topic,118556.0.html

ataca tu problema y hay varias soluciones intermedias interesantes.
código para leer RPM incluido.

este articulo es muy orientativo tmb
http://www.sportdevices.com/ignition/ignition.htm

mas ejemplos
http://blog.nsfabrication.com/2009/06/20/arduino-based-small-engine-ignition-controller/

y este aplicado a un KART creo que es muy buen trabajo

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

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/((2Overflow)+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

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.

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.

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

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

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!