TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: rferrero en 19 de Noviembre de 2004, 10:21:00

Título: Programa A/D que no va
Publicado por: rferrero en 19 de Noviembre de 2004, 10:21:00

    Hola a todos. Dispongo de un sensor de infrarrojos, el GP2D12, supongo conocido por muchos. El caso es que cogi un ejemplo del subforo para simular y no va:

#include <16F876.h>

#device adc=10      // Conversión con 10 bits
#use delay (clock=4000000)
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use rs232(baud=9600, xmit=62, rcv=63) // PIN_C6=62 y PIN_C7=63

void main( void )
{
  long  valor;    
  float const resoluc= 5.0/1024.0;      // Conversión es con 10 bits  
  float voltios;

  setup_adc_ports ( ALL_ANALOG );        // Entrada analógica por RA0
  setup_adc ( ADC_CLOCK_INTERNAL );    // Reloj interno para el ADC
  set_adc_channel ( 0 );       // Canal 0 para convertir
 
  while ( 1 )                    
  {
      valor = read_adc();              
     
      voltios= valor * resoluc;    
                              
     printf("
 %f voltios -",voltios);
     
      delay_ms(200);            // Convierte cada 200ms
  }
}  

 
    Utilizo RS232 para sacar los resultados por pantalla y la patilla RA3. Que falla??
    El caso es que nada mas conectar la alimentacion, si, sale un valor, 1,63 V o los que sean, pero las siguientes medidas son siempre 0.

    Gracias. Rebotado Un saludo.
                 Ruben.

Título: RE: Programa A/D que no va
Publicado por: rferrero en 19 de Noviembre de 2004, 10:29:00

   Vaya, acabo de ver que el canal no era el correcto. Poniendo 3, aparecen medidas, pero no salen del valor 0,54 y 0,80 y pico. En teoria deberia ser el canal 8, no? Pues solo aparece una medida nada mas conectar la alimentacion. El resto son 0.
 
    Bueno, ahora pruebo con el canal 6 y parece que funciona mejor. Esto no parece muy exacto ...

    Alguien tiene alguna experiencia parecida con esto?

   
Título: RE: Programa A/D que no va
Publicado por: rferrero en 19 de Noviembre de 2004, 11:29:00

    Hasta donde llego a entender, poniendo como Vref+=Vdd y Vref-=Vss, y colocando la salida de la senal analogica del sensor en RA3, tengo que poner como setadcchannel = 3, 5 u 8, no?? Pues es que no alcanza valores superiores a la unidad.
 
    Esa declaracion de long que hay hecha ... no lo fastidia al multiplicar por la resolucion?? Porque es mezclar un entero con un float.

    Gracias de nuevo.

Título: RE: Programa A/D que no va
Publicado por: Modulay en 19 de Noviembre de 2004, 11:55:00
Tal y como está el programa,debes conectar el sensor al pin RA0,que es el canal que has seleccionado ( set_adc_channel(0) ).Si lo conectas en otro pin,cambias el cero por lo que corresponda.
Si le asignas a una variable de tipo entero un resultado o una varibale de tipo flotante se hace un redondeo que no tiene por qué causar problemas.
Saludos
Título: RE: Programa A/D que no va
Publicado por: rferrero en 19 de Noviembre de 2004, 12:22:00

    Ya lo he puesto (en RA0), pero da unos valores muy dispares. 2, 3 y hasta 4 y pico. Luego baja a 0 y apenas sube aunque varie la distancia.
    Alguien ha trabajado con este sensor??

   
Título: RE: Programa A/D que no va
Publicado por: pocher en 19 de Noviembre de 2004, 12:38:00
¿Esto es correcto:  #use rs232(baud=9600, xmit=62, rcv=63) ? El 62 y el 63 ¿no deberían de ser pines?

En los fuses cambia WRT por NOWRT, en una versión anterior había que poner WRT para que funcionase, pero ahora ya está corregido.

Un saludo
Título: RE: Programa A/D que no va
Publicado por: Modulay en 19 de Noviembre de 2004, 12:47:00
PIN_C6  y PIN_C7 son alias definidos en 16F876.h asociados a los valores que rferrero utiliza en la directiva,por lo que lo mismo da poner PIN_C6 que poner 62.
rferrero,puedes probar que el código está bien colocando un potenciómtero entre Vcc y masa y conectando el terminal común al canal AD del pic.Si ves que los resultados son coherentes párate a pensar que el problema está en el sensor.
Título: RE: Programa A/D que no va
Publicado por: Flugplatz en 23 de Noviembre de 2004, 05:04:00
aunque solo debería dar problemas en la primera lectura, pónle una pequeña pausa después de seleccionar el canal de conversión
Codigo:

set_adc_channel(0);
delay_ms(25);
valorAD = Read_ADC();



y también es conveniente usar el reloj externo como base de tiempos ya que el reloj interno es más inestable.

Codigo:

setup_adc(ADC_CLOCK_DIV_32);




Título: RE: Programa A/D que no va
Publicado por: rferrero en 28 de Noviembre de 2004, 05:26:00

    Bueno, más o menos sí que va. Ya. Por fin.  El programa estaba bien. El problema eran las conexiones. La de Vcc no era muy buena y a veces se soltaba. El caso es que lo he soldado y ahora va medianamente bien. Lo malo es que la medida varía bastante y es algo inestable.
    Gracias. Un saludo.