Autor Tema: ADC con 10 bits  (Leído 2977 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
ADC con 10 bits
« en: 24 de Febrero de 2006, 16:40:00 »
Hola, tengo una gran duda como configuro un ADC de 10 bits para un 18F2550???? Pues mi algoritmo no funciona bien o eso es lo que me parece

#byte TRISA=0xF92
#byte ADCON2=0xFC0
#byte ADCON1=0xFC1
#byte ADCON0=0xFC2
#byte ADRESL=0xFC3
#byte ADRESH=0xFC4

#define modo      recibe[0]
#define param     recibe[1]
#define h         envia[0]
#define l         envia[1]

int8 recibe[2];                  //declaramos variables
int8 envia[2];

void main(void) {
   TRISA=0xFF;                      // Todos entrada
   ADCON1=0b00001010;     //Puerta A entradas analógicas
   ADCON0=0b00010001;     //ADC en On, seleciona canal AN4
   ADCON2=0b10111110;

   usb_init();                      //inicializamos el USB
   usb_task();                      
   usb_wait_for_enumeration();      
   while (TRUE)
   {
      if(usb_enumerated())                      //si el PicUSB está configurado
      {
         if (usb_kbhit(1))                      
         {
            usb_get_packet(1, recibe, 2);
            switch (modo)
            {
               case 1:                          // Encendemos el envio del ADC
                  {
                  bit_set(ADCON0,1);                //Inicia la conversión
                  while(bit_test(ADCON0,1));    //Fin de conversión ??
                  h=ADRESH;
                  l=ADRESL;
                  usb_put_packet(1, envia, 2, USB_DTS_TOGGLE);
                  }
            }         }      }   }}


Bueno, es el extracto de lo que hago, pero no me envia bien los datos de la conversion ADC, no se en que estoy fallando.... Saben si se puede hacer utilizando los comandos del CCS? el read_adc()??? Y como seria esa configuracion?

Un abrazo.Sonrisa GiganteSonrisa Gigante
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: ADC con 10 bits
« Respuesta #1 en: 24 de Febrero de 2006, 16:59:00 »
Colocando esta directiva en la parte de preprocesado (por ejemplo,justo después de #include "18F2550.h") te debería valer:

#device ADC=10

De todas formas,tl y como dices te sería mas facil usando las funciones que ya trae implementadas CCS para el manejo de los conversores:

Para configurar los canales que vas a usar y cual va a ser la tension de referencia...

setup_adc_ports(RA0_RA1_RA3_ANALOG);  // RA0,RA1 y RA3 entradas analógicas //                                                                      // Vref = VDD
setup_adc(ADC_CLOCK_INTERNAL);  // Reloj interno

Si vas a usar varios canales,antes de hacer una lectura en una canal,debes activarlo:

set_adc_channel(0);  // Activamos canal 0

Si solo usaras un canal,con activarlo una única vez al principio sería suficiente.
Y cuando quieras hacer una lectura en alguno de los canales,basta con hacer lo siguiente:

valor = read_adc();  // Sin olvidar que si el ADC está a 10 bits,la variable valor debe                                 //  ser mínimo una word.

Cuando usas un único canal,debes dejar pasar un tiempo mínimo entre lectura y lectura,que ronda los 10 us.Si por el contrario,realizas lecturas en diferentes canales,este tiempo mínimo es mayor.Estos tiempos vienen especificados en el datasheet.

Te pongo un ejemplo de un voltímetro que hice a ver si te ayuda

Codigo:


#include <16F876.h>
#device adc=8
#fuses XT,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=10000000)
#include <math.h>


#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

#byte PORTB = 0x06
#byte PORTC = 0x07



void calcula_voltaje(long int val,long int &dec,int &ent)
   {
   const int escala = 255;       // Escala del conversor ADC (8 bits)
   const float v_max = 25.2;     // Voltaje máximo que entrega la fuente
   float voltaje,fraccion;
   voltaje = (val*v_max)/escala;
   ent = floor(voltaje);
   fraccion = fmod(voltaje,ent);
   fraccion = fraccion*10;
   fraccion = floor(fraccion);
   dec = floor(fraccion);
   }


void separa_unidades(int entero,int &uni,int &dec)
   {
   if (entero < 10)
     {
     uni = entero;
     dec = 10;
     }else {
     dec = entero/10;
     uni = entero - (dec*10);
     }
   }


void tabla_display(int &x,boolean punto)
   {
   if (punto)
   {
   switch(x) {
      case 0: x = 0b00010000;
      break;
      case 1: x = 0b01111100;
      break;
      case 2: x = 0b00100010;
      break;
      case 3: x = 0b00101000;
      break;
      case 4: x = 0b01001100;
      break;
      case 5: x = 0b10001000;
      break;
      case 6: x = 0b10000000;
      break;
      case 7: x = 0b00111100;
      break;
      case 8: x = 0b00000000;
      break;
      case 9: x = 0b00001000;
      break;
      default: x = 0b11111111;
      break;
      }
   }else {
   switch(x) {
      case 0: x = 0b00010001;
      break;
      case 1: x = 0b01111101;
      break;
      case 2: x = 0b00100011;
      break;
      case 3: x = 0b00101001;
      break;
      case 4: x = 0b01001101;
      break;
      case 5: x = 0b10001001;
      break;
      case 6: x = 0b10000001;
      break;
      case 7: x = 0b00111101;
      break;
      case 8: x = 0b00000001;
      break;
      case 9: x = 0b00001001;
      break;
      default: x = 0b11111111;
      break;
      }
   }
   }


void visualiza_displays(int uni,int transistor)
   {
   delay_ms(1);
   PORTB = uni;
   delay_ms(1);
   switch(transistor) {
     case 1: output_high(PIN_C5);
     break;
     case 2: output_high(PIN_C6);
     break;
     case 3: output_high(PIN_C7);
     break;
     default:
     break;
     }
   delay_ms(5);
   output_low(PIN_C5);
   output_low(PIN_C6);
   output_low(PIN_C7);
   }


void main()
   {
   long int valor,parte_decimal;
   int parte_entera,decimas,unidades,decenas;
   setup_adc_ports(RA0_RA1_RA3_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   set_tris_A(0b00001011);
   set_tris_B(0b00000000);
   set_tris_C(0b00000000);
   port_b_pullups(FALSE);
   for(;;)
     {
     valor = read_adc();
     calcula_voltaje(valor,parte_decimal,parte_entera);
     separa_unidades(parte_entera,unidades,decenas);
     decimas = parte_decimal;
     tabla_display(decimas,FALSE);
     tabla_display(unidades,TRUE);
     tabla_display(decenas,FALSE);
     visualiza_displays(decimas,1);
     visualiza_displays(unidades,2);
     visualiza_displays(decenas,3);
     delay_ms(1);
     }
   }






Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
RE: ADC con 10 bits
« Respuesta #2 en: 24 de Febrero de 2006, 20:49:00 »
Gracias Modulay, eso no lo habia visto voy a ver como me sale....

Una pregunta, cuando utilizamos un PIC18F2550, este tiene mas modulos para configurar el ADC, funcionara igual que con uno de la serie 16?, pues la serie 18 usa el ADCON0, ADCON1 y ADCON2... tendra algo que ver eso??? pues aun no me quiere enviar bien los datos. Por lo pronto seguire probando a ver que pasa.

Un abrazo..RebotadoRebotadoRebotadoRebotadoRebotado
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: ADC con 10 bits
« Respuesta #3 en: 25 de Febrero de 2006, 14:17:00 »
Escrito originalmente por Artifox
Gracias Modulay, eso no lo habia visto voy a ver como me sale....

Una pregunta, cuando utilizamos un PIC18F2550, este tiene mas modulos para configurar el ADC, funcionara igual que con uno de la serie 16?, pues la serie 18 usa el ADCON0, ADCON1 y ADCON2... tendra algo que ver eso??? pues aun no me quiere enviar bien los datos. Por lo pronto seguire probando a ver que pasa.

Un abrazo..RebotadoRebotadoRebotadoRebotadoRebotado


A ver si aclaras mejor tu pregunta.  Te refeires si tu código de un 18 también funciona en un 16?

Los 18F tienen mas "opciones" a la hora de configurar los canales de entrada por ejemplo, pero en funcionamiento son casi idénticos con los 16F.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: ADC con 10 bits
« Respuesta #4 en: 25 de Febrero de 2006, 17:07:00 »
Imagino que utilizando las funciones de CCS no debe cambiar mucho de los 16 a los 18.Echa un ojo al fichero .h del micro en cuestion que ahí es donde vienen declaradas todas las constantes y demás para la configuración de los periféricos.
Suerte

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
RE: ADC con 10 bits
« Respuesta #5 en: 26 de Febrero de 2006, 11:44:00 »
Al fin me funciono bienRebotadoRebotadoRebotadoRebotado MI problema era en la recepcion de datos en la PC y no me habia dado cuenta en un pequeño error. Aca dejo un extracto de mi codigo para que lo necesite:

#device ADC=10
#byte TRISA=0xF92
#byte ADCON2=0xFC0
#byte ADCON1=0xFC1
#byte ADCON0=0xFC2
#byte ADRESL=0xFC3
#byte ADRESH=0xFC4

int h,l;
long value;

void main(void) {

   TRISA=0xFF;                   // Todos entrada
   ADCON1=0;                     //Puerta A entradas analógicas
   ADCON0=0b00001001;            //ADC en On, seleciona canal AN2
   ADCON2=0b10111110;            //Puerta A entradas analógicas

   while (TRUE)
   {
              bit_set(ADCON0,1); //Inicia la conversión
               while(bit_test(ADCON0,1)); //Fin de conversión ??
               h=ADRESH;
               l=ADRESL;
// Aca ya podemos hacer lo que querramos con los datos obtenidos
   }
}


Gracias Sonrisa GiganteSonrisa GiganteSonrisa GiganteSonrisa GiganteSonrisa Gigante
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: ADC con 10 bits
« Respuesta #6 en: 26 de Febrero de 2006, 11:50:00 »
Enhorabuena y a seguir cacharreandoFumadorFumadorFumador


 

anything