Autor Tema: Conversion Analoga/Digital PIC24F  (Leído 1136 veces)

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

Desconectado Rikr09

  • PIC16
  • ***
  • Mensajes: 112
Conversion Analoga/Digital PIC24F
« en: 27 de Septiembre de 2012, 12:30:35 »
Buenas,
Saludos a todos amigos de TODOPIC

En esta ocasión, vengo con cierta inquietud acerca del módulo de conversión análoga digital del PIC 24FJ128GA310, cual es el que estoy usando.

Estoy tratando de media la temperatura con el sensor integrado que trae la Explorer 16 de Microchip, y hace unas semanas me funcionaba a la perfeción. La configuración que empleo es:

Código: [Seleccionar]
void ADC(){
AD1CON1 = 0x0470; // manual conversion sequence control
AD1CSSL = 0; // no scanning required
AD1CON3 = 0x1F02; // Tad = 2 x Tcy = 125ns > 75ns
AD1CON2 = 0; // use MUXA, AVss and AVdd are used as Vref+/-
AD1CON1bits.ADON = 0;       // turn off the ADC
}

El metodo con el que recibo los datos, el siguiente:

Código: [Seleccionar]
unsigned int readADC(int ch){
        unsigned int a,b;

        voltage = 0;
AD1CON1bits.ADON = 1;       // turn on the ADC
a = b = 0;
AD1CHS = ch; // Seleccion del canal analogo
AD1CON1bits.SAMP = 1;                                   // comenzar muestreo
while ( !AD1CON1bits.DONE ); // esperar a que se complete la transmision
a = ADC1BUF0;
      
voltage = ( 0.0008056640625 * a ); // multiplicar por 3.3/4096

        temperature = ((voltage - 0.5) / 0.01);
        temperature = (temperature*1000)/1;
 
        b = ( voltage * 1000 ) / 1;
AD1CON1bits.ADON = 0;



        return b;

        AD1CON1bits.ADON = 0;       // turn off the ADC
}

La temperatura la convierto en un INT porque teng otra función que se encarga de convertir INT --> ASCII para poder visualizarla en una LCD de 2*16. La forma como leo la temperatura es como sigue:


Código: [Seleccionar]
void Temperatura(){
            vWriteLCD(0x18,LCD_COMMAND);
            vPutrs_LCD(temperatura);

            while(S4 && flag_inactivo!=1 && flag_alarma!=1 && flag_alarma!=2 && flag_alarma!=3){

               vGotoxyLCD(0,1);
               vPutrs_LCD(temperatura);
               vGotoxyLCD(0,2);
               vWriteLCD(0x14,LCD_COMMAND);
               readADC(4);
               Valor_LCD =(temperature*1000)/1;
               ITOA(Valor_LCD,5);

            }

}

Como se puede detallar, para que se deje de senar la temperatura y mostrarla por el LCD es que se cumplan los criterios contrarios a los especificados. El problema que tengo es que cuando hice la ultima prueba trabajaba con un reljo de 1MHz, hace unos dias, pase a aumentarlo por requerimientos de mi programa asi que quedo en 8MHz, desde ese dia, no se visualizan bn los valores de la temperatura, manda datos errorenos y muy cambiantes en el tiempo, lo que me hace pensar es que no se esta dando el tiempo necesario para que se tome la muestra o se haga la conversionm en realidad No se  :( ... por eso acudo a su ayuda, para que por favor me den iudeas, sugerencias, preguntas, etc....


Gracias de nuevo para Todos por su atencion!!!

« Última modificación: 28 de Septiembre de 2012, 15:24:51 por Rikr09 »


 

anything