Limitador de RPM

para que no entendi bien, cortas el encendido directamente con el LM? te aconsejo el circuito con el TL081, me parece mas simple y efectivo.
yo lo arme con el LM2907, use un circuito que esta en el datasheet, y el TL081 como comparador y funcionó, lo arme primero como luz testigo y desp probe de hacer que corte y funciono barbaro . . . .

buenisimo :aplauso: yo estoy haciendo el mismo (y)... solo que tengo que hacer los calculos, y no tengo mucha idea de como, ya que soy quimico :D... jajaja
Estaria bueno que subieras el circuito del LM2907 con el operacional!! :D algo como para 4 cilindros...
Gracias... el foro es una masa!!
 
Hola... mi consulta puede ser media tonta, pero no se como se conecta el limitador en el auto... alguien podria hacer un diagrama para poder guiarme en el coneccionado?? adjunto el circuito q hice y el relay q no puse en mi circuito porque la verdad lo quise hacer lo mas simple posible al circuito... Gracias...

Otra duda es q no se para q sirve la salida marcada como "Salida" y el otro como "charge".

Ha, me olvidaba.. estube intentando conectarlo al auto.. la verdad cm no sabia cm hacerlo conecte los bornes de la bateria a donde hay una fuente en el circuito y empezo a parpadear el led (hasta ahi me andubo bien el circuito), luego conecte la salida marcada como 86 al borne positivo de la bobina.. pero ocurrio el problema q el led no parpadeo mas sino q se quedo encendido nmas... (para mi q queme el 555)
 

Adjuntos

  • 01.jpg
    01.jpg
    14.4 KB · Visitas: 178
  • 04.jpg
    04.jpg
    7.4 KB · Visitas: 96
Última edición:
hola para mi quemaste el 555 por que no le da la salida para alimentar el rele. le tenes que colocar un transistor bc 547 ,, donde dice salida ahi colocas un r de 1k y la conectas a la base del transistor ,luego el emisor a masa y el colector lo conectas a la pata 86 del rele ,la pata 85 la colocas a 12 volt positivo . luego la pata 30 va a 12 volt contacto y la 87a va al positivo de la bobina .( el rele va colocado en serie a la alimentacion de 12 volt de la bobina como si fuera una llave ) otra cosa importante es colocarle un diodo 1n4007 entre la pata 85 y 86 del rele por los picos inversos del rele asi no se quema el transistor ..
URL]
URL]
este circuito es el que arme yo saludos
 
Muchachos,
Quería plantear un esquema para tener los impulsos de un distribuidor con encendido electrónico.
El auto en cuestión es un Ford taunus con distribuidor electrónico (con modulo incorporado) de Ford Sierra.
Estoy pensando en algo como la imagen adjunta.
Espero alguien pueda confirmarme si esta bien lo que estoy ideando.
Saludos,
Federico.
 

Adjuntos

  • conexion a distribuidor electronico.png
    conexion a distribuidor electronico.png
    35.2 KB · Visitas: 159
Hola a todos, primero disculparme por no haber respondido a las dudas que me han planteado algunos amigos del foro en anteriores post, solo les diré que por falta de tiempo no he podido, pues me ha tocado estudiar programación a terceros no teniendo que ver nada con nuestra querida electrónica.
Viendo el gran interés por los limitadores de RPM he decidido plantearme este diseño digital. Uno, para no olvidar lo aprendido pues desde hace 6 meses no toco un transistor y otro, para ayudar a quien de una forma u otra lo necesite. Bueno no dilato más el aporte, les comento sus características:

1- Aplicable a todo tipo de encendido.
2- Configurable para motores de una chispa o de dos por revolución.
3- Interfase de potencia integrada.
4- Ajustable desde aproximadamente 1500 a 14000 Rpm.
5- Calibración mediante interfase RS 232.
6- Protección a bobina quemada.

Por poseer la entrada de pulsos separados y con valor negado es viable en la mayoría de los tipos de encendido, dando solo problemas en casos cuyos pulsos obedezcan a positivos, en tal caso solo será necesario un circuito inversor. También al poseer el circuito de potencia integrado brinda la característica de separar la carga del circuito real de control (Platinos o ECU). Posee la característica de desconectar la alimentación a la bobina si el motor no se encuentra en marcha, es ajustable en un amplio margen de revoluciones por minuto (RPM) y se puede poner a punto de modo practico en el coche utilizando como referencia el propio tacómetro, también podremos ajustarlo desde el propio banco de trabajo con solo conectar a la PC mediante dos líneas al puerto serie (RS 232) y abrir un hyperterminal en configuración estándar a 1200bps.
Bueno sin mas les posteo el circuito, su PCB, mascara y el programa del Pic12x50x, cualquier duda postean.
Espero les sea de interés.
 

Adjuntos

  • PCB.GIF
    PCB.GIF
    67.2 KB · Visitas: 128
  • Limitador RPM Digital.rar
    37.1 KB · Visitas: 229
Lamento decir que no dispongo de ningún video, solo realice el diseño y su prototipo esta bajo prueba, comento que las ha superado con creses. Puedes simular su función desde el Proteus.
Gracias.
 
Bueno, aquí les dejo el circuito para emularlo en el Proteus.
Recuerden que las revoluciones por minuto deberán dividirla entre 60 para poder ajustar el generador de pulsos, el Jumper (Calíbrate) activa dicha función y podrán variar las revoluciones de corte através del potenciómetro. El Jumper (1 Chispa) si esta activo no divide entre dos, esto significa que es para motores que solo generan 1 chispa por revolución.
 

Adjuntos

  • Circuito para Proteus.zip
    21.7 KB · Visitas: 120
"yoelmicro"
Te quería consultar sobre como hiciste para calcular las RPM. Estoy abordando un proyecto similar y probé dos métodos.
Uno fue en el ciclo while infinito, poner un delay de X dalay_us y tomar eso como parámetro, método que es bastante precario.
Después cambie por contar el tiempo entre las chispas con la interrupción TIMER0 de un PIC16F8xx.
El tema es que para tener buena precisión a altar rpm tengo que contar por ejemplo 10 chispas (sino tiene una escala de 30 rpm), y esto no me sirve a bajas rpm ya que sino estaría evaluando un periodo de tiempo muy largo y no seria bueno el corte.
Pensé en poner un sistema variable que por ejemplo, detecte si es un corte a bajas rpm (por ejemplo un control de largada) y evalúe un periodo de 4 chispas, y si es un corte a altas rpm evalúe un periodo mas grande, ya que ese corte se va a accionar solo en caso de error humano de que pongas mal un cambio o se te rompa la transmisión/embrague.
No termina de convencerme todo esto, tiene que haber algo mas profesional a lo que se me ocurre a mi.

Para el corte pensé en que si las RPM actuales exceden el valor permitido desconecte la bobina, si el valor el mas bajo que el máximo permitido permita hacer chispa.
Por este motivo necesito que las rpm actuales se actualicen principalmente MUY RAPIDO y de la forma mas precisa posible.

Espero haber sido claro.
Saludos,
Federico.
 
Bueno @sk8federico, no se si entendí bien, pero pienso que te refieres a como tomar la referencia de las RPM para poder compararlas con las obtenidas reales del motor o tienes resuelto el problema de la referencia?, por otro lado para tomar las RPM del motor solo as de medir su frecuencia y luego multiplicarla por 60, ojo con los motores de más de 1 cilindro pues multiplican por 2 su frecuencia dándote el doble de las revoluciones reales, el uC utilizado no posee interrupciones de ningún tipo y solo 1 timer, pero hay soluciones por hardware y software para dichos problemas.
Por software...
Tienes 2 timer uno lo utilizas como (timer) para que cada 1segundo guarde el contenido del segundo timer que esta configurado como (contador) a la vez que lo limpias, de esta forma ya tienes la frecuencia del rotor. Puedes disminuir el tiempo de muestreo para lograr respuestas mucho más rápidas.
Espero me entiendas, pero también me dices si interprete mal la pregunta.
Desde ya gracias.
 
Si, mas o menos es de lo que estamos hablando.
A continuación les pongo el código de ccs del que hablo.
El problema que tiene es que tengo que tomar un periodo de 8 chispas para tener buena resolución a altas RPM, y si tomo un periodo de 8 chispas cuando quiero hacer un control de largada resulta que no tengo buena velocidad de actualización de datos como para poder decidir si hacer un corte en la alimentacion de la bobina o no.

EL CODIGO:
ACLARO: Esto de dar tanta importancia de lo de velocidad de actualización VS. precisión es unicamente para realizar los cortes en la bobina (corte de baja para largada, y de alta para proteccion).
Nada tiene que ver con mostrar en el display ahí no es de mayor importancia.
Código:
#include <16f876.h>
#use delay (clock=20000000)
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,BROWNOUT /* Fusibles (lo mas comun) */  

//DEFINO PINES IN
#define RPM_SIG PIN_A1

long rpm,rpmcount;
short int rpmhi;
long int tmp1, tmp2,tmp3,tmp4;
long int rpmtime,rpmtime1,rpmtime2;
long int sensorescount;
int periodo;

//DEFINO SENSORES Y MONITOREO CAMBIOS DE ESTADO
void sensores()
{
   sensorescount++;
   if((input(RPM_SIG)) && !rpmhi)
   {
      rpmhi=1;
      if(rpmcount==0)
      {
         rpmtime1=sensorescount;
      }
      else if(rpmcount==periodo)//VALOR PUESTO PARA TENER MEJOR RESOLUCION A ALTAS RPM.
				//CONTROLO CON $PERIODO CADA CUANTAS EXPLOSIONES SACAR
				//UN RESULTADO
      {
         rpmtime2=sensorescount;
         rpmtime=rpmtime2-rpmtime1;
         rpmcount=0;
         sensorescount=0;
      }
      rpmcount++;
   }
   if((!input(RPM_SIG)) && rpmhi)
   {
      rpmhi=0;
   }
}

   


#int_TIMER0
void TIMER0_isr()
{
   sensores();
   //ACA NORMALMENTE INCLUYO UN COMPARADOR PARA HACER CORTE DE RPM / CONTRO DE LARGADA.
}

//PROGRAMA PRINCIPAL !!!
//PROGRAMA PRINCIPAL !!!
void main(void)
{
   setup_timer_0(T0_INTERNAL | RTCC_DIV_1);
   enable_interrupts(GLOBAL | INT_TIMER0);
   set_timer0(0);

 
   rpmcount=0;
   rpm=0;
   periodo=6; //DEFINE CUANTAS CHISPAS VOY A CONTAR PARA PROCESAR LOS DATOS.

   while(TRUE)
   {
      rpm=650000*periodo/rpmtime;
      put_display(rpm); //Funcion que uso para imprimir display  de 7 segmentos.
      //delay_ms(1);
      }
   }
}

Espero haber sido claro.
Gracias!
 
Última edición:
Bueno, te comento que según veo te has complicado mucho para hallar las rpm y no lo encuentro factible, no tenia el pdf de el 16f87x y me lo baje, en cuanto tenga el menor tiempo te realizo una función que tomara las rpm a las que esta girando el rotor del motor. Tengo una duda de cómo es que ajustas las rpm a las que quieres cortar, me imagino que es através de sw y lo visualices en el display. Tampoco sabia nada sobre control de largada pero ya he estudiado su algoritmo para una mejor implementación, se me ocurre que solo cortes un cilindro por revolución en largada y dejes ajustar las rpm o la primera vez que conectes el dispositivo auto ajuste las rpm de largada partiendo de la media entre las bajas y altas rpm del motor en cuestión.

Bueno sk8federico, he tenido un tiempito y me dedique a analizar la polémica, resulta que si midiéramos el tiempo entre chispas a una razón de 1uS por incremento del timer 1 de 16bits del 16F87x y valiéndonos de la interrupción 0 por hardware tendríamos resuelto el problema, ya que la resolución para 1uS es de 2.4 RPM para un motor de 1 chispa por revolución, resolución mas que suficiente para dicho cometido.

Por ejemplo, con el oscilador de 20 MHz que tienes no podremos incrementar cada 1uS debido a que el prescalador tiene valores fijos asignados, en cambio con un cristal de 8 o 16MHz es posible dicho incremento, si es de 8MHz el prescalador tendrá un valor de 2 y con 16MHz como es lógico un valor de 4, entonces como el periodo es el inverso de la frecuencia tendríamos que dividir 1/T pero como sabemos es una verdadera jodienda tratar con puntos flotantes en un uC pues ocupa mucho rendimiento, entonces como el numero tomado por el timer 1 obedece al periodo tomado en uS es tan sencillo como multiplicar por 1^6 el inverso, quedando 1^6/Valor Timer 1 dándonos su frecuencia y nos quedaría multiplicar por 60 para llevarlo a revoluciones por minuto, quedando:

Vrpm=60*(1^6/Timer)

De esta forma ya tenemos las RPM del motor con una resolución verdaderamente aceptable, cada vez que ocurra una interrupción por hardware guardamos el valor del timer 1 y lo limpiamos, si por ejemplo el motor es de 2 chispas por RPM entonces nos inventamos una variable global de carácter bolean y la incrementamos en cada salto, cada vez que sea 0 tomamos el valor del timer 1, esto es solo un ejemplo de cómo lo haría yo.

Espero te ayude esta explicación.
 
Última edición:
Me podrías hacer una explicación un poco mas general, porque la verdad es que entiendo pero por partes lo que me quiste explicar.

Lo que pasa con el código que presente yo es que si no se toma el periodo de 7 chispas la variable que carga el timer0 (diferencia de contador entre primer chispa y ultima), a 10.000rpm es 14 por ejemplo, cosa que hace una escala horrible a altas rpm.

No entiendo lo que propones vos, si usas el comparador, si estas usando el contador para medir tiempo como yo o no?

La verdad hoy no tuve mucho tiempo, mañana me pongo a revisar bien todo aver si puedo sacar algo mas en claro.
Saludos!
Federico.
 
Bueno, sk8federico te pongo un ejemplo….

Código:
#include <16f876.h>
#use delay (clock=8000000) 
                           /*Con Xtal de 8MHz, prescalador dividiendo entre 2
                           y si es de 16MHz entonces prescalador dividiendo entre 4*/
                           
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,BROWNOUT /* Fusibles (lo mas comun) */  

#define Por2Vuelta PIN_B1  /*Pin para asignar 2 chispas por revolucion
                                    valor por default es 1.*/                           
long Vrpm,Sample,Temporal;
short Tipe;
#define Inverso=1000000    //Resultado de multiplicar el inverso por 1^6.
#define Minutos=60         //Constante de llevar segundos a minutos.


#INT_EXT                   //Salta cada vez que hay un pulso.
void Sample_isr(void){     //Funcion para tratar la iterrupcion EXTERNA.

if(Por2Vuelta==0){         //Si el motor es de 2 Chispas por revolucion,
Tipe++;                    //tomo el valor del timer cada 2 saltos.
if(Tipe==0){
Sample=get_timer1();       //Guardo el tiempo en uS.
set_timer1(0);             //Reinicio el valor del timer 1.
            }
                  }
else
{
Sample=get_timer1();       //Si es un motor de 1 Chispa por revolucion.
set_timer1(0);
}
                     }


void main(void){
Temporal=0;
Tipe=0;

setup_timer_1(T1_INTERNAL | T1_DIV_BY_2); //Por utilizar un cristal de 8MHz.
enable_interrupts(GLOBAL | INT_EXT);

do{
Vrpm=Minutos*(Inverso/Sample);
if(Vrpm<>Temporal){
printf("Las revoluciones del motor son: %LuRPM\n\r",Vrpm);
Temporal=Vrpm;}
}while(True);
}
Espero entiendas mejor ahora, solo es utilizar la interrupción externa y el Timer 1 como timer para medir el periodo entre chispas para un motor de 1 por revolución o cada 2 para motores de 2 chispas por revolución, comento que solo realice el software en CCS pero no lo probé, pero debería funcionar.
 
Buenas,
Antes que nada muchísimas gracias por el código, mas que una explicación fue un trabajo servido :p
La verdad funciono todo sin mayores inconvenientes, lo único que estoy notando es que en la simulación si configuro una frecuencia para marcar 4000 RPM (en el modo de 2 chispas por RPM) en realidad marca 3600 RPM (400 RPM de menos).
Si configuro el pulso para marcar 8000 RPM en la simulación marca 7200 RPM (800 RPM de menos).

El código es exactamente el aportado por "yoelmicro", la config de los cristales en la simulación y todo es correcta.

Me quedo investigando si encuentro porque esta pasando esto.
Saludos,
Federico.
 
Bueno, te comento que ami ni me compilo, pues tenia errores de sintaxis, disculpa, es que estoy liado con muchos lenguajes ahora mismo, pero ya los corregí y trabaja perfecto, recuerda que te comente que el error es del 2.4% pero como el decimal no lo contamos seria de 2, esto quiere decir que si la frecuencia de entrada es impar cuando dividas entre 2 tendrás las mismas RPM que para el impar -1, resumiendo, las RPM para 100Hz son 6000, pero para 101Hz serian realmente 6060, pero si dividimos entre 2 este ultimo numero te dará el error de 2 que es 3000 siendo 3030 las RPM reales.
Aquí te dejo también el circuito que realice para emularlo y el código en CCS.
Espero termines pronto tu proyecto.
Código:
#include <16f876.h>
#use delay (clock=8000000) 
                           /*Con Xtal de 8MHz, prescalador dividiendo entre 2
                           y si es de 16MHz entonces prescalador dividiendo entre 4*/
                           
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT /* Fusibles (lo mas comun) */  
                           
long Vrpm,Sample,Temporal;
short Tipe;

#INT_EXT                   //Salta cada vez que hay un pulso.
void Sample_isr(void){     //Funcion para tratar la iterrupcion EXTERNA.
if(input(PIN_B1)==0){      //Si el motor es de 2 Chispas por revolucion,
Tipe++;                    //tomo el valor del timer cada 2 saltos.
if(Tipe==0){
Sample=get_timer1();       //Guardo el tiempo en uS.
set_timer1(0);             //Reinicio el valor del timer 1.
            }
                  }
else
{
Sample=get_timer1();       //Si es un motor de 1 Chispa por revolucion.
set_timer1(0);
}
} 


void main(void){
Temporal=0;
Tipe=0;
setup_timer_1(T1_INTERNAL | T1_DIV_BY_2); //Por utilizar un cristal de 8MHz.
enable_interrupts(GLOBAL | INT_EXT);

do{
Vrpm=60*(1000000/Sample);
if(Vrpm!=Temporal){
printf("Las revoluciones del motor son: %LuRPM\n\r",Vrpm);
Temporal=Vrpm;}
}while(True);
}
 

Adjuntos

  • Circuito.zip
    14.5 KB · Visitas: 70
Olvidense de esto, estoy usando frecuencias como explicaste Yoelmicro funciona de maravilla..
Voy a seguir avanzando con mi código y seguramente te vuelva a molestar.
Muchas Gracias.

"Yoelmicro" antes que nada muchas gracias por todo el tiempo que le estas dedicando a mi proyecto.
Probé con el DNS y el código tal cual me lo pasaste y sigo con el mismo problema.
Para configurar los pulsos que simulan la señal del motor yo uso la siguiente formula, en vez de usar frecuencia uso periodo de tiempo (el segundo campo).
La formula es esta:
1000/RPM*2/60=

Esta formula venia funcionando para mis otras pruebas pero para esto da un error proporcional a medida que vario las RPM que quiero simular.
Si tenes idea así velozmente de que puede estar pasando te voy a agradecer muchísimo si me explicas.
De todos modos estoy leyendo esto de las frecuencias y si de esta forma funciona mejor voy a aprender a trabajar con eso y listo.
Muchas gracias!

Federico.
 
Última edición:
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.
 

Adjuntos

  • TACHO_7SEG_v1-hex+dsn.zip
    29.9 KB · Visitas: 60
Atrás
Arriba