Circuito de entrada a PIC

Hola a todos, soy nuevo aca y en la electrónica en general, empeze hace unos dias a diseñar un anemómetro (medir velocidad del viento). La idea es usar un PIC con algunos displays de 7 segmentos y unos pocos pulsadores. Ahora estoy diseñando la parte del sensor, su componente principal va a ser un optoacoplador a ranura TCST2103.
Queria ver si alguien con experiencia puede echarle una ojeada al circuito del sensor a ver si creen que todo va a ir bien. Tengan en cuenta que el TCST2103 va a estar a unos 15 mtrs de la plaqueta conectado con cable tipo telefonico de dos pares. Mi miedo no es la caida de tensión en el cable sino el ruido que pueda llegar a entrar al PIC.
¿Es medio exagerado poner un optoacoplador (4N25) entre el sensor y el PIC?

Circuito señal.JPG

¿Que cambios les harian o que componentes agragarian?
Gracias y saludos!

TCST2103:
Forward voltage (emisor); 1.25V typ, 1.6V max
Collector emitter saturation voltage: 0.4V max
Current transfer ratio: 10% min, 20% typ

4N25:
Forward voltage (emisor); 1.3V typ, 1.5V max
Collector emitter saturation voltage: 0.5V max
Current transfer ratio: 20% min, 50% typ
 
Sencillo, pon un solo optoacoplador con una R de 100 Ohm cuanta menos R menos ruido.
2k2 para 15m... Así así

Edito: Perdón. No había leído que uno era de ranura. No soy muy fan, mejor un hall o un inductivo.
Deja los dos, pero en el segundo baja drásticamente la resistencia del led. El transistor sobra claramente, la señal se invierte por software que es gratis. La resistencia del colector también sobrará porque seguramente el pic tenga una interna activable por soft.

Claramente todo a 25mA, entrará 25 veces menos ruido que a 1mA
 
Última edición:
Gracias Scooter. No sabia eso de que a menos resistencia menos ruido. La razón por la cual decidí poner el transistor es que si haciendo circular 25mA (como vos me recomendás) por el led del TCST y suponiendo una CTR del 10% (peor de los casos) por el transistor interno de este optoacoplador circularia como máximo 2.5 mA, creo que demasiado poco para llegar a apagar completamente el segundo opto. Aunque es posible que me equivoque...

Sobre la resistencia pull-up interna del PIC tengo que investigar un poco sobre como activarla, creo que tenés razón y la del esquema sobra.

Gracias!
 
Finalmente construí el circuito y funcionó a la perfeccion (al menos sobre la mesa). Ahora solo me resta calibrarlo para que muestre la velocidad del viento en nudos y agregarle un disipador al regulador ya que calienta demasiado. Para el que le interese dejo el esquema y el codigo fuente. Si alguno quiere hacer una critica bienvenido sea, pero tengan en cuenta que es mi primer circuito :LOL:.

Gracias a scooter por la ayuda!

Código:
#include <16f628A.h>
#FUSES NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD, INTRC_IO
#use delay(clock=4000000)

//esta constante define el multiplicador que se usa para calibrar el anemometro
#define CONSTANTE 1

#byte trisa=0x85
#byte trisb=0x86
#byte porta=0x05
#byte portb=0x06

int t;                  //variable temporal de timer 1
char d1, d2, d3;        //bits activos en display n
unsigned int rps;       //revoluciones por segundo
unsigned int nudos;     //velocidad del viento en nudos

//entrada:  numero del 0 al 9
//devuelve: bits para el 7 segmentos (0 es prendido)
char mostrar_caracter(char caracter){
   switch(caracter){
   case 0:
      return 0b01000000;
      break;
   case 1:
      return 0b01111001;
      break;
   case 2:
      return 0b00100010;
      break;
   case 3:
      return 0b00110000;
      break;
   case 4:
      return 0b00011001;
      break;
   case 5:
      return 0b00010100;
      break;
   case 6:
      return 0b00000100;
      break;
   case 7:
      return 0b01110001;
      break;
   case 8:
      return 0b00000000;
      break;
   case 9:
      return 0b00010000;
      break;
   }
}

#INT_TIMER1
//ocurre cada medio segundo
void t1 () {
   char dt1, dt2, dt3; //variables temporales
   t = t + 1;
   if (t==2){
      t = 0;
      rps=get_timer0();
      set_timer0(0);
      nudos=rps * CONSTANTE;
      
      //actualizar displays
      dt3 = nudos % 10;
      nudos = nudos / 10;
      dt2 = nudos % 10;
      nudos = nudos / 10;
      dt1 = nudos;
      d1 = mostrar_caracter(dt1);
      d2 = mostrar_caracter(dt2);
      d3 = mostrar_caracter(dt3);
    }

   set_timer1(3036);
}


void main(){
   int d; //display actual en multiplexacion

   SETUP_TIMER_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
   SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_8);
   //SETUP_TIMER_2(T2_DISABLED);
   SETUP_CCP1(CCP_OFF);

   trisa = 0b00010000;
   trisb = 0b00000000;

   set_timer0(0);
   set_timer1(3036);

   //apagar todos los displays
   porta=0b10000011;

   //poner caracteres en 0
   d1 = mostrar_caracter(0);
   d2 = d1;
   d3 = d1;

   //habilitar interrupciones
   t = 0;
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   d = 1;
   while(true){
      porta=porta|0b10000011; //se apagan todos los displays
      if(d==1){
         portb = d1;
         OUTPUT_LOW(PIN_A1);
      }else if(d==2){
         portb = d2;
         OUTPUT_LOW(PIN_A7);
      }else{
         portb = d3;
         OUTPUT_LOW(PIN_A0);
      }
      delay_ms(3);

      d = d + 1;
      if(d==4){
         d=1;
      }
   }
}
Ver el archivo adjunto Anemometro.pdf
 
Atrás
Arriba