Go Down

Topic: Entender este código control RPM motor (Read 4291 times) previous topic - next topic

Metaconta

Oct 10, 2015, 05:37 am Last Edit: Oct 10, 2015, 05:38 am by Metaconta
Hola mi muy distinguidos amig@s:

Aquí abajo un código que mira las RPM de un ventilador y que tiene el cable amarillo. Si se fijan en el vídeo de abajo tiene una resistencia en el cable amarillo.

1. ¿Realmente hace falta esa resistencia?

2. ¿No es mejor poner el cable amarillo directamente a Arduino? (Juraría que el cable amarillo suelta pulsos por cada vueltas o dos vueltas cuando el ventilador de 12V está funcionando).



Este es el código de ver las RPM del ventilador.
Code: [Select]
int NbTopsFan;
int Calc;

int hallsensor = 2;

                        
typedef struct{              
  char fantype;
  unsigned int fandiv;
}fanspec;

//Definitions of the fans
fanspec fanspace[3]={{0,1},{1,2},{2,8}};

char fan = 1;  

void rpm ()    
{
 NbTopsFan++;
}

 
void setup()
{
 pinMode(hallsensor, INPUT);
 Serial.begin(9600);
 attachInterrupt(0, rpm, RISING);
}
void loop ()
{
   NbTopsFan = 0;  
   sei();  
   delay (1000);  
   cli();
   Calc = ((NbTopsFan * 60)/fanspace[fan].fandiv);
   Serial.print (Calc, DEC);
   Serial.print (" rpm\r\n");
}



El código que menos entiendo es este:
Code: [Select]

//Definitions of the fans
fanspec fanspace[3]={{0,1},{1,2},{2,8}};



3. ¿Para qué es este código y que funciones hace?

Ver vídeo.
https://www.youtube.com/watch?v=0wg3va_KOWk

Un cordial saludo.

_jose_

Diria que la resistencia es para limitar el voltaje ,si el ventilador esta alimentado a 12v por logica la señal que envia por el cable amarillo tambien deberia ser de 12v con el consiguiente peligro de cascar la entrada del arduino.en cuanto al codigo parece que define una estructura de datos para varios tipos de ventiladores segun los sensores hall que lleven .en este caso parece que lleva dos,por eso usa el segundo elemento del array de la variable fanspace que es del tipo fanspec (definida por struct).luego usa una interrupcion para captar las señales y calcular las revoluciones.

Metaconta

Hola:

Sería raro lo de la resistencia, ya que suelen proporcionar el cable amarillo del tacómetro 5 V por cada vuelta o cada dos vueltas depende  del ventilador.

Aún no entiendo exactamente el array que comenté arriba, esos números. Dijiste tipo de ventilador. Si, ¿Y?

Mirando más el código está    cli(); y sei();. ¿Qué son?

Saludos.

noter

Hola.
No tiene mucha lógica la definición de esa estructura, ni ese array, pues no está utilizando prácticamente nada de los mismos. Tan sólo define un parámetro útil, que es el número de pulsos por vuelta (dos para tipo fan=1). Para eso, sencillamente con definir directamente ese número valdría:
Code: [Select]

static int NbTopsFan; // contador de impulsos.
const int fandiv = 2; // dos pulsos por vuelta
const int hallsensor = 2; // pin 2, que está unido a interrupción 0.

void rpm ()     // se llamará cada vez que se pruduce la interrupción
{
 NbTopsFan++;
}

 
void setup()
{
 pinMode(hallsensor, INPUT);
 Serial.begin(9600);
 attachInterrupt(0, rpm, RISING);
}
void loop ()
{
   NbTopsFan = 0;
   sei();   
   delay (1000); 
   cli();
   int Calc = ((NbTopsFan * 60)/fandiv);
   Serial.print (Calc, DEC);
   Serial.print (" rpm\r\n");
}


En cuanto a sei y cli, lo que hacen respectivamente es activar / desactivar las interrupciones. Entonces, establecemos las interrupciones, hacemos un delay de un segundo y desactivamos las interrupciones. Es decir, mientras dura ese delay, cada vez que se produce una interrupción por un tick, se ejecuta rpm(), que suma un pulso. Cuando termina el delay se desactivan las interrupciones para que no siga contando, y se hace el cálculo con los impulsos que hemos contado.

_jose_

Hola:

Sería raro lo de la resistencia, ya que suelen proporcionar el cable amarillo del tacómetro 5 V por cada vuelta o cada dos vueltas depende  del ventilador.

Aún no entiendo exactamente el array que comenté arriba, esos números. Dijiste tipo de ventilador. Si, ¿Y?

Mirando más el código está    cli(); y sei();. ¿Qué son?

Saludos.
Una estructura es un conjunto de variables agrupadas en un mismo nombre a las que se accede por la notacion de punto ,como en las propiedades o metodos de los objetos.se define una estructura llamada fanspec ,que como veras ,esta compuesta por dos vaiables ,una tipo char llamada fantype  y otra tipo unsigned int llamada fandiv.para usar esta estructura ,se define una variable que es de tipo fanspec ,en este caso la llama fanspace ,esta variable,recuerda que tiene dos elementos y accederiamos a ellos por notacion de punto,con fanspace.fantype accedemos a la variable char y con fanspace.fandiv a la unsigned int ,es decir cada variable tiene a su vez dos valores.pero ademas se puede crear un array de este tipo ,como es el caso .si creamos un array de tres variables del tipo fanspec tendremos en total 2*3 = 6 elementos,que son los que ves entre llaves.como dice noter en este caso es del todo inutil.en cuanto al tipo de ventilador ,lo que dije exactamente es tipo de ventilador segun sensores ,porque me imagino que habra ventiladores de 2 ,4 o 8 sensores,no lo se.en cuanto a la resistencia no se me ocurre otro motivo que el comentado,pero a ver si alguien mas puesto en electronica nos alumbra.

Metaconta

#5
Oct 12, 2015, 12:29 pm Last Edit: Oct 12, 2015, 01:15 pm by Metaconta
Buenas:

Si alguien sabe hacer un pequeño código más simplificado, menos engorroso y ameno, mejor que mejor. No digo optimizado ya que si hay que actualizarlo, se complica.

Voy a coger un ventilador con tacómetro que tengo y me pongo hacer pruebas, si funciona, subo un vídeo.

Muchas gracias por las explicaciones, ahora lo pillo mejor.


Edito:
Buscando más información he encontrado estas cosas.
attachInterrupt

http://www.prometec.net/interrupciones/


https://www.youtube.com/watch?v=lgttxSregzM

Por lo que veo en las LCD no cuenta los RPM en tiempo real, sino que cada cierto tiempo te lo muestra de forma lenta como algo más d eun segundo.

noter

Si has visto el código que he puesto yo, creo que poco más se puede simplificar.

Metaconta

¡¡¡Dios mio, se me pasó!!!

Gracias por el código, lo has hasta explicado con líneas de textos. Voy a probarlo con ansias, antes a ver si realmente da pulso de 5 V el tacómetro.

Esta parte del código.
Code: [Select]
attachInterrupt(0, rpm, RISING);

Presisamente donde dice RISING. ¿Qué significa?

Saludos.

_jose_

#8
Oct 12, 2015, 03:05 pm Last Edit: Oct 12, 2015, 03:08 pm by _jose_
¡¡¡Dios mio, se me pasó!!!

Gracias por el código, lo has hasta explicado con líneas de textos. Voy a probarlo con ansias, antes a ver si realmente da pulso de 5 V el tacómetro.

Esta parte del código.
Code: [Select]
attachInterrupt(0, rpm, RISING);

Presisamente donde dice RISING. ¿Qué significa?

Saludos.
Esta explicado en el enlace que pones a prometec y en la referencia a atachinterrupt.tienes varias maneras de disparar la interrupcion ,con RISING la interrupcion se produce cuando la entrada que recibe el impulso pasa de LOW a HIGH.

surbyte

RISING flanco de subida.
La interrupción se dispara cuando la tensión en el pin 2 del arduino pasa de LOW a HIGH.

Metaconta

Buenas:

¿No es lo mismo dejarlo en HIGH?

Ya que en este caso lo que importa es cuando detecte el HIGH o alto o 1 ó 5 V. Dice que el RISING es cuando detecta el LOW al HIGH. Detecta cambio de flanco, pero si soloen HIGH también lo detecta.

¿O es qué al volver a LOW y luego cuando se pone en HIGH no hace nada?

Si es así, para eso si que se usa RISING.

Saludos.

surbyte

Tienes cuatro posibles disparos
LOW
Low to High o RISING
HIGH
High to Low o FALLING

Cada vez que pase de 0->1 tienes sun flanco de subida y un disparo de la interrupcción.
No hay mucho mas que decir. Si eso no se ajusta a tu necesidad usas otra opción.

Metaconta

Entendido.

En este trozo de código:

Code: [Select]
void loop ()
{
   NbTopsFan = 0;
   sei();   
   delay (1000);
   cli();
   int Calc = ((NbTopsFan * 60)/fandiv);
   Serial.print (Calc, DEC);
   Serial.print (" rpm\r\n");
}


Precisamente donde pone:

Code: [Select]
delay (1000);

Lo que equivale 1 seg. ¿Hal algún problema si lo pones en menos tiempo?

Se acerca más en tiempo real los datos del RPM. Lo que no se si Arduino UNO no es capaz, pero un DUE lo hará de perlas y un Raspberry ni te cuento, como solo me interesa el UNO me quedo con él.

¿Alguna opinión al respecto?

Saludo.

surbyte

Claro que lo hay, son las lecturas en 1 segundo que luego te dan esta expresión

Code: [Select]
int Calc = ((NbTopsFan * 60)/fandiv);

Si disminuyes a 100 mseg x ejemplo la ecuación cambia a

Code: [Select]
int Calc = ((NbTopsFan * 60 * 10)/fandiv);




Metaconta

Buenas:

Mirando el serial. Se presenta los datos en cada segundo y lo quiero en tiempo real o menos tiempo posible el refrezco, que luego quiero pasarlo al LCD.

Con Arduino UNO a lo mejor no se puede porque es muy lento con Arduino DUE es potente y no se si se puede hacer, tal como pasa con los tacómetros de los coches y con Raspberry Pi 2 se peude hacer si o si.

Cambiando de tema y haciendo pruebas. El resultado sin tener un tacómetro, en realidad estoy con un pulsador pulsándolo, en este caso sin pulsar e incluso pulsado me aparece esto.

Code: [Select]
2150 rpm
29938 rpm
24508 rpm
26968 rpm
26068 rpm
26278 rpm
27178 rpm
26458 rpm
25888 rpm
23698 rpm
28498 rpm
27838 rpm
24328 rpm
25948 rpm



Supuestamente tiene que dar 0 RPM si no hace nada en la entrada del tacómetro, pin 2. Cuando empiece a pulsar el pulsador, tiene que pontar los pulsos, incluido los rebotes.

¿Qué es lo que ocurre?

Saludos.

PD: ¿No habrá al final Ardiuno TRE? ¿El proyecto se ha abandonado?

Go Up