Conversión de ADC PIC18F4520 en MC18

4

Tengo un dilema.

Necesito leer los valores de ADC de PIC18F4520 . Mi configuración y código son los siguientes:

#define OSC INTIO67
int adc_result = 0;

void main(void)
{
    OSSCON = 0x70; //Set it as 8Mhz.
    OSCTUNEbits.PLLEN = 1; //Enable PLL 4x multiplier, thus we have 32 Mhz internal clock.

    //Set PORTA direction ports as input
    TRISA = 0xFF;

    OpenADC( ADC_FOSC_32      &
         ADC_RIGHT_JUST   &
         ADC_4_TAD,
         ADC_CH0          &
         ADC_REF_VDD_VSS  &
         ADC_INT_OFF, ADC_5ANA);

    while (1) {
        SetChanADC(ADC_CH0);
        ConvertADC();
        while (BusyADC());
        adc_result = ReadADC();
    }
    CloseADC();
}

El problema es este:

  1. Cuando lo ejecuto en MPLAB v8.x, mi lectura está ligeramente apagada y termina mi depuración.
  2. No puedo volver a depurar el PIC porque me aparecen errores como "No se puede entrar en el modo de depuración".

¿Cómo soluciono esos problemas? Además, ¿mi configuración de ADC es correcta (ya que ADC requiere un reloj para realizar la conversión de ADC) con mi reloj interno? ¿Es correcto configurar la señal del reloj a 32 MHz?

Estoy programando usando PicKit2 (con el botón negro).

    
pregunta Buhake Sindi

1 respuesta

4

No está configurando la señal de reloj del ADC a 32MHz. El parámetro ADC_FOSC_32 divide el reloj por 32 (consulte la página 225 de hoja de datos ). Esto garantiza, junto con los bits de selección del tiempo de adquisición ( ADC_4_TAD en su caso), el tiempo de adquisición A / D mínimo (/ máximo) (consulte la página 359). Cuando haga daño a estos requisitos, no obtendrá resultados válidos / precisos.

Con las ecuaciones que figuran en la página 228, puedes hacer los cálculos y verificar que se cumplen los requisitos.

Algunos otros puntos:

  • En tu código, nunca iniciarás la conversión de ADC llamando a ConvertADC .
  • Está configurando el puerto a como salida al configurar TRISA = 0x0; pero desea que se configure como entrada (como dice su comentario). TRISA = 0xFF; configuraría todos los pines en el puerto a como entrada.

Para expandir un poco el tiempo de adquisición (\ $ T_ {AD} \ $): Esta vez es necesaria para que los circuitos internos se carguen. Cuando este tiempo sea demasiado corto, obtendrás no / malos resultados.

Para 32Mhz (sin divisor) \ $ T_ {AD} \ $ sería 31ns. Eso es demasiado rápido. Probablemente se requieren al menos 0.7us para que el ADC funcione. Así que selecciona un divisor adecuado para obtener \ $ T_ {AD} \ $ por encima de 0.7us. Un divisor de 32 lo hará aquí, \ $ T_ {AD} = 1 \ $ us > 0.7us.

    
respondido por el PetPaulsen

Lea otras preguntas en las etiquetas