lunes, 13 de octubre de 2014

Detectores de metales BFO con microcontrolador PIC16F628A

Teoría de funcionamiento del detector de metales BFO con PIC

Este detector de metales esta basado en los detectores BFO, o detección por batido de frecuencia, en este caso usamos un microcontrolador para medir la frecuencia del oscilador
Para el oscilador usamos un oscilador LC(bobina condensador) tipo Colpits a transistor.
Funcionamiento del oscilador Colpitts.
El oscilador Colpitts es un tipo de oscilador es muy utilizado en generadores de frecuencia de alta calidad y se usa principalmente para obtener frecuencia por encima de 1 Mhz. Su estabilidad es superior a la del oscilador Hartley.
Para poder lograr la oscilación este circuito utiliza un divisor de tensión formado por dos capacitores: C1 y C2.
De la unión de estos capacitores sale una conexión a tierra. De esta manera la tensión en los terminales superior de C1 e inferior de C2 tendrán tensiones opuestas.
La realimentación positiva se obtiene del terminal inferior de C2 y es llevada a la base del transistor a través de una resistencia y un condensador.
A estas frecuencias sería muy difícil utilizar el oscilador Hartley debido a que las bobinas a utilizar serían muy pequeñas.
La frecuencia de oscilación de este tipo de oscilador está dada por:
fo  = 1 / [2π x ( LC)1/2].

Este oscilador ha sido adaptado y modificado para que pueda trabajar con el microcontrolador.
Este es el esquematico.

El oscilador es mostrado a continuación.

 Funcionamiento
El funcionamiento del microcontrolador para detectar metales se basa en la misma idea de los detectores de batido, pero en este caso el microcontrolador funciona como un frecuencímetro, que mide la frecuencia generada por el oscilador anterior, usando el TMR1.
Para poder medir la frecuencia a través del pin TMR1CKI, utilizamos el siguiente circuito con transistor para adaptar la onda seno a la entrada TTL.

Microcontrolador
El microcontrolador se encarga de arrancar y parar el oscilador, para ayudar a estabilizar la frecuencia ya que todo oscilador varia su frecuencia por cuestiones de temperatura humedad y mil razones mas.
El programa del micro (PIC16F628A) usa dos etapas de detección:
Calibracion: con el led rojo encendido mide varias veces la frecuencia del oscilador promediando varias muestras, hasta que esta frecuencia es lo mas estable posible, cuando es estable, guarda el dato para usarlo para detectar cambios de frecuencia.
Deteccion: led verde encendido, en esta etapa el micro mide la frecuencia promediando varias veces, y luego compara con el valor guardado, si es diferente suena el buzzer y enciende el led azul. Si el valor ha variado de una manera muy constante, el  programa regresa a la calibración, para estabilizarse y dejar de activar la alarma de metal, osea el buzzer.
Diseño del circuito impreso hecho en eagle

El secreto para que el oscilador funcione esta en los condensadores verdes que son los mejores para hacer osciladores estables.


Codigo fuente en Mikroc Pro for PIC
#include 
// Definicion de constantes usadas en el programa
#define Calibr    0b00000001
#define deteccion 0b00000010
#define metal     0b00000100
#define NoOSc     0b00000011

// Esta funcion inicializa el TMR1 para que funcione como frecuencimetro
   void Tmr1Ini(){
   t1con.T1OSCEN=0;  //oscilador externo deshabilitado
   t1con.b2=0;
   t1con.b5=0;
   t1con.b4=0;
   t1con.TMR1CS=1;   //Reloj externo
   t1con.TMR1ON=0;      //TMR1ON
   }

// Funcion que lee el frecuencimetro formado con el TMR1
unsigned OscRd(){
   unsigned  Cont=0;// Variable de 16 bits para almacenar el valor del TMR1
   TMR1H=0;  // Borramos los registros del TMR1
   TMR1L=0;
   t1con.TMR1ON=1; // Habilitamos el TMR1 para que empieze a contar
   delay_ms(200);   // esperamos un tiempo para que cuente todos los pulsos
   t1con.TMR1ON=0; // detenemos el conteo
   Hi(Cont)=TMR1H;     // transferimos los valores de los registros contadores a
   Lo(Cont)=TMR1L;
   return Cont;    // retornamos el valor
   }

void buzzer(){
unsigned short j;
    for(j=0;j<100 16="" bits="" bucle="" buzzer="" cero="" cmcon="0x07;" comparamos="" comprobacion="" configuracion="" de="" del="" delay_ms="" delay_us="" deteccion="" diferentes="" el="" en="" for="" funcionamiento="" i="" if="" j="0;j<5;j++){" leds="" leemos="" main="" micro="" nuevamente="" oscilador="" porta="0b00000000;" portb.b0="0;" portb="0;" prinsipal="" puertos="" registros="" rutina="" short="" si="" son="" t0="OscRd();//" t1="OscRd();" t2="" t3="" tmr1ini="" trisa="0b11111000;" trisb="0b11011110;" una="" unsigned="" usadas="" valores="" variable="" variables="" void="" while="" y="">(T1+3))|(T0<(T1-3)))// y si son diferentes entre ellos
  {T2++; if(t2>2){porta=metal; buzzer();porta=deteccion;T2=0;}}// se ha detectado variacion lo cual indica metal
  else{porta=deteccion;T2=0; }// si no seguimos buscando
  }else{porta=NoOSc;T2=0;}     // fallo del oscilador colpits no tiene bobina o esta bloqueado

  }

}





5 comentarios:

  1. Buenas trades,buen proyecto, podrías publicar una imagen más clara de diagrama y que transistor lleva es oscilador.

    ResponderEliminar
  2. hola nunca use el mikroC para programar, pero por lo que veo no estaría completo el programa, o me equivoco?. sería de utilidad en caso que falte el código de main compartirlo o que el mismo sea completo. si es así te lo adapto también a picc y lo comparto.

    ResponderEliminar