Forum: Mikrocontroller und Digitale Elektronik Frage zur Sprungtabelle


von Springer (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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

von Clemens M. (panko)


Lesenswert?

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.

von Springer (Gast)


Lesenswert?

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

von Springer (Gast)


Lesenswert?

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

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Tom M. (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.