Forum: Mikrocontroller und Digitale Elektronik Regressiongerade


von Meinhof Walters (Gast)


Lesenswert?

Hallo an alle!
Habe ein Problem moechte jeweils einem 8bit Wert aus dem A/D Wandler
einen anderen Wert einer anderen Kurve zuordnen. Bei 256 Werten waere
das ein riesen Programmieraufwand,oder sehe ich das falsch. Habe jetzt
eine Regressiongerade bestimmt mit dem ich den Kurvenverlauf bestimmen
koennte.Problem hierbei sind die
Koeffizienten.y=5,4094E-8*x^4-1,898E-5*x^3+2,4812E-3*x+4,31354347
Nun klar brauch ich nicht alle Stellen und das Ergebnis soll auch keine
Nachkommastellen mehr aufweisen also gerundet sein, aber wie kann ich
das berechnen?

von Meinhof Walters (Gast)


Lesenswert?

Programmiere in Assembler!

von Peter Kasi (Gast)


Lesenswert?

Ich würd dir schon vorschlagen es mit einer Tabelle zu machen, wenn du
nicht alle Werte benötigst, kannst du deine Tabelle auch
dementsprechend verkleinern. Machst einfach zur Sicherheit eine
Berichsüberprüfung bevor du den Tabellenwert ausliest. Um den
Flashspeicher würde ich mir nicht unbedingt sorgen machen, denn du
sparst einiges wenn du auf Float verzichten kannst.

Gruß
Peter

von Meinhof Walters (Gast)


Lesenswert?

Erklaer mir was du mit einer Tabelle meinst! Ich kenn mich noch nicht so
gut aus und brauche dringend Hilfe!

von Peter Kasi (Gast)


Lesenswert?

einfach was in der Art:


const int look_up[] = {1,2,5,7,8,45,5,6,...};

Zugriff dann mit

unsigned char ad_wert;
int wert;
 ad_wert = hole_ad_wert();
 wert = look_up[ad_wert];

so, oder so ähnlich, einfach den AD-Wert als index in der Tabelle
verwenden, und dir so den zugehörigen wert holen....

von Meinhof Walters (Gast)


Lesenswert?

Versteh das nicht so recht waere dir super damkbar, wenn Du noch etws
genauer erklaeren koenntest.Programmier erst seit 2 wochen in assembler
und muss was fuer die Uni fertigmachen!

von Peter Kasi (Gast)


Lesenswert?

Ok, war erst mal mein Fehler, hab nicht gelesen, dass das "Programmiere
in Assembler!" von dir war. Dachte das war mal wieder einer der
hilfreichen Kommentare die man manchmal so liest...
Ich programmiere kein Assembler, von dem her kann ich dir auch bei der
Umsetzung nicht weiterhelfen. Dürfte aber auch nicht weiter schwer
sein, wenn du das Prinzip verstanden hast. Sowas wie Felder sollte es
ja auch in assembler geben ;)
Gruß
Peter

von Meinhof Walters (Gast)


Lesenswert?

Dank Dir!

von Uwe (Gast)


Lesenswert?

Hi!
Da du nicht gesagt hast welcher uC eben mal als PaP:

lade Indexreg.mit Adr.Tabellenanfang
addiere zum Indexreg. AD-Wert
hole Wert,laut Index,aus Tabelle


Tabelle:1;3;5;7;..

Einfacher geht es kaum.

MfG Uwe

von Thomas Burkhardt (Gast)


Lesenswert?

Eine Regressions*gerade* mit Termen bis x^4 :-)

Ansonsten ist natürlich eine Tabelle (LUT) wie bereits beschrieben das
einfachste, wenn Platz genug da ist...

von AxelR. (Gast)


Lesenswert?

Frage stellt sich jetzt nur noch nach der Skalierung.
Die Funktion ist bei 65->66 null, bei 255 hätte sie den Wert -81.67 und
bei einem ADC-Wert von 1 hätte die Funktion dann einen Wert von 4,316
(gerundet).
Villeicht brauchst Du ja Amplituden, die einen anderen Wertebereich von
x bedingen würden. musst das also nochmal mit deinem Wertebereich
multiplizieren. Denn erst bei 348->349 wird die Funktion wieder 0 und
schmeisst dann wieder positive Werte.
Also wenn Du den gesamten wertebereich erfassen musst, und nicht nur
einen Teil der Kurve-

Ich habe eben mal den wertebereich von 1020 -> 1023 (10bit-anschlag vom
ADC) anzeigen lassen. 38929!! Da läuft dir dein Integer über, ist ja
blöd. Aber Du sagtest ja, du hast nur 255 Werte. Trotzdem aufpassen

Casio baut bessere Taschenrechner als Klaviere...
Gruß
Axel

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.