No se puede leer el valor correcto de ADC10MEM

0


Actualmente estoy intentando leer un valor de ADC10MEM y convertirlo en un valor utilizable para procesar. Sin embargo, el valor que estoy recibiendo (valor aleatorio) no es lo que se anticipó (aproximadamente 0.1 voltios). El error puede estar en mi conversión de ADC10MEM a mi valor. Cualquier ayuda es muy apreciada!


unsigned int value = 0;
double accurateValue = 0;

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD; // Stop WDT
  ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE + REFON;
  /*    
   *    ADC10CTL0:
   * 
   *    ADC10SHT_3  =>  SampleHoldTime: "64 x ADC10CLKs" 
   *    ADC10ON     =>  ADC10:          "ADC10 On/Enable"
   *    ADC10IE     =>  Interrupts:     "ADC10 Interrupt Enabled"
   *    REFON       =>  Internal Ref:   "ADC10 Internal Ref On"
   *    REF2_5V     =>  Ref Volt:       "ADC10 Ref 0: 1.5V" 
   *    
   */


  ADC10AE0 |= 0x01;
  /*
   *    ADC10AE0    =>  Channel:    "P2.0" (board pin 3)
   */

  for (;;)
  {
    ADC10CTL0 |= ENC + ADC10SC;
    /*
     *  ENC     =>  "ADC10 Enable Conversion" 
     *  ADC10SC =>  "ADC10 Start Conversion"
     */

    __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit

    /*
     *  ADC10MEM:
     *  
     *  Conversion:     
     *      
     *  Nadc = 1023 * (Vin - Vr-) / ( Vr+ - Vr- )
     *  
     *  Vin = ( Nadc * (Vr+ - Vr-) / 1023 ) + Vr-
     *  
     *  Assuming Vr- == 0;
     *  
     *  Vin = Nadc * 1.5 / 1023
     *  
     */

    value = ADC10MEM * 15 / 1023; // 15 instead of 1.5 (using integers)

    accurateValue = ( (float)value ) / 10; // actual value (type double)
  }
}

    Requisitos adicionales

  • La entrada debe estar entre 0.1 mV y 1 V
pregunta user126452

1 respuesta

2

Según el comentario de su pregunta, debe configurar todo , incluidos los pines IO, la fuente de reloj, la conexión a los periféricos en lugar del IO digital, etc.

Su código de inicio normalmente se ejecutaría de 10 a 100 líneas dependiendo de lo que inicialice. Siempre inicializo absolutamente todo, mi código de inicio es normalmente alrededor de 400 líneas o menos.

PERO TAMBIÉN EN el F2274 (como en la mayoría de las series F2 y F1), es muy importante asegurarse de seguir las recomendaciones de diseño de hardware, específicamente necesita el condensador en el voltaje de referencia del ADC que aparece externamente. Si no tienes ese límite, obtendrás basura al azar en tus lecturas.

    
respondido por el quickly_now

Lea otras preguntas en las etiquetas