www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Berechnung (C)


Autor: Hias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte den ADC-Wert umrechnen und als String ausgeben (UART).

Der ADC-Wert stammt von einem NTC und ist der Mittelwert aus 100
Messungen.
Ich habe den Temperaturen und dem Spannungsteilerwiderstand
entsprechend  eine Tabelle angelegt. (88 entspricht -30°C, 1013 ent.
45°C, daszwischen
5°C Schritte).
[C]
uint16_t reftemp [16] =
{88,117,153,196,247,306,372,444,520,598,677,754,827,895,957,1013};
[\C]

Als erstes Suche ich mir aus dem Array den Wert der unmittelbar kleiner
ist als der ADC-Wert.(Temperatur ist der ADC-Wert)
[C]
for (uint8_t i=0; i<16; i++)
{
 if (temperatur >= reftemp[i] && temperatur < reftemp[i+1])
 {
  count = i;
  }
}
[\C]
In "count" steht dann der Wert der Arrayposition.
[C]
double tem;
tem =
reftemp[count]-reftemp[count])*(temperatur-reftemp[count]))+((count*5)-3 
0);
[\C]

Hieraus wird dann der Temperaturwert berechnet. (Temperatur ist der
ADC-Wert).

[C]
char string[4];
dtostrf(tem,4,1,string);

for (uint8_t i=0; i<4; i++)
{
 loop_until_bit_is_set(UCSRA, UDRE);
 UDR = string[i];
}
[\C]
Danach wird double in string umgewandelt und an den PC geschickt (zu
Testzwecken).

Leider bekomme ich immer. Folgendes Ergebnis: 30.0???
Irgendwo muss da ein Fehler in der Berechnung sein.
Ich versuche scho den ganzen Tag ihn zu lokalisieren, aber ich glaube
ich seh den Wald vor lauter Bäume nicht mehr.
Ihr seid bestimmt nicht so blind.

Danke
Hias

Autor: Hias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry!!! :D


Hallo!

Ich möchte den ADC-Wert umrechnen und als String ausgeben (UART).

Der ADC-Wert stammt von einem NTC und ist der Mittelwert aus 100
Messungen.
Ich habe den Temperaturen und dem Spannungsteilerwiderstand
entsprechend  eine Tabelle angelegt. (88 entspricht -30°C, 1013 ent.
45°C, daszwischen
5°C Schritte).
uint16_t reftemp [16] =
{88,117,153,196,247,306,372,444,520,598,677,754,827,895,957,1013};

Als erstes Suche ich mir aus dem Array den Wert der unmittelbar kleiner
ist als der ADC-Wert.(Temperatur ist der ADC-Wert)
for (uint8_t i=0; i<16; i++)
{
 if (temperatur >= reftemp[i] && temperatur < reftemp[i+1])
 {
  count = i;
  }
}
In "count" steht dann der Wert der Arrayposition.
double tem;
tem =
reftemp[count]-reftemp[count])*(temperatur-reftemp[count]))+((count*5)-30);

Hieraus wird dann der Temperaturwert berechnet. (Temperatur ist der
ADC-Wert).
char string[4];
dtostrf(tem,4,1,string);
        
for (uint8_t i=0; i<4; i++)
{
 loop_until_bit_is_set(UCSRA, UDRE);
 UDR = string[i];
}
Danach wird double in string umgewandelt und an den PC geschickt (zu
Testzwecken).

Leider bekomme ich immer. Folgendes Ergebnis: 30.0???
Irgendwo muss da ein Fehler in der Berechnung sein.
Ich versuche scho den ganzen Tag ihn zu lokalisieren, aber ich glaube
ich seh den Wald vor lauter Bäume nicht mehr.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf alle Fälle ist schon einmal die Zeile

reftemp[count]-reftemp[count])*(temperatur-reftemp[count]))+((count*5)-3 
0);


komisch. Da stimmt erstens die Klammerung nicht und zweitens ergibt die
erste Subtraktion immer 0.

Autor: Hias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoppala!
Im Code stehts so:
tem =
(5/(reftemp[count+1]-reftemp[count])*(temperatur-reftemp[count]))+((count*5)-30);

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beachte, daß die Rechnung komplett mit int durchgeführt und danach erst
das Ergebnis nach double konvertiert wird.
Ein weiteres Problem ist eine Division durch 0, wenn reftemp[count+1]
und reftemp[count] gleich sind.

Autor: Hias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Rolf!
Die erst Divison kann nich Null werden!
Die Tabellenwerte sind fest und unterschiedlich!

Das Problem wird sein das alles als int gerechnet wird.
Wie schaffe ich eine Rechnung als double?

Hias

Autor: mydani (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CASTEN

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Etwa so, wenn ich mich nicht täusche:
   tem =
(5/((double)reftemp[count+1]-(double)reftemp[count])*((double)temperatur-(double)reftemp[count]))+(double)((count*5)-30);


Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die erst Divison kann nich Null werden!
> Die Tabellenwerte sind fest und unterschiedlich!

Stimmt natürlich. Zum Rechnen mit double kann man, wie Philipp schon
schreibt, einen Cast verwenden. Evtl. mußt du aber nicht überall mit
double rechnen. Die erste Subtraktion z.B. würde auch mit Integern
funktionieren. Alternativ könntest du reftemp auch gleich als Array aus
double anlegen. Dann müßte es nicht erst konvertiert werden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.