Frage zur Sprungtabelle

Gast #2748073
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.
Gast
...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
Gast
...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
Moderator Persönliche Seite
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.
Gast
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.