- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 35

Thema: LSM303DLH 3D Compass and accelerometer Umrechnungsporblem

  1. #21
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Anzeige

    Praxistest und DIY Projekte
    Beide Lösungen ("Shift") und mit Overlay sollten dieselben Ergebnisse/Werte bringen.

    Was mir noch auffällt:
    Beim "Shift" verwendest du die "Signed"-Variante. Das sollte aber nicht richtig sein: Nimm das Shiften ohne Vorzeichen oder rechne einfach (Highbyte * 256 + Lowbyte),- das passt immer.
    Gruß
    Dirk

  2. #22
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.06.2010
    Ort
    Darmstadt
    Beiträge
    136
    So hab jetzt nochmal das abgeändert und ausprobiert.
    Find alles sehr merkwürdig^^

    Alle Ergebnisse wurden praktisch Zeitgleich erstellt und der Sensor wurde dabei nicht bewegt.

    Hier mal der aktuelle Code zum Auslesen des ACC Wertes:
    Code:
    Sub Acc_readsensordata()
       Slaveadress = Acc_w_addr                '= &H30
       Subadress = Out_x_l_a                     '= &H28
    
       Subadress.7 = 1                                    'Variablen sind so deklariert: Dim Slaveadress As Byte        Dim Subadress As Byte 
       I2cstart
       I2cwbyte Slaveadress                                     'SAD+W
       I2cwbyte Subadress
       Incr Slaveadress                                         'for reading LSB=1
       I2crepstart
       I2cwbyte Slaveadress                                     'SAD+R
    
       I2crbyte Iax_tmp(2) , Ack                            'Variablen sind so deklariert: Dim Iax_tmp(2) As Byte At Iax Overlay     Dim Iax As Integer
       I2crbyte Iax_tmp(1) , Ack
       I2crbyte Iay_tmp(2) , Ack
       I2crbyte Iay_tmp(1) , Ack
       I2crbyte Iaz_tmp(2) , Ack
       I2crbyte Iaz_tmp(1) , Nack
       I2cstop
    
       Print "Iax: " ; Iax ; "    " ; "Iay: " ; Iay ; "    " ; "Iaz: " ; Iaz
    End Sub
    Die Ergebnisse hierzu:
    Iax: 4096 Iay: 0 Iaz: -7999
    Iax: 4096 Iay: 4096 Iaz: -24383
    Iax: 8192 Iay: 16384 Iaz: -12095
    Code zum Auslesen des Magnetsensors ohne Shift:
    Code:
    Sub Magnet_readsensordata()
       Slaveadress = Magnet_w_addr              '&H3C 
       Subadress = Out_x_h_m                      '&H03
    
       Subadress.7 = 1                                 'Variablen sind so deklariert: Dim Slaveadress As Byte        Dim Subadress As Byte
    
       I2cstart
       I2cwbyte Slaveadress                                     'SAD+W
       I2cwbyte Subadress
       Incr Slaveadress                                         'for reading LSB=1
       I2crepstart
       I2cwbyte Slaveadress                                     'SAD+R
    
       I2crbyte Imx_tmp(1) , Ack                    'Variablen sind so deklariert: Dim Imx_tmp(2) As Byte At Imx Overlay     Dim Imx As Integer
       I2crbyte Imx_tmp(2) , Ack
       I2crbyte Imy_tmp(1) , Ack
       I2crbyte Imy_tmp(2) , Ack
       I2crbyte Imz_tmp(1) , Ack
       I2crbyte Imz_tmp(2) , Nack
       I2cstop
    
       Print "Imx: " ; Imx ; "    " ; "Imy: " ; Imy ; "    " ; "Imz: " ; Imz
    End Sub
    Die Ergebnisse hierzu:
    Imx: 21504 Imy: 1280 Imz: 1537
    Imx: 18432 Imy: 1536 Imz: 2049
    Imx: 17920 Imy: 0 Imz: 4097

    Und nochmal Magnetsensor mit Shift
    Code:
    Sub Magnet_calcmvalues()
       Wait 1
       Slaveadress = Magnet_w_addr              '&H3C
       Subadress = Out_x_h_m                      '&H03
    
       Subadress.7 = 1                                 'Variablen sind so deklariert: Dim Slaveadress As Byte        Dim Subadress As Byte
    
       I2cstart
       I2cwbyte Slaveadress                                     'SAD+W
       I2cwbyte Subadress
       Incr Slaveadress                                         'for reading LSB=1
       I2crepstart
       I2cwbyte Slaveadress                                     'SAD+R
    
       I2crbyte Abmagdata(1) , Ack                         'Variablen sind so deklariert: Dim Abmagdata(6) As Byte
       I2crbyte Abmagdata(2) , Ack
       I2crbyte Abmagdata(3) , Ack
       I2crbyte Abmagdata(4) , Ack
       I2crbyte Abmagdata(5) , Ack
       I2crbyte Abmagdata(6) , Nack
       I2cstop
    
    
       'Iaxx = Abmagdata(1)                         'Variablen sind so deklariert: Dim Iaxx As Integer 
       'Shift Iaxx , Left , 8
       'Iaxx = Iaxx + Abmagdata(2)
    
       Iayy = Abmagdata(3)
       Shift Iayy , Left , 8
       Iayy = Iayy + Abmagdata(4)
    
       Iazz = Abmagdata(5)
       Shift Iazz , Left , 8
       Iazz = Iazz + Abmagdata(6)
    
       Print "Shift: Imx: " ; Iaxx ; "    " ; "Imy: " ; Iayy ; "    " ; "Imz: " ; Iazz
       Print ""
    End Sub
    und deren Ergebnisse: (Ich habe auch deine Variante mit (Highbyte * 256 + Lowbyte) ausprobiert. kommt das selbe raus wie bei shift)
    Shift: Imx: 75 Imy: 11 Imz: 266
    Shift: Imx: 83 Imy: 14 Imz: 264
    Shift: Imx: 74 Imy: -6 Imz: 277
    Es gibt keine Probleme, es gibt nur Lösungen

  3. #23
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    1. Zum "Auslesen des ACC-Wertes":
    Wie ist Iax_tmp(1) definiert? Nimm lieber einzelne Byte-Variablen und nicht Arrays. High- und Low-Byte richtig angeordnet?

    2. Zum "Magnetsensor ohne Shift":
    Wie ist Imx_tmp(1) definiert? Nimm lieber einzelne Byte-Variablen und nicht Arrays.

    3. Zum "Magnetsensor mit Shift":
    Sieht noch am besten aus. Die Werte sind aber etwas niedrig...?
    Gruß
    Dirk

  4. #24
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.06.2010
    Ort
    Darmstadt
    Beiträge
    136
    Zitat Zitat von Dirk Beitrag anzeigen
    1. Zum "Auslesen des ACC-Wertes":
    Wie ist Iax_tmp(1) definiert? Nimm lieber einzelne Byte-Variablen und nicht Arrays. High- und Low-Byte richtig angeordnet?

    2. Zum "Magnetsensor ohne Shift":
    Wie ist Imx_tmp(1) definiert? Nimm lieber einzelne Byte-Variablen und nicht Arrays.

    3. Zum "Magnetsensor mit Shift":
    Sieht noch am besten aus. Die Werte sind aber etwas niedrig...?
    Habs extra hinten dran geschrieben aber gerne nochmal^^

    Zu 1:
    Dim Iax As Integer
    Dim Iax_tmp(2) As Byte At Iax Overlay
    High und Low Byte müsste richtig angeordnet sein. Laut Datenblatt kommt erst das Low Byte und dann das High Byte. Beim Magnetsensor genau umgedreht.

    Zu 2:
    Dim Imx As Integer
    Dim Imx_tmp(2) As Byte At Imx Overlay

    zu 3:
    jop ich denk auch dass die Werte zu niedrig sind. aber ich weis nicht warum. normal müsste doch die selben Werte raus kommen??
    Find das alles sehr merkwürdig...
    Es gibt keine Probleme, es gibt nur Lösungen

  5. #25
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @robonooby:
    Zu 1 und 2: Ich hatte aber nach Iax_tmp(1) bzw. Imx_tmp(1) gefragt!
    Der Grund meiner Frage:
    Wenn du als _tmp-Variablen ein Array nimmst, hat das wieder eine eigene Struktur im Speicher. Wenn du also das _tmp-Array mit Index (2) als Overlay-Adresse benutzt, liegt das _tmp-Array mit Index (1) unterhalb von Index (2) im Speicher, also auch unterhalb der Iax bzw. Imx Variable.

    Zu 3: Du könntest mit den Werten (ohne weitere Kalibrierung/Normalisierung) einmal die Richtung errechnen. Kommt da was Sinnvolles raus?
    Gruß
    Dirk

  6. #26
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.06.2010
    Ort
    Darmstadt
    Beiträge
    136
    Mühsam ernährt sich das Eichhörnchen
    bin jetzt weiter gekommen, und die Werte scheinen ganz Brauchbar zu sein. Auch wenn ichs nicht ganz verstehe^^

    hier erstmal der aktuelle Code:

    Deklarationen:
    Code:
    'Variablen für Beschleunigungs Sensor:
    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
    
    'Variablen für Magnetfeld Sensor :
    Const Magnet_w_addr = &H3C                                  '3C
    Const Magnet_r_addr = &H3D
    
    Const Cra_reg_m = &H00
    Const Crb_reg_m = &H01
    Const Mr_reg_m = &H02
    
    Const Out_x_h_m = &H03                                      ' Magnetfeld
    Const Out_x_l_m = &H04
    Const Out_y_h_m = &H05
    Const Out_y_l_m = &H06
    Const Out_z_h_m = &H07
    Const Out_z_l_m = &H08
    
    Dim Slaveadress As Byte                                     'Adress of the slave to read or write
    Dim Subadress As Byte                                       'the register to read or write
    
    Dim Iax As Integer
    Dim Iay As Integer
    Dim Iaz As Integer
    
    Dim Xha As Byte
    Dim Xla As Byte
    Dim Yha As Byte
    Dim Yla As Byte
    Dim Zha As Byte
    Dim Zla As Byte
    
    Dim Imx As Integer
    Dim Imy As Integer
    Dim Imz As Integer
    
    Dim Xhm As Byte
    Dim Xlm As Byte
    Dim Yhm As Byte
    Dim Ylm As Byte
    Dim Zhm As Byte
    Dim Zlm As Byte
    
    
    Dim Sgx As Single                                           'Beschleunigungsvariablen
    Dim Sgy As Single
    Dim Sgz As Single
    
    Dim Pitch As Single
    Dim Roll As Single
    
    Dim Magnetx As Single                                       'Magnetfeldvariablen
    Dim Magnety As Single
    Dim Magnetz As Single
    Dim Richtung As Single
    ACC Sensor:
    Code:
    Sub Acc_readsensordata()
        Subadress = Out_x_l_a                                   '&H28
    
       Subadress.7 = 1
       I2cstart
       I2cwbyte Acc_w_addr                                      '&H30         'SAD+W
       I2cwbyte Subadress
       I2crepstart
       I2cwbyte Acc_r_addr                                      'SAD+R     Acc_r_addr = &H31
    
    
       I2crbyte Xla , Ack
       I2crbyte Xha , Ack
       I2crbyte Yla , Ack
       I2crbyte Yha , Ack
       I2crbyte Zla , Ack
       I2crbyte Zha , Nack
       I2cstop
    
       Iax = Xha
       Shift Iax , Left , 8
       Iax = Iax + Xla
    
       Iay = Yha
       Shift Iay , Left , 8
       Iay = Iay + Yla
    
       Iaz = Zha
       Shift Iaz , Left , 8
       Iaz = Iaz + Zla
    
       Sgx = Iax
       Sgy = Iay
       Sgz = Iaz
    
       Print "Iax: " ; Iax ; "    " ; "Iay: " ; Iay ; "    " ; "Iaz: " ; Iaz
    End Sub
    Magnet Sensor:
    Code:
    Sub Magnet_readsensordata()
       Subadress = Out_x_h_m                                    '&H03
    
       I2cstart
       I2cwbyte Magnet_w_addr                                   'SAD+W   '&H3C
       I2cwbyte Subadress
       I2crepstart
       I2cwbyte Magnet_r_addr                                   'SAD+R         Magnet_r_addr = &H3D
    
       I2crbyte Xlm , Ack
       I2crbyte Xhm , Ack
       I2crbyte Ylm , Ack
       I2crbyte Yhm , Ack
       I2crbyte Zlm , Ack
       I2crbyte Zhm , Nack
       I2cstop
    
       Print "XHM: " ; Xhm ; " XLM: " ; Xlm ; " YHM: " ; Yhm ; " YLM: " ; Ylm ; " ZHM: " ; Zhm ; " ZLM: " ; Zlm
    
       Imx = Xhm
       Shift Imx , Left , 8
       Imx = Imx + Xlm
    
       Imy = Yhm
       Shift Imy , Left , 8
       Imy = Imy + Ylm
    
       Imz = Zhm
       Shift Imz , Left , 8
       Imz = Imz + Zlm
    
       Print "Imx: " ; Imx ; "    " ; "Imy: " ; Imy ; "    " ; "Imz: " ; Imz
    
    End Sub
    Ergebnisse:
    hierbei wurde der Sensor im Uhrzeigersinn immer um 90 Grad gedreht. Bei der letzten Messung von der Ausgangsposition um 90° um die y-Achse gedreht.
    Ausgangsposition:
    Iax: 0 Iay: 32 Iaz: -15824
    Pitch: 1.570796366 Roll 1.570796366
    XHM: 79 XLM: 0 YHM: 249 YLM: 255 ZHM: 15 ZLM: 1
    Imx: 20224 Imy: -1537 Imz: 3841
    Richtung: 79.248695372

    Iax: -16 Iay: 0 Iaz: -15904
    Pitch: 1.570796366 Roll 1.570796366
    XHM: 166 XLM: 255 YHM: 111 YLM: 255 ZHM: 18 ZLM: 1
    Imx: -22785 Imy: 28671 Imz: 4609
    Richtung: 281.433227538

    Iax: 64 Iay: 128 Iaz: -15824
    Pitch: 1.570796366 Roll 1.570796366
    XHM: 15 XLM: 255 YHM: 20 YLM: 0 ZHM: 13 ZLM: 1
    Imx: 4095 Imy: 5120 Imz: 3329
    Richtung: 50.892387387

    Iax: 0 Iay: 16 Iaz: -15936
    Pitch: 1.570796366 Roll 1.570796366
    XHM: 189 XLM: 255 YHM: 174 YLM: 0 ZHM: 253 ZLM: 0
    Imx: -16897 Imy: -20992 Imz: -768
    Richtung: 267.394683837

    Iax: -15872 Iay: 272 Iaz: 1280
    Pitch: 1.570796366 Roll 1.570796366
    XHM: 220 XLM: 0 YHM: 254 YLM: 255 ZHM: 115 ZLM: 255
    Imx: -9216 Imy: -257 Imz: 29695
    Richtung: 342.755859375
    Was mich verwundert ist, dass der Magnetsensor zuerst Low Byte und dann High Byte raushaut. Im Datenblatt steht das ganz anderst drin. Wenn ichs laut Datenblatt mache dann kommen sehr niedrige Werte wie dieser folgender raus:
    Ebenfalls ca in Ausgangsposition von obiger Messung
    Iax: 32 Iay: 0 Iaz: -15904
    Pitch: 1.570796366 Roll 1.570796366
    XHM: 0 XLM: 81 YHM: 255 YLM: 250 ZHM: 1 ZLM: 9
    Imx: 81 Imy: -6 Imz: 265
    Richtung: 16.859010695
    Weis jetzt nicht was eher stimmen könnte
    Und warum das ganze mit Arrays nicht richtig funktioniert ist mir auch schleierhaft...
    Es gibt keine Probleme, es gibt nur Lösungen

  7. #27
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @robonooby:
    Die Richtungsausgabe sieht doch schon mal ganz gut aus. Pitch/Roll zeigen nur konstante Werte, stimmt da was nicht!?
    Was mich verwundert ist, dass der Magnetsensor zuerst Low Byte und dann High Byte raushaut. Im Datenblatt steht das ganz anderst drin.
    Ne, für den LSM303DLH steht das genau so auch im Datenblatt.
    Anders ist das beim Magnetsensor vom LSM303DLHC,- der hat die High-Low Reihenfolge der Output-Register.
    Und warum das ganze mit Arrays nicht richtig funktioniert ist mir auch schleierhaft...
    Den Grund hatte ich dir geschrieben.
    Gruß
    Dirk

  8. #28
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.06.2010
    Ort
    Darmstadt
    Beiträge
    136
    Zitat Zitat von Dirk Beitrag anzeigen
    @robonooby:
    Die Richtungsausgabe sieht doch schon mal ganz gut aus. Pitch/Roll zeigen nur konstante Werte, stimmt da was nicht!?

    Ne, für den LSM303DLH steht das genau so auch im Datenblatt.
    Anders ist das beim Magnetsensor vom LSM303DLHC,- der hat die High-Low Reihenfolge der Output-Register.

    Den Grund hatte ich dir geschrieben.
    Oh da hab ich dann wohl das falsche Datenblatt runter geladen^^
    Ja aber normal müsste das doch das gleiche sein? Also kenn das nur vom PC Programmieren, dass er immer genau so viel Speicher reserviert wie er braucht...

    Pitch/Roll ist so nicht korrekt das stimmt. das liegt aber an der Berechnung. Da bin ich gerade dran. aber immerhin ändern sich die Ausgangswerte.

    Also dann erstmal vielen Dank für eure Gedult und Hilfe
    Es gibt keine Probleme, es gibt nur Lösungen

  9. #29
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.06.2010
    Ort
    Darmstadt
    Beiträge
    136
    So nachdem ich soweit brauchbare Ergebnisse rausbekommen hab, bin ich dabei das ganze zu Kalibrieren. Hierzu brauch ich Kalibrierungsfaktoren. Beim ACC hab ichs soweit geschaft.
    Beim Magnetsensor komm ich gerade nicht weiter.
    Hab mir erstmal die Werte vom Magnetsensor (Imx, Imy, Imz) ausgeben lassen und dann in Excel geplottet. Laut compass-app-note Dokument und dieser Seite soll das ganze dann nen Kreis oder zumindestens ne Elypse werden.
    bei mir ist es allerdings alles andere geworden^^

    hier mal das Bild:
    Klicke auf die Grafik für eine größere Ansicht

Name:	Plotergebnisse.jpg
Hits:	5
Größe:	145,4 KB
ID:	25413
    Kann es sein, dass der Sensor da so streut oder können das Stöhrquellen sein, die das Gesammtbild so sehr beeinflussen?
    Hat jemand schonmal sowas gemacht und kann mir hier ggf. Tipps geben...

    Wenn ich den Winkel ausrechne kommt bei einer Drehung nichts Sinnvolles raus. Ist einfach nicht Gleichmäßig. zwischen 0 und 90 Grad zeigt er zum Beispiel -90 und 180 Grad an und sowas. Ist also nicht linear.
    Es gibt keine Probleme, es gibt nur Lösungen

  10. #30
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi robonooby:
    Das Kalibrieren und Beseitigen von allen Einflußfaktoren beim Magnetometer ist schon eine Herausforderung.
    Wenn du da ganz genau sein willst und z.B. Hard- und Soft-Iron Effekte (das ist die elliptische Messwert-Wolke) kompensieren willst, must du schon Aufwand betreiben.
    Das Ganze lohnt auch nur, wenn dein Sensor schon dauerhaft auf/in DER Hardware montiert ist, wo er definitiv seinen Dienst tun soll.
    D.h. wenn er noch auf einem Experimentierbrett "herumfliegt", braucht und kann man kaum etwas kompensieren und sollte nur kalibrieren.

    Gute Lektüre:
    - AN996 (Microchip)
    - "Applications of Magnetoresistive Sensors in Navigation Systems" (Honeywell Inc.)
    - AN00022 (PHILIPS)
    - AN4248 (Freescale Semiconductor)
    Gruß
    Dirk

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Ähnliche Themen

  1. 3D-Beschleunigungssensor LSM303DLH auslesen
    Von dariegel im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 19.08.2011, 17:55
  2. 3D-Accelerometer ADXL330
    Von BlueNature im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 22
    Letzter Beitrag: 14.02.2010, 01:16
  3. Accelerometer Empfehlung
    Von justin im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 5
    Letzter Beitrag: 19.10.2009, 16:15
  4. 3 Achsen Accelerometer
    Von Involut im Forum Sensoren / Sensorik
    Antworten: 13
    Letzter Beitrag: 11.04.2009, 15:00
  5. V2Xe 2-Axis Compass Modul
    Von Wredo2 im Forum Sensoren / Sensorik
    Antworten: 0
    Letzter Beitrag: 22.10.2004, 15:13

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress