AccSensor auswerten

OP #2221298
Lesenswert?

Hallo,

ich hab ein kleines Problem mit meinem AccSensor.

Source Code, zum lesen vom AccWert:
long adc_read(char axis)
{
  long adc_value=0;
  long volt_value=0;
  long g_value=0;

  if(axis=='x')
  {
    ADMUX = (0<<MUX4) | (0<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0);
  }

  if(axis=='y')
  {
    ADMUX = (0<<MUX4) | (0<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0);
  }

  if(axis=='z')
  {
    ADMUX = (0<<MUX4) | (0<<MUX3) | (1<<MUX2) | (0<<MUX1) | (1<<MUX0);
  }

  ADCSRA |= (1<<ADSC);
  adc_value = ADCL;
  adc_value += (ADCH<<8);

  volt_value=(3000*adc_value)/1024;
  g_value=((1000*(volt_value-1494))/600);

  return(g_value);
}

Im Hauptprogramm hab ich eine Schleife:
while(1)
  {
    g_value=adc_read('x');
    itoa(g_value,value_string,10);
    usart_puts("(x: ");
    usart_puts(value_string);
    usart_puts("mg|");

    g_value=adc_read('y');
    itoa(g_value,value_string,10);
    usart_puts("y: ");
    usart_puts(value_string);
    usart_puts("mg|");

    g_value=adc_read('z');
    itoa(g_value,value_string,10);
    usart_puts("z: ");
    usart_puts(value_string);
    usart_puts("mg)");

          usart_puts("  ");

    _delay_ms(800);
  }

Das Problem ist: Wenn ich immer nur eine Achse lese, also:
while(1)
{
g_value=adc_read('x');
itoa(g_value,value_string,10);
usart_puts("(x: ");
usart_puts(value_string);
usart_puts("mg|");
}
funktionierts, aber wen ich alle zusammen hintereinander lese und 
ausgebe, mischt er die Werte, zuerst z, dann x und dann y.
Warum?

MfG
Gast #2221306
Lesenswert?

Fabian K. schrieb:
> ADCSRA |= (1<<ADSC);
>   adc_value = ADCL;
>   adc_value += (ADCH<<8);

Du startest die Messung und willst direkt den Wert auslesen.
Das geht so nicht, das Teil ist lahm und deshalb musst du warten.

Daher funktioniert das bei einer Achse, da du immer den Wert der 
VORHERIGEN Messung ausliest. Bei mehreren Achsen passen dann die Werte 
nicht mehr, da du ja den Kanal umschaltest.
:-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren