ADC en PIC24FJ64GB004 no funciona

0

Estoy usando el MPLAB X IDE v3.50 para escribir el código y descargarlo en el PIC24FJ64GB004. Se está compilando exitosamente pero el ADC no está dando un valor apropiado de acuerdo con el Voltaje (Vin1) recibido en el pin RC0. Ya sea que el pin tenga 3.3V o 0V, el valor convertido es una constante 0.

#define ADC_CHANNEL_CH_1            ADC_CHANNEL_6 // Pin RC0

Static FILEIO_OBJECT myFile;
uint16_t adc1Result;
uint16 Ch1_Value = 0;
uint16 Ch1_SUM = 0;


void ADC_Calculation()
{
    ADC_ChannelEnable(ADC_CHANNEL_CH_1);
    adc1Result = ADC_Read10bit(ADC_CHANNEL_CH1);

    // ****ADC Calculation****//
Ch1_Value = Ch1_Value + adc1Result;
Ch1_SUM  = Ch1_Value;
Ch1_Value = 0; 

if (Ch1_SUM  < 20)
{
    Ch1_SUM   = 20; //Minimum value of 20
}
    Else
{
    Ch1_SUM  = Ch1_SUM;
}

Estoy exportando el valor convertido de ADC usando el puerto USB a una hoja de Excel en el Thumbdrive.

Cuando cambié el pin de entrada ADC (Vin1) de RC0 a RC1 (AN7), dio un valor correcto hasta 341 (Vin1 = 2.2V). Pero cuando continúo usando el pin RC1 con una segunda segunda entrada (Vin2) y luego le doy la entrada original (Vin1) a RC0, RC1 se comporta igual (da el valor convertido correcto hasta 341) pero RC0 ahora da un valor constante de 341, '01 0101 0101 'en binario, ya sea Vin1 = 0v / 3.3V.

#define ADC_CHANNEL_CH_2            ADC_CHANNEL_7 // Pin RC1
#define ADC_CHANNEL_CH_1            ADC_CHANNEL_6 // Pin RC0

Static FILEIO_OBJECT myFile;
uint16_t adc1Result;
uint16_t adc2Result;

uint16 Ch1_Value = 0;
uint16 Ch2_Value = 0;
uint16 Ch1_SUM = 0;
uint16 Ch2_SUM = 0;


void ADC_Calculation()
{
    ADC_ChannelEnable(ADC_CHANNEL_CH_1);
    ADC_ChannelEnable(ADC_CHANNEL_CH_2);

    adc1Result = ADC_Read10bit(ADC_CHANNEL_CH1);
    adc2Result = ADC_Read10bit(ADC_CHANNEL_CH2);

// ****ADC 1 Calculation****//
Ch1_Value = Ch1_Value + adc1Result;
Ch1_SUM  = Ch1_Value;
Ch1_Value = 0; 

if (Ch1_SUM  < 20)
{
    Ch1_SUM   = 20; //Minimum value of 20
}
    Else
{
    Ch1_SUM  = Ch1_SUM ;
}


// ****ADC 2 Calculation****//
Ch2_Value = Ch2_Value + adc2Result;
Ch2_SUM  = Ch2_Value;
Ch2_Value = 0; 

if (Ch2_SUM  < 20)
{
    Ch2_SUM   = 20; //Minimum value of 20
}
    Else
{
    Ch2_SUM  = Ch2_SUM ;
}

¿A dónde me voy mal? ¿Por qué obtengo un valor digital de 0 cuando solo uso RC0 y obtengo un valor constante de 341, cuando uso RC1 y RC0, en la salida de RC0? El ADC en el PIC24FJ64GB004 es de 10 bits, por lo que debe dar un valor digital de 0 a 1023. ¿Por qué no supera los 341?

No estoy recopilando los valores convertidos de RC0 y RC1 simultáneamente. Estoy usando el pin RC3 para alternar entre las salidas. Entonces, cuando RC3 = 1, el valor convertido de RC0 se exporta y cuando RC3 = 0, el valor convertido digital de RC1 se exporta a la hoja de ecxel.

Básicamente,

1] Vin1 - > RC0, salida = 0 (constante) [RC1 no se utiliza]

2] Vin1 - > RC1, salida = 0,122,250 .. 341 (Da un valor correcto hasta Vin1 = 2.2V. Por encima de 2.2V, da un valor digital constante 341. No se usa RC0)

3] Vin1 - > RC0 y Vin2 - > RC1, salida en RC0 = constante 341; salida en RC1 = 0 .. 341. (constante 341 cuando Vin2 > 2.2V)

4] Vin2 - > RC0, salida = 0 (constante) [RC1 no se utiliza]

    
pregunta J2018

2 respuestas

1

No estoy seguro de qué compilador está usando, pero parece que no está llamando a la función que realmente activa la conversión de ADC o configura el ADC antes de usarlo. Generalmente el proceso para usar el ADC es:

  1. Configurar ADC
  2. Abrir / Habilitar ADC
  3. Comprueba si el ADC no está ocupado
  4. llamar a la función de conversión de ADC
  5. Comprueba si el ADC no está ocupado
  6. Valor de lectura en registros ADC

Estas funciones generalmente se definen en la biblioteca del manual del compilador. Así que puedes consultar las funciones exactas que necesitas.

    
respondido por el S.Ramjit
1

Creo que encontré la solución. Además de la información que proporcioné, estoy usando un tercer pin ADC (RC3) para seleccionar entre RC0 y RC1. Mi microcontrolador no recibe suficiente voltaje en su pin de selección (RC3). En lugar de 3.3v, está obteniendo 3.2v. El voltaje de referencia para el ADC es 3.3v. Tal vez el microcontrolador no pueda diferenciar entre un máximo de 3.3v y un mínimo de 0v, por lo que solo está viendo el valor digital de RC0 (341).

    
respondido por el J2018

Lea otras preguntas en las etiquetas