Limitador de RPM

Bueno, el finde estuve avanzando un poco con el proyecto.
Hice algunas modificaciones, por ejemplo antes evaluaba unos botones pulsadores que cuando se apretaban aplicaba voltaje a una entrada del pic, como vi que todos aplican normalmente tensión a una pata del pic y con el botón lo conectan a GND lo hice de ese modo.

Hay algo que no esta funcionando bien, porque la simulación siempre anduvo lenta pero desde que hice este cambio al mantener pulsado cualquier de los botones por mas de 3 segundos se traba todo y hay que espera como 30 segundos a que vuelva a la normalidad. (se ve en el contador del tiempo de ISIS que el tiempo practicamente no avanza).

Adjunto el DSN + HEX por si alguien lo quiere ver y ayudarme.

Gracias!
Federico.

Probe deshabilitando todos lo timers, las funciones de corte de rpm, shiftligh, osea 100% vacío y sigue pasando lo mismo q al mantener pulsado un boton el tiempo de la simulación es como que se congela, esto pasa desde q agregue los componentes para hacer una simulación del circuito real.
Estimo que sera problema del proteus ya que probe en 2 computadoras de características mas que aceptables.
Saludos,
Federico.
 
Bueno muchachos,
Estoy retomando el proyecto de un tacómetro digital con displays de 7 segmentos, con corte de RMP + control de largada + shtlight.
El ISIS hace la simulación muy lenta pero por lo que leí es por la gran cantidad de componentes pasivos que incluí en el diseño.
Estoy a punto de armar el circuito en un protoboard y probarlo en el auto a ver que pasa, antes de hacer esto me gustaría que alguien con mas conocimientos que yo le pegue un vistazo y me confirme si lo ve mas o menos correcto o si estoy cometiendo alguna burrada (que es bastante posible).
Desde ya les agradezco mucho y si funciona voy a crear un tema nuevo y subir todos los avances para que cualquier hobbista lo pueda armar.

El archivo de isis esta 2 post atrás, también adjunto un PDF acá con el esquemático.
Para que se entienda, el PIC tiene 4 botones de entrada 3 leds de salida, 7 displays de 7seg.
Por la interrupción RB0 entran los pulsos del distribuidor/bobina a travez de un opto-acoplador.
La salida del corte de rpm y el shiftlight se hace a tal vez de 2 relays que esta abajo del PIC.
Es bastante complejo por la cantidad de funciones que tiene.
Esto aclaro para que se entienda un poco mas.

Gracias!
Federico.
 

Adjuntos

  • TACHO_7SEG_v1.PDF
    83.3 KB · Visitas: 105
Solo veo que necesitas sumar 2 resistores series a los LEDs para limitar su corriente y también otra serie al transistor que toma las muestras del distribuidor.
 
Muchachos, ya tengo todo armado en un protoboard y lo estoy probando con un botón pulsador para simular el distribuidor.
En lineas generales anda todo bastante bien, pero surgieron uno o dos problemas que no se veían en la simulación.
Datos a tener en cuenta.
Velocidad de cristal 20mhz, todos los puertos definidos como FAST_IO.

El principal problema que estoy teniendo por ahora es el menu, que consta de los siguientes botones:
1- Selector
2- RPM(-)
3- RPM(+)

El selector te lleva a distintos parametros para modificar (RPM_CORTE / RPM_SHIFT_LIGHT / RPM_CONTROL_LARGADA)
El problema es que cuando llega al ultimo CONTROL_LARGADA el led testigo brilla muy tenue (no es problema del led ni de conexion porque si lo activo en otra seccion del programa del pic prende ok), y los display de 7 segmentos cambian segun lo que entre del "distribuidor", cosa que no pasa en ninguna otra opción del menu mas que en la de control de largada.
Pongo el código simplificando para que se vea esta parte y no mariar con toda la información junta.
No se si el problema serán los FAST_IO, la velocidad del micro, si la interrupción por RB0 estará complicando las cosas, o si el código es demasiado complejo para un pic, soy super novato en esto.
Probé distintos valores de capacitores para el cristal, y el resultado es el mismo.

PHP:
#include <16f876.h>
#use delay (clock=20000000)
//#use delay (clock=8000000)
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP,BROWNOUT /* Fusibles (lo mas comun) */  
//#use FIXED_IO( A_outputs=PIN_A0, PIN_A1 )
#use FAST_IO(A)
#use FAST_IO(B)
#use FAST_IO(C)


//DEFINO PINES IN
#define BOBINA PIN_A0
#define SHIFT PIN_A1
#define T_MENU PIN_A2
#define T_MENOS PIN_A3
#define T_MAS PIN_A4
#define T_LARGADA PIN_A5

//DEFINO PINES OUT (B y C)
//PIN_B0 INTERRUPCION_EXTERNA
#define DISP1 PIN_B1 //OUT
#define DISP2 PIN_B2 //OUT
#define DISP3 PIN_B3 //OUT
#define DISP4 PIN_B4 //OUT
#define L_CORTE PIN_B5 //OUT
#define L_SHIFT PIN_B6 //OUT
#define L_LARGADA PIN_B7 //OUT
#byte DISP0=0x07 //PUERTO C


short rpmcount;
long rpm;
int button, p_menu, p_menos, p_mas, pos_menu;
long int tmp1;
long int rpmtime;
long int rpmshift,rpmcorte,rpmlargada;
long int rpmshifttime,rpmcortetime,rpmlargadatime,rpmmaxtime;
short int s_rpmshift,s_largada;
int const disp[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67};

void put_display(long num_out)
{
   int uni,dec,cen,umil;
   uni=0;
   dec=0;
   cen=0;
   umil=0;
   while(num_out>=1000)
   {
      num_out-=1000;
      umil++;
   }
   while(num_out>=100)
   {
      num_out-=100;
      cen++;
   }
   while(num_out>=10)
   {
      num_out-=10;
      dec++;
   }
   while(num_out>=1)
   {
      num_out-=1;
      uni++;
   }

   delay_ms(1);

   DISP0= disp[umil];
   delay_ms(1);
   output_high(DISP1);
   delay_ms(5);
   output_low(DISP1);
   delay_ms(1);

   DISP0= disp[cen];
   delay_ms(1);
   output_high(DISP2);
   delay_ms(5);
   output_low(DISP2);
   delay_ms(1);

   DISP0= disp[dec];
   delay_ms(1);
   output_high(DISP3);
   delay_ms(5);
   output_low(DISP3);
   delay_ms(1);
   
   DISP0= disp[uni];
   output_high(DISP4);
   delay_ms(5);
   output_low(DISP4);
   delay_ms(1);

}

void leer_teclado()
{
   button=0;
   if((!input(T_MENU))  && !p_menu){ button=1; p_menu=1;};if(input(T_MENU)){p_menu=0;}
   if((!input(T_MENOS)) && !p_menos){ button=2; p_menos=1;};if(input(T_MENOS)){p_menos=0;}
   if((!input(T_MAS))    && !p_mas){ button=3; p_mas=1;};if(input(T_MAS)){p_mas=0;}
}

void proc_teclado()
{
   //APRETE MENU
   if(button == 1)
   {
      pos_menu++;
   }

   if(pos_menu)
   {
      switch(pos_menu){
      case 1:
         if(button == 2){rpmcorte=rpmcorte-100;};if(rpmcorte <= 1500){rpmcorte=1500;}
         if(button == 3){rpmcorte=rpmcorte+100;};if(rpmcorte >= 14000){rpmcorte=14000;}
         output_high(L_CORTE);
         output_low(L_SHIFT);
         output_low(L_LARGADA);
         put_display(rpmcorte);
         break;
      case 2:
         if(button == 2){rpmshift=rpmshift-100;};if(rpmshift <= 1500){rpmshift=1500;}
         if(button == 3){rpmshift=rpmshift+100;};if(rpmshift >= rpmcorte){rpmshift=rpmcorte;}
         output_low(L_CORTE);
         output_high(L_SHIFT);
         output_low(L_LARGADA);
         put_display(rpmshift);
	 break;
      case 3: 
[B]//ACA ES EL PROBLEMA, DONDE L_LARGADA PRENDE TENUE y put_display FALLA.
//ACA ES EL PROBLEMA, DONDE L_LARGADA PRENDE TENUE y put_display FALLA.[/B]
         if(button == 2){rpmlargada=rpmlargada-100;};if(rpmlargada <= 1500){rpmlargada=1500;}
         if(button == 3){rpmlargada=rpmlargada+100;};if(rpmlargada >= 15000){rpmlargada=15000;}
         output_low(L_CORTE);
         output_low(L_SHIFT);
         output_high(L_LARGADA);
         put_display(rpmlargada);
         break;
      case 4:
         //GUARDO LOS CAMBIOS Y SALGO
         pos_menu=0;

         tmp1 = rpmcorte/100; write_eeprom(1,tmp1);
         tmp1 = rpmshift/100; write_eeprom(2,tmp1);
         tmp1 = rpmlargada/100; write_eeprom(3,tmp1);
         
         output_low(L_CORTE);
         output_low(L_SHIFT);
         output_low(L_LARGADA);
         put_status(); //Actualizo estado de leds.-
         leer_eeprom(); //ASI SE ME ACTUALIZAN LAS VARIABLES
         break;
      }
   }
   else if(button == 2)
   {
	//ACTIVO STATUS SHIFT
	if(!s_rpmshift)
	{
		s_rpmshift=1;
	}
	else
	{
		s_rpmshift=0;
	}
	put_status();//ACTUALIZO ESTADO DE LEDS
   }   

}
#INT_EXT
void Sample_isr(void)
{
	rpmcount++;//PARA PROCESAR CADA 2 CHISPAS (rpmcoun=bit)
	if(rpmcount==0)
	{
		rpmtime=get_timer1();
		set_timer1(0);
		proc_shift(); //EVALUO SI PRENDER SHIFTLIGHT
		proc_corte(); // EVALUO SI HACER CORTE DE RPM
	}
}
  
void main(void)
{
	setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);
	enable_interrupts(INT_EXT);
	enable_interrupts(GLOBAL);

	set_tris_a(0x3c);
	set_tris_b(0x01);
	set_tris_c(0x00);

	rpm=0;
	rpmtime=0;
	rpmcount=0;
	output_low(BOBINA);
	
	output_low(DISP1);
	output_low(DISP2);
	output_low(DISP3);
	output_low(DISP4);

	put_status();//ACTUALIZO ESTADO DE LEDS
	leer_eeprom();//BUSCO VALOR EN EPROM.
	while(TRUE)
	{
		if(!pos_menu)
		{
			rpm=60*(1000000/rpmtime);
			put_display(rpm);
		}
		leer_teclado();//LEO SI APRETARON ALGUNA TECLA.-
		proc_teclado();//REALIZO ACCION SI SE APRETO ALGUNA TECLA.-
		delay_ms(1);
	}
}


Agradezco mucho a todos los que aportan.
Gracias!
 
Última edición:
El problema anterior fue solucionado, pasaba que por defecto los valores de corte RPM, SHIF_LIGH no estaba inicializados entonces la funcion que ponía los numero en los displays de 7 segmentos limaba.
Lo mismo pasa en el caso de que las RPM superen el valor de 9999, la funcion que pone los números en el display falla y traba todo.
Sigo avanzando.

Saludos,
Federico
 
Muchachos,
Bastante tiempo después vuelvo a tener unos ratos para continuar el proyecto.
Hice pruebas en el auto:
Ford Taunus 1979, distribuidor electronico con modulo incorporado marca Indiel (originalmente venia en los Ford Sierra, que comparten motor con mi auto).

Para mi decepcion, si conecto el cable para sensar los pulsos en el NEGATIVO de la bobina, se cuelga el pic, muestra un 0 en el display de 7 seg y despues se apaga.
Si conecto el cable en el POSITIVO de la bobina, ahi si marca las RPM en forma correcta, con un pequenio error que cada 1 segundo hace una lectura erronea, por ejemplo si el auto esta en 800 rpm cada tanto marca 1600, si el auto esta en 1500 rpm cada tanto marca 3000 (aproximadamente).

El tema es que quiero el cable sensor poder conectarlo al negativo de la bobina, y que sea compatible para distribuidores electronicos y distribuidores a platino.

Adjunto el esquema que estoy usando, probe con y sin capacitor e intercambiando las resistencias de 1k y 10k.
aclaracion. el capacitor es super chico.

Espero alguien pueda aclararme el panorama.
Gracias!
 

Adjuntos

  • conexion_bobina.png
    conexion_bobina.png
    25 KB · Visitas: 52
Hola, te comento que es normal que se vuelva loco el PIC.
Tienes que limitar el pico de la bobina y eliminar la componente de DC.
Prueba este interfase, espero termines con éxito el proyecto.
 

Adjuntos

  • circuito.jpg
    circuito.jpg
    27.2 KB · Visitas: 71
Hola, te comento que es normal que se vuelva loco el PIC.
Tienes que limitar el pico de la bobina y eliminar la componente de DC.
Prueba este interfase, espero termines con éxito el proyecto.

No entiendo cual es la función del q1 osea, mi problema es que el módulo no tiene salida para rpm.
Estimo que en el ejemplo que me facilitaste el L1 es la bobina y el q1deberia obviarlo y pones los diodos cap y res que agregaste después para probarlo así, es correcto esto??
Desde ya muchísimas gracias por toda la ayuda, si esto funciona bien voy a armar uno para vos.
Muchas gracias.

ahora que veo mejor usas el q1 para simular el distribuidor, no??
 
Última edición:
MICRO,
Sigo con problema, proble el esquema que me recomendaste pero sigue pasando lo mismo, es mas un poco peor ahora porque marca casi siempre 9999.
Las pruebas las estoy haciendo en un protoboard, conecto todo directo a la bateria y con un cable tipo de telefono (esos que tienen un solo filamento grueso adentro) de mas o menos 1 metro conecto a la bobina.

Algo que note es que si sostengo el cable que va al (-) de la Bobina con la mano y con la otra mano toco el cable de bujia que sale de la bobina el pic empieza a marcar aproximadamente 1000 RPM, cosa que es bastante probable que sea correcta.
Hay algo que esta metiendo interferencia, no se si el tipo de cable o por ser un protoboard.
Voy a ver si puedo hacer unas pruebas con un optoacoplador para aislar todo el tema de la bobina de la parte digital.
Por favor confirmame si se te ocurre algo.

Muchas Gracias
 
El mosfet es sólo para simular la interferencia con la bobina de arriba.. Los pulsos son filtrados por el capacitor y los diodos y activa el 2n3906.
Puse el opto y aisle los 12v de los 5v porque el PIC se vuelve loco.
Toma pulsos si yo toco el cable del sensor y los cables de bujías. Marca cualquier cosa, se cuelga. El es muy raro lo que hace.
 
El mosfet es sólo para simular la interferencia con la bobina de arriba.. Los pulsos son filtrados por el capacitor y los diodos y activa el 2n3906.
Puse el opto y aisle los 12v de los 5v porque el PIC se vuelve loco.
Toma pulsos si yo toco el cable del sensor y los cables de bujías. Marca cualquier cosa, se cuelga. El es muy raro lo que hace.

Arma con un 555 un Anti-Rebote (monoestable) que se dispare con el pulso de la bobina. El tiempo del 555 debe ser menor al tiempo entre 2 disparos de la bobina.

¿ Como estas alimentado el circuito ?
¿ Tomaste los recaudos necesarios para evitar interferencias a través de la alimentación ?
 
Arma con un 555 un Anti-Rebote (monoestable) que se dispare con el pulso de la bobina. El tiempo del 555 debe ser menor al tiempo entre 2 disparos de la bobina.

¿ Como estas alimentado el circuito ?
¿ Tomaste los recaudos necesarios para evitar interferencias a través de la alimentación ?

Subo adjunto en este post la ultima version del circuito que estoy usando.
La parte de captura de RPM antes la hacia solo con 2 resistencias como se ve en este post:
https://www.forosdeelectronica.com/posts/702611/

Por favor revisa el circuito, seguramente se puedan mejorar muchas cosas.

Voy a investigar un poco como es el tema del 555, no lo use nunca ese integrado pero se que hay mucha informacion y parece que se usa practicamente para todo, jaja.

Gracias!
 

Adjuntos

  • tacho_7seg_v1.pdf
    140.2 KB · Visitas: 44
Yo cargaría (Optoaislador) el transistor detector sobre el colector, e intentaría aplicar el divisor resistivo.

No entiendo de donde sacas +Vcc para el optoaislador, este debería ser fijo (12Vcc)
 
No entiendo lo de cargar por el colector, a mi entender lo estoy haciendo de ese modo.
Por otro lado, los 12v son la alimentación principal del circuito (batería del auto) que está regulada por un 7805 y dos capacitores.

El principal problema me imagino yo que será la interferencia, por las cosas que comentaba 4 o 5 posts atrás.
 
AMIGOS!!
Logre hacer que el PIC tenga una lectura correcta de las RPM del motor del auto tomando los pulsos del Negativo de la BOBINA.
Adjunto el esquema, la opción que me funciono fue la numero 2 que es super simple, la 1 no llegue a probarla porque cuando desconecte el cable que salia de la bobina accidentalmente toque algo en el protoboard y vole el pic :(

Por favor les pido que me comenten como ven esta opcion, si es correcta o estoy yendo por mal camino, a mi entender la opcion 1 (optoacoplador y toda la bola) seria mas adecuada, pero son mas componentes y no pude probarla...
Que les parece?

Gracias a todos los que ayudan, ya saben quienes son.
 

Adjuntos

  • sensor_rpm2.png
    sensor_rpm2.png
    31.4 KB · Visitas: 66
Amigo sk8federico, reemplaza la resistencia R24, por puente asi logras niveles logicos mas definidos para el PIC.
Para evitar interferencias, en este tipo de ambiente "ruidoso", debes añadir un pequeño condensador entre los pines de alimentacion del PIC, de aprox. 100nF. debe conectarse lo mas prox. posible al mismo, ademas utiliza cable apantallado para las entradas, y blindar todo el conjunto en una jaula de Faraday (gabiente metalico conectado a GND).
 
La verdad ya se que no hay que revivir temas pero no le encuentro sentido a hacer uno nuevo y arrancar de 0 cuando ya está todo esto...
Una consulta, es sobre los "cortes de rpms" que están tan de moda hoy en dia... yo pense que era algo mas elaborado y sensaba las rpms, pero hoy me trajeron uno para copiarlo y ohh sorpresa: positivo, negativo y dos cables para la bobina... lo conecto para ver que hace, y es un relé intermitente de frecuencia ajustable!!! funciona realmente como corte o limitador de rpms? o es para hacer facha nomás?
 
Atrás
Arriba