Morgen Roboternetz,
habe hier den 3D-Beschleunigungssensor/-Kompass LSM303DLH per I2C an ein RN-Control 1.4 angeschlossen (Aufbau siehe Anhang). Nach zwei Tagen Kopfrauchen kann ich auch die Beschleunigungswerte auslesen.
Allerdings verhalten sich zwei der drei Achsen etwas merkwürdig. Wie im Ausgabe-Beispiel (Anordnung X Y Z, eine Zeile = ein Datensatz) zu sehen ist, springt die X-/Z-Achse augenscheinlich willkürlich innerhalb des eingestellten +-2g-Bereiches hin und her. Seltsamerweise tun sie dies nur in Schritten eines Vielfachen von 0,25 g.
Nur die mittlere Wertspalte (Y-Achse) liefert die im horizontalen, unbewegten Zustand erwarteten konstanten Werte. Kippt man die Platine, verändert sich die Y-Spalte sehr feinfühlig und spiegelt als einzige den zunehmenden/abnehmenden Anteil der Erdbeschleunigung wider (bis max. 1 g).
Zudem sind die Achsen vertauscht, die im Datenblatt beschriebenen Register entsprechen nicht dem auf der Platine angegebenen Koordinatensystem.
Könnt Ihr mir einen Hinweis geben, warum die X-/Z-Achse so springt? Mir erscheint das unerklärlich, denn alle drei Achsen werden auf die gleiche Art ausgelesen, verarbeitet und in einen g-Wert umgerechnet (siehe Code).
Danke Euch.
Code:1.50 0.00 1.25 1.50 0.00 0.50 1.25 0.00 0.00 1.00 0.00 0.75 1.25 0.00 0.50 -2.00 0.00 1.00 1.25 0.00 0.50 1.00 0.00 0.00 0.75 0.00 0.75 1.25 0.00 0.00 1.25 0.00 0.50 0.75 0.00 0.25 -2.00 0.00 1.00 1.75 0.00 1.00 -2.00 0.00 0.75 1.25 0.00 0.50 1.50 0.00 0.50 1.50 0.00 1.25 -2.00 0.00 0.75 1.00 0.00 -0.25 1.00 0.00 0.50 -1.75 0.00 0.25 -2.00 0.00 0.00Code:$regfile = "m32def.dat" $framesize = 32 $swstack = 32 $hwstack = 32 $crystal = 16000000 $baud = 9600 Config Scl = PortC.0 Config Sda = PortC.1 Const ACC_W_ADDR = &H30 Const ACC_R_ADDR = &H31 Const CTRL_REG1_A = &H20 Const CTRL_REG4_A = &H23 Const OUT_X_L_A = &H28 Const OUT_X_H_A = &H29 Const OUT_Y_L_A = &H2A Const OUT_Y_H_A = &H2B Const OUT_Z_L_A = &H2C Const OUT_Z_H_A = &H2D Const RES_2G = 0.0009765625 'Auflösung bei +- 2g Declare Sub LSM303_Init() Declare Sub ACC_WriteReg(ByVal bReg As Byte , ByVal bVal As Byte) Declare Sub ACC_ReadSensorData() '-> iAx, iAy, iAz Declare Sub ACC_CalcGValues() '-> sGx, sGy, sGz Dim abAccData(6) As Byte Dim iAx As Integer At abAccData(1) Overlay Dim iAy As Integer At abAccData(3) Overlay Dim iAz As Integer At abAccData(5) Overlay Dim sGx As Single Dim sGy As Single Dim sGz As Single LSM303_Init Do ACC_ReadSensorData ACC_CalcGValues PRINT FUSING(sGx , "#.##") ; " " ; FUSING(sGy , "#.##") ; " " ; FUSING(sGz , "#.##") WAITMS 100 Loop End Sub LSM303_Init() ACC_WriteReg CTRL_REG1_A , &H27 'normal power mode, 50 Hz data rate, all axes enabled End Sub Sub ACC_WriteReg(ByVal bReg As Byte , ByVal bVal As Byte) I2CSTART I2CWBYTE ACC_W_ADDR I2CWBYTE bReg I2CWBYTE bVal I2CSTOP End Sub Sub ACC_ReadSensorData() I2CSTART 'ST I2CWBYTE ACC_W_ADDR 'SAD + W I2CWBYTE &HA8 'SUB = OUT_X_L_A, SUB(7) = 1 I2CSTART 'SR I2CWBYTE ACC_R_ADDR 'SAD + R I2CRBYTE abAccData(1) I2CRBYTE abAccData(2) , ACK I2CRBYTE abAccData(3) I2CRBYTE abAccData(4) , ACK I2CRBYTE abAccData(5) I2CRBYTE abAccData(6) , NACK I2CSTOP SHIFT iAx , RIGHT , 4 , SIGNED SHIFT iAy , RIGHT , 4 , SIGNED SHIFT iAz , RIGHT , 4 , SIGNED End Sub Sub ACC_CalcGValues() sGx = iAx * RES_2G sGy = iAy * RES_2G sGz = iAz * RES_2G End Sub








Zitieren

Lesezeichen