moin,
ich hätte mal eine Frage zu Sprungtabellen, und zwar ist mir deren
Funktionsweise noch nicht so 100% klar...
Ich habe einen physikalischen Prozess mit exponentieller Abhängigkeit.
Die Digitalisierung geschieht mit einen AD-Wandler. Gemessen wird über
einen Spannungsteiler die Spannung über einen NTC.
Nun möchte ich aus dem AD-Wert auf die physikalische Grundgröße
zurückschließen, dabei aber keine großen Berechnungen durchführen
müssen.
Wie muss eine derartige Sprungtabelle aufgebaut werden, um auf die reale
Temperatur zurückschließen zu können?
Inhalt der LUT wäre wohl der messbare AD-Wert, d.h. es wären Zahlen
zwischen 0 und 2^10-1, oder kommt die Temperatur in die Tabelle?
Was aber passiert, wenn zwei unterschiedliche Temperaturen aufgrund
einer zu niedrigen Auflösung des AD-Wandlers in zwei gleichen AD-Werten
münden?
Was passiert im umgekehrten Fall, wenn die Auflösung des AD-Wandlers
größer ist, als ich es benötige, ich also z.B. die Temepratur 25°C
ausgeben möchte, welche bei AD-Werten zwischen Zahl_1 und Zahl_2 liegen
würde...
mfg
@ Springer (Gast)
>Nun möchte ich aus dem AD-Wert auf die physikalische Grundgröße>zurückschließen, dabei aber keine großen Berechnungen durchführen>müssen.>Wie muss eine derartige Sprungtabelle aufgebaut werden, um auf die reale>Temperatur zurückschließen zu können?
Das ist eine normale Tabelle, keine Sprungtabelle.
>Inhalt der LUT wäre wohl der messbare AD-Wert, d.h. es wären Zahlen>zwischen 0 und 2^10-1,
Nein, das ist die Adresse der einzelnen Werte!
> oder kommt die Temperatur in die Tabelle?
Ja.
>Was aber passiert, wenn zwei unterschiedliche Temperaturen aufgrund>einer zu niedrigen Auflösung des AD-Wandlers in zwei gleichen AD-Werten>münden?
Dann ist deine Tabelle grob und du kannst verschiedene Temperaturen
nicht unterscheiden.
>Was passiert im umgekehrten Fall, wenn die Auflösung des AD-Wandlers>größer ist, als ich es benötige,
Dann sind identische Einträge in der Tabelle, auch kein Problem.
In C ist es ein einfaches Array temperatur = temp[ADC], in ASM ist es
auch nicht schwer, siehe hier
http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#Senden_von_Zeichenketten
Logischerweise hat man dann keinen String sondern die Tabelle.
Also wenn du keine allzu große Tabelle bekommst, würde ich in einer
Tabelle tatsächlich jedem adc Wert den physikalischen Meßwert zuweisen.
lut[256] und lut[adc] ist den Meßwert.;
Wenn der adc mehr Auflösung hat, als du brauchst, könnte man drüber
nachdenken, die unteren bits gar nciht anzuschließen/auszuwerten.
Bei viel mehr adc Auflösung als Zuweisungen würd ich z.B. mit binsearch
den adc Wert in der Tabelle suchen, der terminiert dann ja (je nach
Implementierung) drüber oder drunter, so daß dann search( adc ), der
Tabellenindex ist.
...d.h. ich müsste mir die Funktionsergebnisse
f(T) = ADC_Wert(T)
berechnen.
Angenommen ich habe 3 Bit Auflösung.
Die folgenden Temperaturen entsprechen dann folgenden beispielhaften
AD-Werten:
70°C = 7
60°C = 6
50°C = 5
40°C = 4
30°C = 3
20°C = 2
10°C = 1
0 = 0
Die Lookuptable würde ich nun wie folgt aufbauen:
static const uint8_t LUT[8] =
{
0
10
20
30
40
50
60
70
};
richtig?
Was mache ich, wenn ich nun nur 2 Bit Auflösung verwenden möchte?
...dann müsste ich meinen AD-Wert um 1>> nach rechts schiften und in
einer Lookuptable mit nur 4 Elementen suchen?
mfg
...und der Zugriff wäre dann:
Temperatur = LUT[ (uint8_t)aktueller_ad_wert ];
wobei der ad_wert gecastet werden müsste, wenn die AD-Auflösung höher
ist, als die Werte in der Lokkuptable?
???
mfg
Springer schrieb:> Die Lookuptable würde ich nun wie folgt aufbauen:>> static const uint8_t LUT[8] => {> ...> };>> richtig?
Korrekt.
> Was mache ich, wenn ich nun nur 2 Bit Auflösung verwenden möchte?> ...dann müsste ich meinen AD-Wert um 1>> nach rechts schiften und in> einer Lookuptable mit nur 4 Elementen suchen?
So ist es.
Springer schrieb:> ...und der Zugriff wäre dann:>> Temperatur = LUT[ (uint8_t)aktueller_ad_wert ];>> wobei der ad_wert gecastet werden müsste, wenn die AD-Auflösung höher> ist, als die Werte in der Lokkuptable?
Nein. Casten ist was anderes. Wenn Dein ADC 3 Bit Auflösung mit 8
verschiedenen Werten hat, Deine Tabelle aber nur 4 Werte vorsieht (2 Bit
Auflösung), dann musst Du den ADC-Wert erst einmal um 1 bit nach rechts
schieben, um ihn in die "Wertemenge" Deiner Tabelle zu quetschen.
Springer schrieb:> Was mache ich, wenn ich nun nur 2 Bit Auflösung verwenden möchte?> ...dann müsste ich meinen AD-Wert um 1>> nach rechts schiften und in> einer Lookuptable mit nur 4 Elementen suchen?
Ja. Ev. auch noch aufrunden, wenn's etwas mehr als nur 2 bit sind.
Springer schrieb:> wobei der ad_wert gecastet werden müsste
Nö.
> , wenn die AD-Auflösung höher> ist, als die Werte in der Lokkuptable?
Dann ist das Konzept kaputt; deine Tabelle muss natürlich für alle
vorkommenden Indizes Daten bereithalten!
Springer schrieb:> ...d.h. ich müsste mir die Funktionsergebnisse>> f(T) = ADC_Wert(T)>> berechnen.>>> Angenommen ich habe 3 Bit Auflösung.>> Die folgenden Temperaturen entsprechen dann folgenden beispielhaften> AD-Werten:>> 70°C = 7> 60°C = 6> 50°C = 5> 40°C = 4> 30°C = 3> 20°C = 2> 10°C = 1> 0 = 0>>> Die Lookuptable würde ich nun wie folgt aufbauen:>> static const uint8_t LUT[8] => {> 0> 10> 20> 30> 40> 50> 60> 70> };>> richtig?>>>> Was mache ich, wenn ich nun nur 2 Bit Auflösung verwenden möchte?> ...dann müsste ich meinen AD-Wert um 1>> nach rechts schiften und in> einer Lookuptable mit nur 4 Elementen suchen?
Reales Beispiel ist immer gut.
Wie würdest du es denn mit der Hand machen?
Angenommen, das da oben wäre deine Lookup Tabelle. Die ist für 8 Werte
ausgelegt. Und jetzt kommt jemand und sagt: 8 Werte sind toll, ich hab
aber nur 4 Werte für den kompletten Messbereich.
Was würdest //DU// tun?
Du würdest wahrscheinlich dasselbe tun, wie ich auch.
Eines von beiden: Entweder ein neue Lookup Tabelle für diesen Fall mit 4
Werten aufstellen.
Oder aber du würdest den gegebenen Wert mal 2 nehmen. Denn ein
Wertebrereich 0 bis 3 mal 2 genommen ergibt zwar nicht MEHR Zahlen, aber
es ergeben sich wieder Zahlen im Bereich 0 bis 6, wobei einige der
Zahlen überhaupt nicht rauskommen können. Damit kannst du dann aber
wieder in die Lookup Tabelle mit 8 Werten gehen.
Die Werte an den Positionen 0 und 1 werden (beide) angebildet, indem man
von 0 ausgeht.
Die Werte an den Positionen 2 und 3 werden abgebildet, indem man von 1
ausgeht
Die Werte an den Positionen 4 und 5 werden abgebildet, indem man von 2
ausgeht
Und zu guter letzt sind die Werte 6 und 7, dann im neuen Wert von 3
zusammengefasst.
Du bist der Programmierer, du machst die Regeln. Und beim Finden der
Regeln, ist es meistens eine gute Strategie, wenn man COmputer und
Programm erst mal aussen vor lässt und sich überlegt: Wie würde ich ganz
persönlich dieses 'Problem' lösen, wenn ich es hätte. An der Wand vor
mir leuchtet eine Anzeige auf, auf der eine Zahl vom ADC steht. Wie gehe
ich als Mensch vor, um aus dieser Zahl die Temperatur zu erhalten, die
dann im Freibad auf die Tafel geschrieben werden soll. Ob du das mit
einer Tabelle machst oder nicht, sei jetzt dahin gestellt. Wie machst du
es?