uControl
Enero 20, 2017, 06:45:30 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: Contador con timer0 y temporizador con timer1 para realizar un cuentavueltas RPM  (Leído 174 veces)
0 Usuarios y 1 Visitante están viendo este tema.
fbelmonte
PIC10F
*
Desconectado Desconectado

Mensajes: 3


« : Noviembre 23, 2016, 10:26:45 »

Estimados antes que nada mis saludos a todos y espero me puedan ayudar.
Estoy haciendo un cuentavueltas o contador de revoluciones por minuto (RPM), utilizo el PIC 16F876A. Mi idea de contador de revoluciones es la siguiente:
-Utilizando el timer1 y su interrupción, cuento la cantidad de pulsos que ingresan por el pin del timer0 durante 1 segundo y luego multiplico esa cantidad de pulsos por 60, lo que me daría como resultado los pulsos por minuto.
Todo esto esta dentro de un programa mucho mas complejo que maneja teclado, LCD, menúes, etc.
En la simulación por proteus me funciona a la perfección, pero en el circuito real no logro que el pin del timer0 me tome los pulsos (flancos de bajada). Mi tren de pulsos está compuesto por un sensor hall, que pasa por un comparador LM311 y la salida de este va al pin del timer0.
Cuando el imán esta alejado del sensor, mi comparador me da +5V, cuando acerco el imán, el comparador pasa a 0V. Ahora bien, cuando conecto este circuito al pic (salida del LM311 a la entrada timer0) la tensión de 5V pasa a ser 0,04V. Es decir, la "baja a tierra"  cabezaso a la pared.
Según el datasheet del pic esa entrada es  schmitt trigger por lo tanto no debería tener ningún requerimiento extraño de circuito.
Alguno ha tenido un problema similar??? Si es necesario pego las partes del código involucradas en esta tarea.

Desde ya muchas gracias!!!
En línea
el_vpi
Moderador
PIC18F
******
Desconectado Desconectado

Mensajes: 1344



« Respuesta #1 : Noviembre 24, 2016, 09:54:25 »

el lm311 tiene salida de colector abierto. Pone una R de 1K a 5V y deberia salir andando.

saludos, Daniel.
En línea
fbelmonte
PIC10F
*
Desconectado Desconectado

Mensajes: 3


« Respuesta #2 : Noviembre 29, 2016, 07:47:07 »

el lm311 tiene salida de colector abierto. Pone una R de 1K a 5V y deberia salir andando.

saludos, Daniel.

Muchas gracias por tu pronta respuesta Daniel. Eso lo había realizado y no tuve suerte. Colocando esa resistencia la tensión es de 0,15V cuando deberían ser 5V. Alguna otra idea???

Saludos, Fabricio.
En línea
el_vpi
Moderador
PIC18F
******
Desconectado Desconectado

Mensajes: 1344



« Respuesta #3 : Noviembre 30, 2016, 09:08:49 »

mmm... pregunta tonta... como tenes configurado ese pin ?
pone el programa para verlo.

saludos, Daniel.
En línea
fbelmonte
PIC10F
*
Desconectado Desconectado

Mensajes: 3


« Respuesta #4 : Diciembre 01, 2016, 12:11:57 »

mmm... pregunta tonta... como tenes configurado ese pin ?
pone el programa para verlo.

saludos, Daniel.

El código completo es bastante extenso.. envío los bloques involucrados en la tarea de contar los pulsos:
----------------------------------------------------------------------------------------------------------------
/*Funcion que inicializa el PIC*/
void MCU (){
   inputKey = 0;
   refresh = 0;
   output_low(pin_C3);          //lcd inicia apagado

   set_tris_a(0x10);             //seteo puerto A, solo el pin RA4 como entrada (timer0)
   output_a(0x0);                //las salidas inician en 0
}
----------------------------------------------------------------------------------------------------------------------------

La interrupción generada por el Timer1, que funciona como temporizador de 1 segundo y durante ese tiempo se cuentan pulsos recibidos por el pin del Timer0:
-------------------------------------------------------------------------------------------------------------------------------------------------
#INT_TIMER1
void timer_irg(){
   counterT0++;
   set_timer1(3036);              // con 3036 genero una cuenta de 0,1 seg
   if (counterT0 == 10){         // 10 overflows da como resultado 1 seg
  
      if (sequence == CRONOMETRO){          //utilizo tambien el timer1 para otra funcion que es un cronómetro, aqui verifico
         counterT0 = 0;                               // resetea el contador de overflow del timer0
         counterT1 = counterT1 + 1;
      }

      else{                                 //si no estoy en la funcion Cronometro, entonces estoy en la funcion contador de RPM
      counterT0 = 0;                    //reseteo el contador de overflow del timer0
      counterT1 = get_timer0();    //obtengo los pulsos que ingresan por el pin del timer0, y los cuento
      set_timer0(0);                    //reseteo el contador del timer0    
      }
   }
}
-------------------------------------------------------------------------------------------------------------------------------------------------------

Una vez que termina la rutina de interrupción del timer1 pasa a la funcion que calcula las RPM:
------------------------------------------------------------------------------------------------------------------------------------------------------

void CalcularRPM(){
   if(stateTotal == CONFIG){
      set_timer0(0);                         // resetea contador timer0
      set_timer1(3036);                    // setea el timer1 para tener una interrupción cada 0,1seg
      counterT1 = 0;                        // pone a 0 la variable donde se guarda el nro de pulsos recibidos por el pin del timer0
      enable_interrupts(INT_TIMER1);
      stateTotal = BUCLE;
   }else if(stateTotal == STATE_BUCLE){
        //nada para hacer
   }
}
----------------------------------------------------------------------------------------------------------------------------------------------------

y finalmente agrego la parte de los seteos que van en el menu principal:
-------------------------------------------------------------------------------------------------------------------------------------------------------
void main(void){

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1);      //CONTADOR
   set_timer0(0);
   setup_timer_1(T1_INTERNAL| T1_DIV_BY_8);           //TEMPORIZADOR
   set_timer1(0);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   enable_interrupts(GLOBAL);
-------------------------------------------------------------------------------------------------------------------------------------

En línea
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.089 segundos con 25 consultas. (Pretty URLs adds 0.006s, 2q)