Forum: Mikrocontroller und Digitale Elektronik Umrechnung beim ADC Max127


von Flo (Gast)


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

von Ahem (Gast)


Lesenswert?

Vollständigen Code posten.
Woran erkennst Du den "Mist"?

von Flo (Gast)


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.

von Flo (Gast)


Lesenswert?

Sorry für den Doppelpost aber ich habe vergessen zu sagen das der Wert 
ohne Umwandlung in Volt (also der Inhalt von result) korrekt ist.

von Michael U. (amiga)


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

von Flo (Gast)


Lesenswert?

Sorry hatte ich vergessen result ist natürlich uint16_t genau wie value. 
Hab den cast versucht und das bringt keinen erfolg.

von Flo (Gast)


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.

von Flo (Gast)


Lesenswert?

Ok hat sich erledigt hatte nen fehler mit ultoa gemacht und es an die 
flasche stelle gepackt trotzdem danke für die Hilfe und den Tipp mit dem 
cast.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.