- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 3542

Thema: Willas Shrediquette Tricopter / Quadrocopter / Hexacopter

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Hi,

    ich würde die Platinen lieber mit Spiritus reinigen
    Zu deinem Code:
    Die "i2c_twi.lbx" ist beim XMega unnötig, die I2C Kommunikation ist schon in der "xmega.lib" integriert.
    Hier mal mein Testcode nur für den MPU und COM2 (portc.6/7) (ungetestet):
    Code:
    $regfile = "xm32a4def.dat"
    $crystal = 32000000
    $framesize = 100
    $hwstack = 100
    $swstack = 100
    
    
    $lib "xmega.lib"
    $external _xmegafix_clear
    $external _xmegafix_rol_r1014
    
    
    Config Osc = Disabled , 32mhzosc = Enabled
    Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
    
    
    
    Declare Sub Init_mpu()
    Declare Sub Read_mpu()
    
    
    
    
    Config Com2 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
    'Config Serialout1 = Buffered , Size = 200
    Open "COM2:" For Binary As #1
    
    
    Dim Twi_start As Byte
    Open "twie" For Binary As #2
    Config Twie = 400000
    
    
    
    Const Mpuaddw = &B11010000                                  'AD0 auf Masse
    Const Mpuaddr = &B11010001
    
    
    Dim Test As Byte
    
    
    Dim Gyrox As Integer
    Dim Gyroy As Integer
    Dim Gyroz As Integer
    Dim Tmp_gyrox(2) As Byte At Gyrox Overlay
    Dim Tmp_gyroy(2) As Byte At Gyroy Overlay
    Dim Tmp_gyroz(2) As Byte At Gyroz Overlay
    
    
    Dim Accx As Integer
    Dim Accy As Integer
    Dim Accz As Integer
    Dim Tmp_accx(2) As Byte At Accx Overlay
    Dim Tmp_accy(2) As Byte At Accy Overlay
    Dim Tmp_accz(2) As Byte At Accz Overlay
    
    
    
    
    I2cinit #2
    
    
    Call Init_mpu()
    
    
    
    
    Config Priority = Static , Vector = Application , Lo = Enabled , Med = Enabled
    Enable Interrupts
    
    
    
    Do
    
    
       Call Read_mpu()
    
       Print #1 , Gyrox
    
       Waitms 100
    
    
    Loop
    
    End
    
    
    Sub Init_mpu()
    
       I2cstart #2                                              'start condition
       I2cwbyte Mpuaddw , #2                                    'write adress of MPU-6050
       I2cwbyte 117 , #2                                        'Register 117 "Who am I"
       I2crepstart #2                                           'repeated start
       I2cwbyte Mpuaddr , #2                                    'read adress of MPU-6050
       I2crbyte Test , Nack , #2                                'read byte WHO_AM_I (Reg 117)
       I2cstop #2                                               'stop condition
    
       Print #1 , Test
    
       I2cstart #2                                              'start condition
       I2cwbyte Mpuaddw , #2                                    'write adress of MPU-6050
       I2cwbyte 25 , #2                                         'Register 25 Sample Rate Divider (1..8 kHz)
       I2cwbyte &B00000000 , #2                                 'Divider set to 1   (soll)
       I2cstop #2                                               'stop condition
    
       I2cstart #2                                              'start condition
       I2cwbyte Mpuaddw , #2                                    'write adress of MPU-6050
       I2cwbyte 26 , #2                                         'Register 26 DLPF_CFG (digital lowpass filter) Configuration
       I2cwbyte &B00000000 , #2                                 'Bits 0..2 = 000 - ACC:260Hz, 0.0ms; Gyro:256Hz, 0.98ms   ( &B00000000 )
       I2cstop #2                                               'stop condition
    
       I2cstart #2                                              'start condition
       I2cwbyte Mpuaddw , #2                                    'write adress of MPU-6050
       I2cwbyte 27 , #2                                         'Register 27 Gyro Configuration
       I2cwbyte &B00000000 , #2                                 'Bits 3+4 = 00 - Full Scale Range: +/-250°/s
       I2cstop #2                                               'stop condition
    
       I2cstart #2                                              'start condition
       I2cwbyte Mpuaddw , #2                                    'write adress of MPU-6050
       I2cwbyte 28 , #2                                         'Register 28 ACC Configuration
       I2cwbyte &B00000000 , #2                                 'Bits 3+4 = 00 - Full Scale Range: +/-2g / No High Pass Filter
       I2cstop #2                                               'stop condition
    
       I2cstart #2                                              'start condition
       I2cwbyte Mpuaddw , #2                                    'write adress of MPU-6050
       I2cwbyte 107 , #2                                        'Register 107 Power Management 1
       I2cwbyte &B00001011 , #2                                 'No Reset / No Sleep / No Cycle / Temp_Sens: Dis / Clock Source: Z-Gyro
       I2cstop #2
    
    End Sub
    
    
    Sub Read_mpu()
    
       I2cstart #2                                              'X ACC
       I2cwbyte Mpuaddw , #2
       I2cwbyte 59 , #2
       I2crepstart #2
       I2cwbyte Mpuaddr , #2
       I2crbyte Tmp_accx(2) , Ack , #2
       I2crbyte Tmp_accx(1) , Nack , #2
       I2cstop #2
    
       I2cstart #2                                              'Y ACC
       I2cwbyte Mpuaddw , #2
       I2cwbyte 61 , #2
       I2crepstart #2
       I2cwbyte Mpuaddr , #2
       I2crbyte Tmp_accy(2) , Ack , #2
       I2crbyte Tmp_accy(1) , Nack , #2
       I2cstop #2
    
       I2cstart #2                                              'Z ACC
       I2cwbyte Mpuaddw , #2
       I2cwbyte 63 , #2
       I2crepstart #2
       I2cwbyte Mpuaddr , #2
       I2crbyte Tmp_accz(2) , Ack , #2
       I2crbyte Tmp_accz(1) , Nack , #2
       I2cstop #2
    
    
       I2cstart #2                                              'X GYRO
       I2cwbyte Mpuaddw , #2
       I2cwbyte 67 , #2
       I2crepstart #2
       I2cwbyte Mpuaddr , #2
       I2crbyte Tmp_gyrox(2) , Ack , #2
       I2crbyte Tmp_gyrox(1) , Nack , #2
       I2cstop #2
    
       I2cstart #2                                              'Y GYRO
       I2cwbyte Mpuaddw , #2
       I2cwbyte 69 , #2
       I2crepstart #2
       I2cwbyte Mpuaddr , #2
       I2crbyte Tmp_gyroy(2) , Ack , #2
       I2crbyte Tmp_gyroy(1) , Nack , #2
       I2cstop #2
    
       I2cstart #2                                              'Z GYRO
       I2cwbyte Mpuaddw , #2
       I2cwbyte 71 , #2
       I2crepstart #2
       I2cwbyte Mpuaddr , #2
       I2crbyte Tmp_gyroz(2) , Ack , #2
       I2crbyte Tmp_gyroz(1) , Nack , #2
       I2cstop #2
    
    End Sub
    Die Test-Ausgabe sollte einen Wert von 104 (glaube ich) haben.

    Gruß
    Chris

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von deHarry
    Registriert seit
    17.08.2010
    Beiträge
    597
    Hi Chris,

    104 als Antwort vom MPU ist korrekt.

    In der Leseroutine (Read_MPU() solltest du um Zeit zu sparen die Tatsache ausnutzen, dass die ACC- und die Gyro-Register jeweils ohne Lücke hintereinander liegen.

    Das machst du, indem du das Startregister für X ACC vorgibst und dann alle 6 Werte hintereinander mit I2rbyte xxx, Ack , #2 einliest.
    Erst beim zweiten Byte von Z ACC kommt der Lesebefehl mit Nack und anschließendem I2Stop.
    Da wir die Z-Achse nicht verwenden, kannst du weitere 2 Leseops sparen, indem du schon bei Y ACC aufhörst.

    Bei den Gyros genauso, aber da der Tempsensor dazwischen liegt, muss leider hier neu aufgesetzt werden.

    [edit]
    Für den Mega328p sieht das konkret so aus:

    Code:
    '===Read MPU-6050===============================================================
    Sub Read_mpu
    
    '==All registers are read in one burst read operation, so FIFO has to be enabled
    ' wir müssten auf den FIFO-Interrupt warten und dann burst-lesen, aber der INT ist nicht verdrahtet :-(
    ' also kein burst mode zum Lesen
    '==Read only 2 really used ACC-Axis from MPU-6050==
    
      I2cstart                                                  'start condition
      I2cwbyte Mpuaddw                                          'write adress of MPU-6050
      I2cwbyte 59                                               'Register 59 ACCEL_XOUT_H
      I2cstart                                                  'repeated start
      I2cwbyte Mpuaddr                                          'read adress of MPU-6050
      I2crbyte Meas_accy(2) , Ack                               'read byte ACCEL_XOUT_H (Reg 59)
      I2crbyte Meas_accy(1) , Ack                               'read byte ACCEL_XOUT_L (Reg 60)
    
      I2crbyte Meas_accx(2) , Ack                               'read byte ACCEL_YOUT_H (Reg 61)
      I2crbyte Meas_accx(1) , Nack                              'read byte ACCEL_YOUT_L (Reg 62)
      I2cstop                                                   'stop condition
    
    '==Read all 3 Gyro-Axis from MPU-6050==
      I2cstart                                                  'start condition
      I2cwbyte Mpuaddw                                          'write adress of MPU-6050
      I2cwbyte 67                                               'Register 67 GYRO_XOUT_H
      I2cstart                                                  'repeated start
      I2cwbyte Mpuaddr                                          'read adress of MPU-6050
      I2crbyte Meas_gyrox(2) , Ack                              'read byte GYRO_XOUT_H (Reg 67)
      I2crbyte Meas_gyrox(1) , Ack                              'read byte GYRO_XOUT_L (Reg 68)
    
      I2crbyte Meas_gyroy(2) , Ack                              'read byte GYRO_YOUT_H (Reg 69)
      I2crbyte Meas_gyroy(1) , Ack                              'read byte GYRO_YOUT_L (Reg 70)
    
      I2crbyte Meas_gyroz(2) , Ack                              'read byte GYRO_ZOUT_H (Reg 71)
      I2crbyte Meas_gyroz(1) , Nack                             'read byte GYRO_ZOUT_L (Reg 72)
      I2cstop                                                   'stop condition
    
      Get_gyrox = Get_gyrox / 64                                ' auf 10 bit schrumpfen
      Get_gyroy = Get_gyroy / 64                                ' auf 10 bit schrumpfen
      Get_gyroz = Get_gyroz / 64                                ' auf 10 bit schrumpfen
      Get_gyroy = Get_gyroy + 434                               ' (512 - 68) die gelesenen Werte in die Nähe von 512 skalieren
      Get_gyrox = Get_gyrox + 589                               ' (512 + 77) damit Willas Algorithmen stimmen
      Get_gyroz = Get_gyroz + 464                               ' (512 - 48)
    
      Get_accx = Get_accx / 64                                  ' auf 10 bit schrumpfen
      Get_accy = Get_accy / 64                                  ' auf 10 bit schrumpfen
      Get_accx = Get_accx + 500                                 ' (512 +- xx) die gelesenen Werte in die Nähe von 512 skalieren
      Get_accy = Get_accy + 500                                 ' (512 +- xx) damit Willas Algorithmen stimmen
    
    End Sub
    Die "Skalierung" am Ende der Routine muss eventuell nicht sein, wenn die Algorithmen entsprechend angepasst werden.
    Geändert von deHarry (30.03.2012 um 18:51 Uhr)
    Gruß
    Harald
    __________________
    Modellbau&Elektronik
    www.harald-sattler.de

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.12.2011
    Ort
    Muggensturm
    Beiträge
    116
    Ich habe jetzt auch meine Platine, es hat solange gedauert, weil ich dem Chris eine Adresse übermittelt habe, wo die Postleitzahl einen Zahlendreher hatte und die Post so lange gebraucht hat bis sie es gemerkt hat.
    Ich habe sie auch schon bestückt und wie Willa hatte ich Probleme beim Sensor. Es gab einen Kurzschluß in der Betriebsspannung durch den Metallboden des MPUs.
    Jetzt möchte ich gerne etwas ausprobieren. Ihr habt ja wohl Software die funktioniert, wie komme ich da drann?

    gibt es vielleicht ein Programm das die Leuchtdioden der Reihe nach aufleuchten lässt?
    Ich habe auch die Vorwiderstände der LED 1 und 3 auf 390 Ohm verkleinert, damit sie heller leuchten.

    Gruß Bernd

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    45
    Beiträge
    1.273
    hi, ich hab mal ein blink programm angehängt.

    Ich habe nochmal etwas gelötet... Jetzt bekomme ich "104" als antwort in der variablen "Test". Aber alle anderen Variablen sind nun "0". Immerhin schon mal was anderes. Irgendwie antwortet die MPU, aber nicht ganz korrekt...
    Angehängte Dateien Angehängte Dateien
    Viele Grüße, William
    -> http://william.thielicke.org/

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von Picojetflyer
    Registriert seit
    03.08.2004
    Ort
    Sauerland
    Beiträge
    247
    Code:
     
    I2cstart #2                                              'start condition
       I2cwbyte Mpuaddw , #2                                    'write adress of MPU-6050
       I2cwbyte 117 , #2                                        'Register 117 "Who am I"
       I2crepstart #2                                           'repeated start
       I2cwbyte Mpuaddr , #2                                    'read adress of MPU-6050
       I2crbyte Test , Nack , #2                                'read byte WHO_AM_I (Reg 117)
       I2cstop #2                                               'stop condition
    
        Print #1 , Test
    Wenn die I2C Komunikation nicht stimmt (MPU antwortet nicht) kann es passieren das man trotzdem diese 104 zurückbekommt. Ist mir bei meinen Copter schon früher mal aufgefallen. Man schreibt ja die 104 ins I2C Register, wenn die Komunikation nicht OK ist ändert sich darin auch nix und man bekommt die 104 auch wieder zurück.

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    45
    Beiträge
    1.273
    Man schreibt ja die 104 ins I2C Register, wenn die Komunikation nicht OK ist ändert sich darin auch nix und man bekommt die 104 auch wieder zurück.
    Hmmm, wenn ich die Kabel von I²C entferne bekomme ich als Antwort in Test "114", mit angeschlossenen Kabeln "104". Also irgendwas passiert da... Es könnte aber sein, dass die Kondensatoren (2.2nF und 10nF) etwas gelitten haben beim mehrfachen ein/auslöten. Ich werde die mal austauschen.
    Viele Grüße, William
    -> http://william.thielicke.org/

  7. #7
    Erfahrener Benutzer Roboter-Spezialist Avatar von deHarry
    Registriert seit
    17.08.2010
    Beiträge
    597
    Ihr habt den MPU bei der Initialisierung aus dem Sleepmode geholt, ja?
    Nach Power On steht die Kiste erst einmal und muss davon überzeugt werden, Werte auszugeben.

    Das Powermanagement-Register 107 muss dafür passend gesetzt werden. (Ich meine das aber schon bei eurem Code irgendwo gelesen zu haben)

    Code:
      I2cwbyte 107                                              'Register 107 Power Management 1
      I2cwbyte &B00001011                                       'No Reset / No Sleep / No Cycle / Temp_Sens: Dis / Clock Source: Z-Gyro
    Gruß
    Harald
    __________________
    Modellbau&Elektronik
    www.harald-sattler.de

Stichworte

Berechtigungen

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

LiFePO4 Speicher Test