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?
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.