Autor Tema: Integrador de luz con PIC16F877  (Leído 4192 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado krin

  • PIC10
  • *
  • Mensajes: 9
Integrador de luz con PIC16F877
« en: 26 de Noviembre de 2004, 11:24:00 »
Hola. Necesito ayuda de como poder integrar una señal analogica de entrada que se mueve entre 0V y 5V en un intervalo de 10 segundos aprox. Alguien tiene idea de como poder hacer esto? Ayuda por favor

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Integrador de luz con PIC16F877
« Respuesta #1 en: 26 de Noviembre de 2004, 11:51:00 »
A qué te refieres exactamente con "integrar"?
Qué forma tiene esa señal?

Desconectado krin

  • PIC10
  • *
  • Mensajes: 9
RE: Integrador de luz con PIC16F877
« Respuesta #2 en: 26 de Noviembre de 2004, 12:06:00 »
Con la ayuda de un fototransistor recibo  señales luminosas entre 0 y 5 volts. La idea de integrar es sumar todos los valores que me entrega el fototransistor en un determinado intervalo de tiempo, 10 segundos, y a partir del valor de la suma total, si es mayor o menor que ciertos numeros, ejecutar distintos tipos de instrucciones.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Integrador de luz con PIC16F877
« Respuesta #3 en: 26 de Noviembre de 2004, 12:38:00 »
Tendras q pensar en cuantas muestras quieres capturar.A mas muestras,mas exacta será la media que obtengas. ¿quieres actuar en función de la suma total de todos los valores o en un valor medio?

Desconectado krin

  • PIC10
  • *
  • Mensajes: 9
RE: Integrador de luz con PIC16F877
« Respuesta #4 en: 26 de Noviembre de 2004, 13:44:00 »
Gracias por el interes Modulay.
En principio, la idea es actuar en funcion de la suma total, pero tambien puede ser en base al promedio. Cualquiera de las dos alternativas es buena. Algo de teoria he estado absorviendo, pero aun no entiendo como obtener los valores que el conversor A/D obtiene del fototransistor. Como podría saber que valores se acumularon en alguna variable que guarda la suma despues de pasado el tiempo de integración y que no sea a traves de una LCD? No entiendo tampoco una constante de resolucion que he visto en algunos programas del foro del tipo:

float const resoluc = 5/ 1024

Agradecería sugerencias por favor.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Integrador de luz con PIC16F877
« Respuesta #5 en: 26 de Noviembre de 2004, 14:26:00 »
Si no dispones de un lcd para visualizar datos,ó recurres a displays 7 segmentos ó a diodos led,no se me ocurre otra cosa.Vendría bien q te manejaras con algún software de simulación,eso te simplificaría bastante las cosas.
¿que pic vas a usar?
Lo de la constante es simple:
El AD del pic va a convertir el valor de tensión analógica presente en el canal al que conectes el sensor en un número:
valor = read_adc()
... de 8 ó 10 bits,dependiendo de como lo configures y del tipo de pic que sea.Si tu sensor te va a dar entre 0 y 5V y configuras el AD del pic para que trabaje a 10 bits (1024 valores),obtendrás el valor de tensión que entrega el sensor multiplicando "valor" por la constante resoluc.

Desconectado krin

  • PIC10
  • *
  • Mensajes: 9
RE: Integrador de luz con PIC16F877
« Respuesta #6 en: 26 de Noviembre de 2004, 14:41:00 »
Hasta el momento voy a usar el PIC16F877. Otra alternativa sería el pic16F870. La verdad no cuento con una LCD y aprender a usarla sería mas complejo. Pero con LEDs si cuento...pero como se pueden visualizar los valores en ellos? La verdad yo solo quiero saber el valor de la integración para implementar rutinas con IF y While, es decir solo quiero saber el valor total de la suma para a partir de este resultado continuar con la ejecucion del programa. Por ejemplo: si la suma total es mayor que 100 entonces poner en High una salida del PIC. Si la suma total es mayor que 200, entonces poner en High otra salida del pic.

 Voy a intentar a hacer un programa tentativo y lo subire al foro para ver como va y si me pueden dar una manito con el...


Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Integrador de luz con PIC16F877
« Respuesta #7 en: 26 de Noviembre de 2004, 14:52:00 »
Echale un ojo a este hilo:
http://miarroba.com/foros/ver.php?foroid=46840&temaid=2307248
Quizá te pueda ayudar algo
Un saludo

Desconectado krin

  • PIC10
  • *
  • Mensajes: 9
RE: Integrador de luz con PIC16F877
« Respuesta #8 en: 26 de Noviembre de 2004, 16:35:00 »
Muy interesante Modulay. Gracias por el link... me da mas ideas de como implementar el programa. Por lo que se ve te manejas de las mil maravillas en esto de programar PIC en C...

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Integrador de luz con PIC16F877
« Respuesta #9 en: 26 de Noviembre de 2004, 23:57:00 »
Si necesitas ayuda sobre como hacer el programa del conversor, puedes usar la opción "buscar" que la tienes más arriba. En ejemplos para simular no sé si también había algo hecho, lo que sí te aseguro es que en el apartado de C hay muchos ejemplos hechos.

Respecto a mostrar el resultado de la suma puedes usar comunicación RS232 con el PC y que te la muestre en pantalla.

Lo dicho, lo mejor es que presentes el programa y nosotros te lo arreglamos para que puedas ver el resultado.

Un saludo

PD. Supongo que el programa PROTEUS de simulación no sabrás utilizarlo, para lo que quieres te vendría de perlas. Para otras cosas a veces falla.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Integrador de luz con PIC16F877
« Respuesta #10 en: 27 de Noviembre de 2004, 02:56:00 »
Pocher ¿en qué cosas te suele fallar a tí proteus?

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Integrador de luz con PIC16F877
« Respuesta #11 en: 27 de Noviembre de 2004, 06:00:00 »
Pués lo último y no estoy muy seguro hasta que lo pruebe físicamente ha sido con una comunicación entre 3 PICs.

Otra cosa que recuerde fué una temporización con el TMR2, creía que no funcionaba la temporización pero sí lo hacía, el "único problemilla" era que en lugar de encender el LED cada segundo lo hacía cada 17 minutos.

Leer caracteres de la LCD me parece que támpoco se dejaba.

Hice una lista con cada cosa que me iba saliendo pero al final la tiré a la basura (habían unas cuantas cosillas).

Para los compañeros que esteis leyendo estas líneas, os he de decir que con el PROTEUS se aprende un montón, eso sí tienes que tener paciencia con los bugs, y cuando creas que lo estas haciendo bien y el PROTEUS lo saca mal hacer una prueba con componentes reales.

Un saludo

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Integrador de luz con PIC16F877
« Respuesta #12 en: 27 de Noviembre de 2004, 06:12:00 »
Eso es lo que me hizo fiarme poco al principio,pero hoy dia ya no puedo vivir sin él.El tema de las temporizaciones y encender y apagar leds en tiempo real a proteus no le va mucho,eso sí que lo he visto con mis propios ojos

Desconectado krin

  • PIC10
  • *
  • Mensajes: 9
RE: Integrador de luz con PIC16F877
« Respuesta #13 en: 27 de Noviembre de 2004, 08:23:00 »
Hola.
Acá escribi una version preliminar en C para el integrador. Se que le falta mucho aun, instrucciones que tal vez son necesarias y que no he considerado por inexperiencia, por ello no la he compilado (en PICC q es el que uso). Falta el como identificar los valores que definen un determinado nivel de voltaje que sirve de discriminacion en rutinas condicionales y eso no tengo idea como hacerlo (una alternativa es por prueba y error pero no se de donde empezar)... En el programa se describe mas detalladamente...


/////////////////////////////////////////////////////////////////////////////////////////////////////////
////                                                                                                                         ////
////     integrador de voltaje entre 0 y 5 volts provenientes de                             ////
////     fototransistores. Los fototransistores se conectan al puerto A/D del         ////
////     pic 16f877a. La integracion es por 10 segundos. la integracion es sobre   ////
////     diferentes colores de papeles que daran a los fototransistores diferentes////
////     niveles de voltajes dependientes del color del papel. para cada color es   ////
////     necsario fijar un valor de referencia para que el microprocesador              ////
////     pueda identificar de que color se trata.                                                      ////
////                                                                                                                        ////
////////////////////////////////////////////////////////////////////////////////////////////////////////



#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT     //no se si esto está bien
#use delay(clock=4000000)

short cont;
const int escala = 255;


#device adc=8
//#device adc=10
   


#define INTS_PER_SECOND 15          //numero de desbordes del tmr0 por segundo 4000/(256*256*4)
BYTE segundos;                     //almacena segundos transcurridos desde empieza   la cuenta
BYTE int_count;                            // contador de interrupciones


#int_rtcc                                  // Esta funcion es llamada cada vez
void clock_isr() {                      // que el timer0 se desborda (255->0).
                                                // Para la frecuencia de 4MHz es aprox.
    if(--int_count==0) {             // 15 veces por segundo
      ++segundos;
      int_count=INTS_PER_SECOND;
    }

}

void main() {

   long sensor1 = 0; // tres salidas fototransistores conectados al porta A/D
   long sensor2 = 0;
   long sensor3 = 0;
 
   long suma1;       //variables que acumulan la suma de voltajes
   long suma2;
   long suma3;



   set_tris_b(0);                                 //puerto b como entrada
   set_tris_c(1);                                  //puerto c como salida
   setup_adc_ports(ALL_ANALOG);    //configuracion de entradas analogas
   setup_adc(ADC_CLOCK_INTERNAL);
         
   

                     
   while (1)                    
        {
                   
                cont=input(PIN_B2); // entradas de activacion del contador
      

                if(cont==0)
                {
                int_count=INTS_PER_SECOND;
                  set_rtcc(0);
                setup_counters( RTCC_INTERNAL, RTCC_DIV_256);
                enable_interrupts(INT_RTCC);
                enable_interrupts(GLOBAL);  
                }
       
                if(segundos<=10)
                {
                set_adc_channel(0);
                valor1=read_adc();  
                suma1 = suma1 + valor1;
                delay_ms(200);                            
                set_adc_channel(1);                    
                valor2=read_adc();                    
                suma2 = suma2 + valor2;
                delay_ms(200);
                set_adc_channel(2);
                valor3=read_adc();
                suma3 = suma3 + valor3;
                delay_ms(200);
                }
               
                if(suma1>x&&suma1<y)    // x e y serian la suma de voltajes
                {                                   // que definen los niveles en que debe encontrar
                output_bit(PIN_C1,1);   // suma 1 para que corresponda al color rojo por
                }                                    //ejemplo
                else
                {
                output_bit(PIN_C1,0);
                }  

                if(suma2>z&&suma2<w)    // idem para otro color
                {                        
                output_bit(PIN_C2,1);  
                }
                else
                {
                output_bit(PIN_C2,0);
                }  

                if(suma3<a)              // idem para otro color
                {                        
                output_bit(PIN_C3,1);  
                }
                else
                {
                output_bit(PIN_C3,0);
                }    

           }
}



-----------------------------------------------


Agradezco comentarios...

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Integrador de luz con PIC16F877
« Respuesta #14 en: 27 de Noviembre de 2004, 10:23:00 »
Bueno,hay que pulir unos cuantos detalles.Si has intentado compilar el código te habrás dado cuenta de que contiene errores,tales como usar variables sin haberlas declarado.Ese tema se trata en el mircocursillo del enlace que te dí.Creo que debes leer un poco más sobre C para seguir adelante con tu proyecto.Te pongo otro enlace en el que podrás pillarte un código que usa el AD del pic para q te pueda servir un poco de guía:
http://miarroba.com/foros/ver.php?foroid=256746&temaid=1725528


 

anything