Forum: Mikrocontroller und Digitale Elektronik ADXL312 Messwerte in g umrechnen


von Cyrus X. (cyrus-nab)


Lesenswert?

Hallo Leute,
ich habe schon sehr viel darüber gelesen, nur hängts an meiner 
Umrechnung in g.

Ich studiere Elektrotechnik und bin momentan im Praxissemester. Ich 
arbeite am ADXL312 im Full Resolution Mode.

Soweit habe ich eigentlich alles programmiert.

Ich lese die Register 0x32-0x37
-> Speicherung in U8_T struct
-> Berechnung der Summen für Durchschnittsberechnung jedes Bytes und 
Speicherung in U16 struct
-> Durchschnittswerte und Speicherung jedes Bytes in S16_T struct
-> Umtausch der Reihenfolge der Bytes einer jeden Achse, Bitshift und 
Speicherung in einem S16_T struct
-> Durchführung des Zweierkomplements und Speicherung in Float32 struct 
mit:
1
accDataRx_ptr->f32_dataRxTwosCompl[i] = (~accDataRx_ptr->s16_dataRxOrganized[i] + 0x0001);
-> Multiplikation mit 2.9mg und -1 um den g-Wert für jede Achse zu 
erhalten und Speicherung in Float32 struct

Also:
U8 -> U16 -> S16 -> S16 -> F32 -> F32

Jetzt erhalte ich als Einheit bei Ruhelage mit Z-Achse aus der 
Tischebene senkrecht heraus folgenden mg-Wert (+- 0.01):
x: 0.1015
y: 0.0232
z: 0.2407

Die x- und y-Werte müssten soweit passen, den Offset müsste ich noch 
rausrechnen richtig?

Aber z bleibt immer positiv, die Lage des ADXL wird also theoretisch in 
z-Richtung nicht verändert.


Wo liegt der Fehler?
Liegt es an den Typkonversionen?
Oder am Handling der empfangenen Bytes? Laut PDF UG-281 S.4 sind bei 
FullRes-Mode D15-D12 SIGN Bits. Ich glaube dass ich diese irgendwie 
einfach ignoriere und falsch behandle. Ich berechne sie ja einfach mit 
in die Durchschnittswerte mit ein. Das sollte ich nicht tun richtig?

Vielen Dank für eure Hilfe

Schöne Grüße
Cyrus

von Sven B. (scummos)


Lesenswert?

Dass du für (x, y, z) bei einem ruhenden Chip (0, 0, -g) erwartest und 
nicht (0, 0, 0) ist dir bewusst, oder? Das Vorzeichen von z kehrt sich 
nur dann um, wenn du den Sensor quasi aktiv auf den Boden wirfst (beim 
passiven Fallen lassen wäre z=0). Oder du drehst ihn einfach auf den 
Kopf, dann müsste sich das z-Vorzeichen auch umkehren. Findet der Chip 
wahrscheinlich auch besser als auf den Boden schmeißen ;)

Falls dir das klar war, sorry :)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Cyrus XX schrieb:

> -> Durchführung des Zweierkomplements und Speicherung in Float32 struct
> mit:
>
1
accDataRx_ptr->f32_dataRxTwosCompl[i] = 
2
> (~accDataRx_ptr->s16_dataRxOrganized[i] + 0x0001);

~ ist kein 2-er Komplement.

> Wo liegt der Fehler?
> Liegt es an den Typkonversionen?

Du hast offenbar eine Ausgabemöglichkeit.
Lass dir halt mal alles ausgeben und nicht nur das Endergebnis!

Beginnend mit den Werten, die du vom Register bekommst, lässt du dir 
alles - jedes einzelne Byte, jeden einzelnen Wert - durch alle 
Umrechnungen ausgeben.
Und dann machst du die Umrechnung mal händisch mit Papier und Bleistift 
und den Angaben im Datenblatt.
Das lässt dich nicht nur den Fehler finden, sondern wird auch dein 
Verständnis schulen.

Wenn hinten was falschen rauskommt, dann kann man sich natürlich 
hinstellen und heulen. Man kann sich aber auch auf den Standpunkt 
stellen: Ok, dann seh ich mir halt mal an, wie das Ergebnis zustande 
kommt. Und zwar beginnend mit den Werten, die ganz vorne in das 
Verfahren reingehen.
DIe zweite Vorgehensweise ist die eines Softwareentwicklers, die erste 
Vorgehensweise ist die des Rests der Welt.

: Bearbeitet durch User
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.