el valor mínimo de ADC es la mitad del máximo

0

Estoy intentando leer un valor analógico utilizando el ADC de un microcontrolador ATSAM4E. El problema que tengo es que siempre lee 2047 o 2046 cuando el pin está conectado a GND y 4096 cuando está conectado a VCC. No lo tengo configurado en modo diferencial.

Aquí está el código para ello:

void adc_init(void){
    struct afec_config afec_cfg;
    afec_enable(AFEC0);
    afec_get_config_defaults(&afec_cfg);
    afec_init(AFEC0, &afec_cfg);
    afec_set_trigger(AFEC0, AFEC_TRIG_SW);
    afec_channel_enable(AFEC0, AFEC_CHANNEL_0);
}

//every 100ms
printf("CHANNEL 0: %d\r\n\n", afec_channel_get_value(AFEC0, AFEC_CHANNEL_0));
afec_start_software_conversion(AFEC0);

No sé cuál es el problema. El reloj ADC es de 6MHz, por lo tanto, esperar 100 ms entre conversiones debería ser suficiente para asegurar que esté terminado.

Es un poco sospechoso que el valor esté siempre tan cerca de la mitad. Lo menos que obtuve fue en 1790, pero estos valores "más pequeños" ocurren después de desconectar el pin de VCC.

¿Alguien tiene alguna idea de lo que podría ser?

    
pregunta user3808318

1 respuesta

2

Leyó y hizo esto ...

  

La compensación analógica de la AFE se configura en el campo AOFF en el registro de Compensación de compensación de canal   (AFEC_COCR). El desplazamiento solo está disponible en el modo de terminación única. El campo AOFF debe estar configurado para 2048   (escala media de la DAC) cuando no hay error de compensación para compensar. Para compensar un error de compensación de n LSB   (positivo o negativo), el campo AOFF debe configurarse para 2048 + n.

Página 1276 del spec hoja .

    
respondido por el Trevor_G

Lea otras preguntas en las etiquetas