Hallo zusammen, ich habe das Problem, dass ich in mehreren Geräten jeweils einen Lagesensor unterschiedlich orientiert (nur in 90° Schritten) habe, die Software aber am Besten einheitlich sein sollte. Habt ihr eine Idee, wie ich die Angleichung am besten vornehme? Theoretisch brauche ich einen Index für die drei Achsen und die Information über die entsprechenden Vorzeichen. Vielen Dank, Simon
Simon schrieb: > ich habe das Problem, dass ich in mehreren Geräten jeweils einen > Lagesensor unterschiedlich orientiert (nur in 90° Schritten) habe, die > Software aber am Besten einheitlich sein sollte. Falls es sich um die gleiche Schaltung handelt, dann hast du bestimmt HW-Rev. Pins am µC vorgesehen (oder ähnliches)? Daraus könnte die Firmware erkennen ob sie eine Korrektur vornehmen muss. Sonst wirst du die Geräte wohl Softwaretechnisch kalibrieren müssen, also das die Firmware für jedes Baord weiß, ob sie nen Offset zurechnen soll. Da reicht ja schon eine "bool" Info im Flash/eerpom ob eine Korrektur vorgenommen werden muss. Hoffe ich habe dich da jetzt richtig verstanden.
Adam P. schrieb: > Simon schrieb: >> ich habe das Problem, dass ich in mehreren Geräten jeweils einen >> Lagesensor unterschiedlich orientiert (nur in 90° Schritten) habe, die >> Software aber am Besten einheitlich sein sollte. > > Falls es sich um die gleiche Schaltung handelt, dann hast du bestimmt > HW-Rev. Pins am µC vorgesehen (oder ähnliches)? > Daraus könnte die Firmware erkennen ob sie eine Korrektur vornehmen > muss. > > Sonst wirst du die Geräte wohl Softwaretechnisch kalibrieren müssen, > also das die Firmware für jedes Baord weiß, ob sie nen Offset zurechnen > soll. > Da reicht ja schon eine "bool" Info im Flash/eerpom ob eine Korrektur > vorgenommen werden muss. > > Hoffe ich habe dich da jetzt richtig verstanden. Ja, das hast du. Vielen Dank. Das Programm weiß auch wie die Korrekturfaktoren sind. Ich suche jetzt nur eine elegante Software-Struktur um diese Korrektur vorzunehmen. Beispielsweise so:
1 | int16_t lage[3] = {0}; |
2 | static const uint8_t koord_index = { 1, 0, 2}; |
3 | // x y z
|
4 | static const uint8_t koord_sign = {-1, 1, -1}; |
5 | MMA865x_out_xyz(lage); |
6 | for (uint8_t i = 0; i < 3; i++) |
7 | {
|
8 | lage[koord_index[i] = lage[koord_index[i] * koord_sign[i]; |
9 | }
|
Problem ist hierbei bezieht sich koord_sign auf die "echten" Koordinaten oder auf die relativen. Ich könnte mir aber auch ein
1 | struct
|
vorstellen.
Arbeitest du mit "g"-Werten? Also ich würde die Rohdaten nehmen, die du erhälst und diese korrigieren. Sprich: Wenn X den Wert für 0g haben sollte aber +1g liefert, dann subtrahiere ich den Digitalwert für 1g.
Du könntest eine Drehmatrix verwenden. Die ist auch nicht auf 90° Schritte fest gelegt. In deinem Fall sind die matrix Einträge - 1 0 oder +1. Das wäre in meinen Augen die eleganteste Lösung. Die könnte man End of Linie sogar individuell bedaten um Toleranzen der Bestückung auszugleichen.
Adam P. schrieb: > Arbeitest du mit "g"-Werten? > > Also ich würde die Rohdaten nehmen, die du erhälst und diese > korrigieren. > > Sprich: > Wenn X den Wert für 0g haben sollte aber +1g liefert, > dann subtrahiere ich den Digitalwert für 1g. Stimmt ich arbeite mit "g"-Werten. nur leider ist mir nicht ganz klar, wie du die Vorgeschlagene Korrektur funktioniert. Da die Werte am Ende vergleichbar sein sollen, müssen sie irgendwann ein gemeinsames Koordinatensystem haben. Auch Veränderungen der Lage/Neigung müsen vergleichbar bleiben. Wäre das mit einem Offset möglich?
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.