Umrechnung beim ADC Max127

Gast #1207932
Lesenswert?

Hi Leute,ich habe hier ein kleines Problem bei der Umrechnung des ADC 
Wertes eines Max 127 mit einem ATmega8.

Die einfachste Variante ist die Multiplikation des ADC 16Bit Wertes mit 
dem Faktor 2441 (Range 0 bis 10 Volt) was ja eine 16 x 16 Bit 
Multikation wäre ich habe es mit
1
volt=result*2441;
 versucht und gebe den wert mit
1
uart_puts( ultoa( result, s, 10 ) );

aus. Aber ich bekomme nur misst raus.

Ich denke es gibts bei multiplikation ein Problem oder was meint ihr?

Danke im Vorraus

Flo
Gast #1207952
Lesenswert?

Für das Einlesen:
1
//MAX127
2
void read_max(uint8_t channel)
3
{  
4
  cli();
5
  result=0;
6
  PORTB=0x01;
7
  for(i=0;i<12;i++)
8
  {
9
    i2c_start_wait(maxWrite);
10
    i2c_write(channel);
11
    i2c_stop();
12
    i2c_start_wait(maxRead);
13
    value=i2c_readAck();
14
    value<<=8;
15
    value|=(uint16_t)i2c_readNak();
16
    i2c_stop();
17
    value>>=4;
18
    result=result+value;
19
  }
20
  result=(uint16_t)result/12;
21
  volt=result*2441;  
22
  PORTB=0x00;
23
  sei();
24

25
}

Ausgabe
1
case 'A':uart_puts("Channel 0: ");
2
             read_max(Read0);
3
           uart_puts( itoa( volt, s, 10 ) );
4
           break;

Ich erkenne den Fehler daran das im Terminal statt 4999168 (Bei 5V am 
Eingang) ein 15620 oder gar ein negativer wert erscheint.
#1207955
Lesenswert?

Hallo,

[Glaskugelmode]

Da in C erstmal gerechnet wird und zwar mit den Datentypen der 
Berechnung,
hier also sehr wahrscheinlich auch result als uint16_t und dann 
zugewiesen, kommt Müll raus.
Wenn es so ist, dann sollte ein cast

volt = (uint32_t) result * 2441;

helfen.

Hmm hat sich überschnitten, das Posting.
Liegt sicher daran...

PPS; der Code ist trotzdem unvollständig, welchen Typ haben volt, result 
usw??

Gruß aus Berlin
Michael
Gast #1207971
Lesenswert?

Verdammt wieder was vergessen. volt hat uint32_t oder hab ich eventuell 
nen denk fehler bei der umrechnung?Hab mal mit 2048 als ADC wert im 
Taschenrechner gerechnet und das passt das ergebniss und es passt auch 
in einen 32 Bit integer.

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