Medida diferencial ADC por registros con ATMEGA 2560

Buenas, tengo un problema y es que como dice el título estoy intentando hacer una medición diferencial con un arduino mega y ya estoy muy quemado con el código, me parece que estoy a punto de sacarlo pero ya estoy agotado.

La medida se va a realizar en un divisor resistivo con dos resistencias en los extremos y un potenciómetro entre estas al cual se conectan los terminales de medida del arduino en sus extremos, como ya podéis intuir es mas un ejercicio de aprendizaje que nada, estoy tratando de hacerlo mediante registros para aprender a usarlos mejor y que los códigos ocupen menos y corran mas rápido, aquí dejo el código que tengo con algunos comentarios.


Código:
/*
 * MUX5:0 -> 010011
 * Pos Dif Input= ADC3
 * Neg Dif Input= ADC1
 * Gain= x1
 */
int Result=0;
int Signal3 = 0;
int x3;
int y3;
int z3;
float q3;

int Signal1 = 0;
int x1;
int y1;
int z1;
float q1;

void setup() {
  Serial.begin(9600);


  ADMUX = B01010011;   //B01010011  B7&6 AVCC reference  B1&0->ADC3 /MUX->010011) ADLAR=0 Justificado derecha
  ADCSRA = 0x87;       //B10000111   ADEN=1 B7  Preescaler 128 (default) B[2:0]=1
  ADCSRB &= ~0x08;     //Bxxxx0xxx aseguramos 0 en B3 que corresponde a MUX5


}

void loop() {
 
 ADCSRA |= 0x40;// ponemos el bit 6 (ADSC) a 1 por lo que iniciamos la conversion.
  while (ADCSRA & 0x40); // se queda a la espera de terminar la conversión.
  x3 = ADCL;
  y3 = ADCH;
  z3 = (y3 << 8) | x3;
  q3 = (float)z3 * 5 / 1023; //Valor dc

  x1 = ADCL;
  y1 = ADCH;
  z1 = (y1 << 8) | x1;
  q1 = (float)z1 * 5 / 1023; //Valor dc

  q3-q1 = Result;
  Serial.println(Result, 2);

Las variables que llevan un 1 o un 3 detrás es por que corresponden al cálculo con el ADC1 o 3 respectivamente.
Si surge cualquier duda porfavor no dudéis en preguntar.
 
Pregunta: ¿ No debería, en la conversión al valor real de tensión, dividirse por 1024 en vez de 1023 ? De 0 a 1023 hay 1024 valores.

Y segundo, no entendí bien como esta conectado todo y tampoco cual es la duda (quizás la que esta quemada sea mi cabeza :LOL:).
 
Creo que tienes razón en la división, la duda es simplemente que falla en el código ya que no me devuelve la diferencia de las dos tensiones en la variable Result en la ultima línea de código.
 
1. Falta ver como y a que esta conectado todo. (valores de resistencias, potenciómetro, conexiones, tensiones. Un esquema no vendría mal).

2. ¡ Usas Arduino, e incluso la comunicación serial !. ¿ Has probado colocar un serial.print para todo ? De esa forma sabrás que valor da el ADC en hexadecimal (y binario), que valor tiene cada canal, que valor te da al pasar los dos valores a tensión.

Y ya tienes de sobra con que empezar a preguntarte.

1. ¿ Que valor me da el ACD ?
2. Ese valor debería ser X Volts ¿ El programa lo calcula bien ?
3. Mido en la entrada del ADC con un multímetro ¿ Esta el micro leyendo bien la tensión que hay (comparar con punto 2)?
4. Si resto los dos valores en una calculadora, ¿ es el mismo que me devuelve el micro por serial ?
 
Tienes razón, la herramienta de debug por excelencia será útil, dejo un esquema con valores y esta noche ya descansado me pondré a ello otra vez.
Muchas gracias!
Esquema.PNG
 
OJO con esa configuración, la medida máxima "diferencial" que tendrás sera de 3.6v aprox, si no hago mal los cálculos y la mínima "diferencial" cero (si es que v+ es 5v).

Segundo, GNG tiene que ser si o si la misma referencia que el arduino, osean deben compartir tierras.

Tercero: Aun si es lineal, no esperes que a la mitad de recorrido del potenciómetro, la tensión "diferencial" sea la mitad del máximo (3,6v / 2). De nuevo, si no calculo mal, sera de aprox 2,7v.

Obvio que en todo esto estoy descontando que esta todo bien conectado.
 
El problema está en que solo hacés una conversión al principio. Entonces ADCH y ADCL valen lo mismo cuando obtenés y3/x3 y y1/x1.

Tenés que cambiar de canal en el ADC y realizar otra conversión.
 
Se puede saber que diablos es esa expresión????
De eso si me había dado cuenta :LOL:, no así lo que expone @cosmefulanito04.

Y en base a eso era la idea de que creara un método de debug, para ir seccionando y buscando problemas en lugares concretos y pequeños en vez de volverse loco con todo el programa. Y ya que lo que quiere es aprender, no hay nada mejor que resolver problemas cuando las cosas no andan ;).
 

Dr. Zoidberg

Well-known-Papá Pitufo
Y ya que lo que quiere es aprender, no hay nada mejor que resolver problemas cuando las cosas no andan
Y también leer los warnings del compilador, por que ese error no puede pasar sin una advertencia.
Si hubiera escrito bien el código de esa resta vería el error que le marcó @cosmefulanito04

PD: es la primera vez en la vida que veo que alguien hace asignaciones de izquierda a derecha --> hay que estudiar teoría y sintaxis de los lenguajes.
 
Arriba