Circuito simulador SRF04 para Proteus

Fuente: RobotyPic.
4 del 9 de 2010

Muchas veces tenemos necesidad de simular circuitos bajo proteus pero hay componentes que no están disponibles. En este artículo se muestra como realizar un pequeño circuito gráfico para sustituirlo en los diseños como componente SRF04 mediante un procesador PIC16f876a programado con el compilador CCS. El objetivo es poder insertarlo en los diseños con Proteus para poder simular circuitos.

Mediante la variación de un potenciómetro se simula la distancia. Y se obtiene un ancho de pulso proporcional, siempre tras recibir un pulso de test tal y como lo haría el componente SRF04 en la realidad.

En el esquema de la simulación mostrado la entrada de generador de pulsos se sustituiría por la salida en el PIC que pediría la medida de distancia al SRF04. Y la señal de salida se llevaría a una entrada del PIC para medir el ancho de pulso y en consecuencia la distancia.

Aquí se puede ver las señales obtenidas en la simulación.


Y el esquema en Proteus.


A continuación el programa del PIC para el compilador CCS.

[+/-] Ver / Ocultar

#include <16F876a.h>                     //Driver del pic


#device adc=10                           //Configuración conversor AD a 10 bits
#fuses XT, NOWDT
#use delay (clock=4000000)


#byte trisb=0x86
#byte portb=0x06


#use standard_io(a)
#use standard_io(c)


#bit triger = PORTB.0                 //Bit 0 puerto B entrada petición distancia
#bit bit_eco = portb.1                //Bit 1 puerto B salida señal eco


#priority rtcc


/******************** Variables para lectura valor analógico ******************/


float val_dig;                //Guardará el valor digital de tensión entrada
float val_ana;                //Guardará el valor de la tensión entrada analógico


/********************** Variables para generación eco *************************/


int8 eco=0;         //Guardará valores de las señales eco en función de distancia
int8 Ancho_pulso=0;                      //Anchura pulso eco
int1 i=0;


/******************************************************************************/
/************************ FUNCIÓN GENERACIÓN PULSOS ***************************/

#int_Timer0
void Generacion_eco()
      {
      Ancho_pulso++;


      if (Ancho_pulso==1)
                bit_eco=1;


     if (Ancho_pulso==eco)
                bit_eco=0;


      set_timer0(0);
      }


/*******************************************************************************/
/****************** LECTURA PULSO DE CONTROL ***********************************/


#int_ext
void entrada_pulso ()
     {
     i=1;
     delay_ms(20);
     bit_eco=1;
     }


/*******************************************************************************/
/**** FUNCIÓN LECTURA ENTRADA CONVERSION AD (Simulación distancia) *************/

#int_timer1
void timer0_int()
     {
     val_dig=read_adc();            //Lectura canal analógico
     val_ana=(5.0*val_dig/1024.0);
     eco=((val_dig*255)/1024);      //valor de 10 bits conversor lo paso a 8 bits
     }


/*******************************************************************************/
/*************************** FUNCIÓN PRINCIPAL *********************************/


void main()
    {
    trisb=0x01;       //Configuración puerto B como salida y bit RB0 como entrada
    port_b_pullups(true);


/*********************** Configuración Interrupciones *************************/


    setup_adc_ports(AN0);                        //Canal de entrada analógico AN0
    setup_adc(ADC_CLOCK_INTERNAL);               //Fuente de reloj RC
    set_adc_channel(0);
    setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); //Config. timer1 para conversión AD
    setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8);  //Configuración timer0 para eco


/*********************** Habilitación Interrupciones *************************/


    enable_interrupts(int_ext);     //habilitar Rb0 para lectura pulso triger...
    ext_int_edge(H_TO_L);           //...por flanco de bajada
    enable_interrupts(INT_TIMER1);//Habilitar interrupción timer1 para lectura AD
    enable_interrupts(global);


/****************************************************************************/


     while(true)
        {
        if(i==1)
           {
           Ancho_pulso=0;
           enable_interrupts(INT_TIMER0);


           do
              { }
           while (bit_eco==1);
           disable_interrupts(INT_TIMER0);
           i=0;
           }
        }
/****************************************************************************/
     }




Finalmente una animación que muestra la simulación.




Todos los archivos; fuente para ccs, esquema para proteus y la animación demostrativa se pueden descargar del siguiente enlace:

http://freakshare.com/files/gnoxoeie/Simulador-sensor-srf04.rar.html


comments powered by DisqusRecomendar a un amigo