ADC Arduino ¿Problema Interno o Externo?

Hola que tal!! Me encuentro con un problema bastante grave por mi punto de vista, porque no puedo utilizar de manera correcta mi tarjeta Arduino 2560 R3.

El problema: Al utilizar el conversor ADC en los pines A0, A1, A2 .... A7 obtengo lecturas que van desde los 530; 565 (OScilando) hasta los 1023... Como si el Arduino no tuviese una masa en común. Probé alimentándolo por USB e inyectándole 5v externos.

Para probar cada entrada probé conectar un cable desde GND hasta la entrada a probar, y solo tenia esas oscilaciones de 530 a 565 aproximadamente al mostrarlas por el monitor serie. Este es el programa básico

    void setup(){
   Serial.begin(19200);
   }

   void loop(){
   Serial.println(analogRead(0));
   }

Para sacarme la duda, probé con otra tarjeta igual (Arduino MEGA 2560) que había comprado y es nueva. En ese programa (al conectar el cable a GND) tuve en pantalla el valor "0" por las impresiones de Serial.println() es decir, que tenía el valor de 0v en cada lectura (Funcionamiento correcto).

Entonces, ¿El ADC de mi Arduino primero, puede estar en mal estado internamente? ¿O puede ser alguna otra cosa?

Desde ya gracias!

Moderador
Por favor edita tu post usando etiquetas de código.
Lee las Normas del foro

Te recomendaría usar una resistencia de 10k entre Pin y GND y prestarle atención solo al pin que esta bajo estudio.
Siempre usa A0 y no solo 0

    void loop(){
       Serial.println(analogRead(A0));
    }

Supongamos que aún asi marque valores erróneos. Es raro que eso pase.
Lo que se me ocurre es que busques un tester/multímetro y leas la tensión en el terminal AREF.
Deberías leer 5V aproximadamente.
Es posible que cambies dicha Referencia a los valores internos del ADC
para ello usa los comandos sugeridos que son ver link

Ahi verás que hay muchas opciones y puedes comprobar su comportamiento cambiando la referencia de EXTERNA como esta por defecto a INTERNA y de ese modo volver a probar su comportamiento.
Si aún asi falla en todos, es porque se ha dañado pero es muy raro lo que mencionas.

void setup()  {
  Serial.begin(9600);
  analogReference(INTERNAL2V56);  // para 2.56 máx usar INTERNAL2V56
                                                    // para 1.1 máx usar INTERNAL1V1 

  }

  void loop(){
       Serial.println(analogRead(A0));
  }

Gracias por la atención pero ya pude resolver el problema. :slight_smile:

Anteriormente había verificado todo lo mencionado tanto la referencia como la programación e hice el cambio de escribir A0 y 0, Pero esos no eran los problemas :o .
Además descubrí que cuando utilizaba varios pines de entrada analógica en la nueva tarjeta Arduino MEGA 2560 , mediante otro código muy básico, un valor parecía entremezclarse con otro, es decir, sin en A0 leía un valor de 460, en A1 obtenía valores por la diferencia de 1023 - 460 = 563. La verdad que era muy extraño y misterioso a la vez.

Para resolverlo tuve que modificar el archivo wiring_analog.c dentro de los códigos del IDE de arduino. Parece ser que el reloj que utiliza el conversor ADC estaba mal configurado y las lecturas obtenidas fueron erróneas. No se si era que la velocidad era demasiada (Porque sabemos el el reloj ADC tiene una frecuencia límite de trabajo) u otra cosa, pero para ello hice lo siguiente:

En la función analogRead() limpié o restablecí los bits del registro ADCSRA correspondientes al prescaler del reloj (ADPS2, ADPS1, ADPS0), y luego los puse a 1 a todos (Factor de División 128 según el datasheet) antes de que se inicie la conversion:

#if defined(ADCSRA) && defined(ADCL)
	// start the conversion
	ADCSRA = ADCSRA & B11111000;     //Agregado
	sbi(ADCSRA, ADPS0);                       //Agregado
	sbi(ADCSRA, ADPS1);                       //Agregado
	sbi(ADCSRA, ADPS2);                       //Agregado
	
	sbi(ADCSRA, ADSC);

	// ADSC is cleared when the conversion finishes
	while (bit_is_set(ADCSRA, ADSC));

...

Con eso, se arreglo el problema tanto en la tarjeta Antigua como la tarjeta Nueva.