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
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).
1 | uint16_t reftemp [16] = |
2 | {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)
1 | for (uint8_t i=0; i<16; i++) |
2 | {
|
3 | if (temperatur >= reftemp[i] && temperatur < reftemp[i+1]) |
4 | {
|
5 | count = i; |
6 | }
|
7 | }
|
In "count" steht dann der Wert der Arrayposition.
1 | double tem; |
2 | tem = |
3 | reftemp[count]-reftemp[count])*(temperatur-reftemp[count]))+((count*5)-30); |
Hieraus wird dann der Temperaturwert berechnet. (Temperatur ist der ADC-Wert).
1 | char string[4]; |
2 | dtostrf(tem,4,1,string); |
3 | |
4 | for (uint8_t i=0; i<4; i++) |
5 | {
|
6 | loop_until_bit_is_set(UCSRA, UDRE); |
7 | UDR = string[i]; |
8 | }
|
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.
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.
Hoppala! Im Code stehts so:
1 | tem = |
2 | (5/(reftemp[count+1]-reftemp[count])*(temperatur-reftemp[count]))+((count*5)-30); |
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.
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
Etwa so, wenn ich mich nicht täusche:
1 | tem = |
2 | (5/((double)reftemp[count+1]-(double)reftemp[count])*((double)temperatur-(double)reftemp[count]))+(double)((count*5)-30); |
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.