Go Down

Topic: Problema con velocimetro (Read 3 times) previous topic - next topic

Igor R

#5
Aug 06, 2011, 07:35 pm Last Edit: Aug 06, 2011, 08:09 pm by Igor R Reason: 1
afcabanas, por qué tienes la interrupción activada por nivel en vez por flanco?

Por otro lado. las variables que son modificadas por la interrupción y que usas fuera de la misma las tienes que declarar como volatile (http://arduino.cc/es/Reference/Volatile).
El perímetro, podrías usar un #define, en vez variable que consume RAM (ésto es por ser quiscolloso).
Yo haría las menos operaciones posibles dentro de la interrupción, como vas a mostrarlo por lcd, que lo actualizarás cada ¿200 ms?, tienes tiempo de sobra para hacerlo fuera.... ¿no? Podrías ir ampliando una variable en la interrupción, y cada los ¿200ms? (por poner un tiempo), calculas la velocidad, ya que sabes el número de pulsos que tienes en esa cierta cantidad de tiempo.

¿Has copiado y pegado de parte de código? Hay una variable revision y un Wire.begin que despistan un poco.... ;)



Esog Enaug


afcabanas, por qué tienes la interrupción activada por nivel en vez por flanco?



¿Por que sería mejor activarla por flanco?



¿Has copiado y pegado de parte de código? Hay una variable revision y un Wire.begin que despistan un poco.... ;)


Viva el codigo libre.
La electrónica y el slot (o esos cochecitos)
http://www.juanjofrancia.es/arduslot

Igor R

#7
Aug 10, 2011, 04:06 am Last Edit: Aug 10, 2011, 01:39 pm by Igor R Reason: 1
Hola,

Hoy he estado montando un inventillo con un trafo, y necesitaba medir la frecuencia de la red eléctrica.Me he creado este pequeño programa y me he acordado de este post.Uso interrupciones, y es similar a lo que necesitas. Por cierto,si alguien necesita tener controlado el paso por cero de la senoidal de la red eléctrica (por ejemplo para el control de triacs), también le sirve este código.

Pongo por aquí el código por si te ayuda en algo:

Code: [Select]

volatile unsigned long tanterior;
volatile unsigned long tnuevo;
volatile float frec;

void setup()
{
 Serial.begin(19200);
 pinMode(2,INPUT);
 pinMode(13,OUTPUT);  //Led
 attachInterrupt(0,myfunc,CHANGE);
}

void loop()
{
 Serial.println(frec);
}

void myfunc()
{
 if (digitalRead(2))
 {
   tanterior=tnuevo;
   tnuevo=micros();
   frec=1000000.0/(tnuevo-tanterior);
 }
 digitalWrite(13,!digitalRead(13));  //Led
}


La salida digital (dónde esta conectado el led de Arduino) la cambio de estado cada vez que entro a la rutina de interrupción sólo con fines de debug, ya que conecto el analizador lógico para ver que todo esta funcionando como debería.

Acerca de la pregunta de uno de los post por qué no puede ser LOW... entraría a la interrupción todo el rato que dure el pulso bajo (ya que es activación por nivel). Lo que te interesa es entrar una sólo una vez, para capturar el tiempo.

Hace tiempo escribí este post para cálculo de rpm de un coche => http://real2electronics.blogspot.com/2009/09/shift-lights-con-arduino.html

Saludos  ;)


Igor R.

Go Up