Forum: Mikrocontroller und Digitale Elektronik MPU6050 keine Messdaten


von fuenfe (Gast)


Lesenswert?

Hi,

ich möchte Bewegungsdaten mit dem MPU6050 ermitteln.
I2C läuft. Ich kann Register beschreiben und auch wieder auslesen. 
Leider bleiben die Register für die Messdaten noch leer.

In vielen Projekten die im Netz stehen werden folgende Register genutzt.

#define MPU_RA_BANK_SEL         0x6D
#define MPU_RA_MEM_START_ADDR   0x6E
#define MPU_RA_MEM_R_W          0x6F
#define MPU_RA_DMP_CFG_1        0x70
#define MPU_RA_DMP_CFG_2        0x71

Leider werden diese Register im Datenblatt nicht erklärt.

Ich habe: "MPU-6000 and MPU-6050 Register Map and Description Rev 
4.0.pdf"

Hat jemand noch ein altes Datenblatt oder kann Auskunft über diese 
Register geben??

: Verschoben durch Moderator
von Timmo H. (masterfx)


Lesenswert?

Du musst schon etwas mehr machen.
Steht aber alles in den Datenblättern beschrieben: 
http://www.invensense.com/mems/gyro/documents/PS-MPU-6000A.pdf (Product 
Specification)
http://www.invensense.com/mems/gyro/documents/RM-MPU-6000A.pdf (Register 
Map and Descriptions)

Alternativ auch mal die Init-Routinen und Abfragen aus dem 
MultiWiiCopter Projekt anschauen: 
https://code.google.com/p/multiwii/source/browse/trunk/MultiWii/Sensors.ino

von fuenfe (Gast)


Lesenswert?

Eine Init Routine für den MPU6050 habe ich natürlich. Die Datenblätter 
habe ich auch. Leider werden in den Datenblättern scheinbar nicht alle 
Register erwähnt.

MPU6050 Init von Noah Zerkin und eine andere beschreiben die oben 
erwähnen Register.

Ich möchte nur Wissen ob jemand eine Doku zu diesen Registern hat oder 
mir sagen kann was diese Register bewirken?????

Oder gibt es sogar eine alte und eine neue Schaltkreis-Version mit 
unterschiedlichen Registern?????
1
void Setup_MPU6050()
2
{
3
unsigned char error;
4
//Sets sample rate to 1000/1+1 = 500Hz
5
error = ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_SMPLRT_DIV, 0x01);
6
if(error ==1) {
7
    lcd_line_four();
8
    lcd_write_string(PSTR("ByteWrite Fail"));
9
    }
10
else if (error == 0) {
11
    lcd_line_four();
12
    lcd_write_string(PSTR("ByteWrite Pass"));
13
    }
14
lcd_line_four();
15
lcd_write_string(PSTR("ByteWrite"));
16
//Disable FSync, 48Hz DLPF
17
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_CONFIG, 0x03);
18
//Disable gyro self tests, scale of 500 degrees/s
19
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_GYRO_CONFIG, 0b00001000);
20
//Disable accel self tests, scale of +-4g, no DHPF
21
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_ACCEL_CONFIG, 0b00001000);
22
//Freefall threshold of <|0mg|
23
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_FF_THR, 0x00);
24
//Freefall duration limit of 0
25
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_FF_DUR, 0x00);
26
//Motion threshold of >0mg
27
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_MOT_THR, 0x00);
28
//Motion duration of >0s
29
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_MOT_DUR, 0x00);
30
//Zero motion threshold
31
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_ZRMOT_THR, 0x00);
32
//Zero motion duration threshold
33
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_ZRMOT_DUR, 0x00);
34
//Disable sensor output to FIFO buffer
35
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_FIFO_EN, 0x00);
36
 
37
//AUX I2C setup
38
//Sets AUX I2C to single master control, plus other config
39
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_MST_CTRL, 0x00);
40
//Setup AUX I2C slaves
41
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV0_ADDR, 0x00);
42
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV0_REG, 0x00);
43
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV0_CTRL, 0x00);
44
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV1_ADDR, 0x00);
45
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV1_REG, 0x00);
46
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV1_CTRL, 0x00);
47
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV2_ADDR, 0x00);
48
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV2_REG, 0x00);
49
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV2_CTRL, 0x00);
50
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV3_ADDR, 0x00);
51
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV3_REG, 0x00);
52
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV3_CTRL, 0x00);
53
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV4_ADDR, 0x00);
54
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV4_REG, 0x00);
55
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV4_DO, 0x00);
56
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV4_CTRL, 0x00);
57
  ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV4_DI, 0x00);
58
 
59
  //MPU6050_RA_I2C_MST_STATUS //Read-only
60
  //Setup INT pin and AUX I2C pass through
61
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_INT_PIN_CFG, 0x00);
62
//Enable data ready interrupt
63
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_INT_ENABLE, 0x00);
64
 
65
//MPU6050_RA_DMP_INT_STATUS //Read-only
66
//MPU6050_RA_INT_STATUS 3A //Read-only
67
    //MPU6050_RA_ACCEL_XOUT_H //Read-only
68
    //MPU6050_RA_ACCEL_XOUT_L //Read-only
69
    //MPU6050_RA_ACCEL_YOUT_H //Read-only
70
    //MPU6050_RA_ACCEL_YOUT_L //Read-only
71
    //MPU6050_RA_ACCEL_ZOUT_H //Read-only
72
    //MPU6050_RA_ACCEL_ZOUT_L //Read-only
73
    //MPU6050_RA_TEMP_OUT_H //Read-only
74
    //MPU6050_RA_TEMP_OUT_L //Read-only
75
    //MPU6050_RA_GYRO_XOUT_H //Read-only
76
    //MPU6050_RA_GYRO_XOUT_L //Read-only
77
    //MPU6050_RA_GYRO_YOUT_H //Read-only
78
    //MPU6050_RA_GYRO_YOUT_L //Read-only
79
    //MPU6050_RA_GYRO_ZOUT_H //Read-only
80
    //MPU6050_RA_GYRO_ZOUT_L //Read-only
81
    //MPU6050_RA_EXT_SENS_DATA_00 //Read-only
82
    //MPU6050_RA_EXT_SENS_DATA_01 //Read-only
83
    //MPU6050_RA_EXT_SENS_DATA_02 //Read-only
84
    //MPU6050_RA_EXT_SENS_DATA_03 //Read-only
85
    //MPU6050_RA_EXT_SENS_DATA_04 //Read-only
86
    //MPU6050_RA_EXT_SENS_DATA_05 //Read-only
87
    //MPU6050_RA_EXT_SENS_DATA_06 //Read-only
88
    //MPU6050_RA_EXT_SENS_DATA_07 //Read-only
89
    //MPU6050_RA_EXT_SENS_DATA_08 //Read-only
90
    //MPU6050_RA_EXT_SENS_DATA_09 //Read-only
91
    //MPU6050_RA_EXT_SENS_DATA_10 //Read-only
92
    //MPU6050_RA_EXT_SENS_DATA_11 //Read-only
93
    //MPU6050_RA_EXT_SENS_DATA_12 //Read-only
94
    //MPU6050_RA_EXT_SENS_DATA_13 //Read-only
95
    //MPU6050_RA_EXT_SENS_DATA_14 //Read-only
96
    //MPU6050_RA_EXT_SENS_DATA_15 //Read-only
97
    //MPU6050_RA_EXT_SENS_DATA_16 //Read-only
98
    //MPU6050_RA_EXT_SENS_DATA_17 //Read-only
99
    //MPU6050_RA_EXT_SENS_DATA_18 //Read-only
100
    //MPU6050_RA_EXT_SENS_DATA_19 //Read-only
101
    //MPU6050_RA_EXT_SENS_DATA_20 //Read-only
102
    //MPU6050_RA_EXT_SENS_DATA_21 //Read-only
103
    //MPU6050_RA_EXT_SENS_DATA_22 //Read-only
104
    //MPU6050_RA_EXT_SENS_DATA_23 //Read-only
105
    //MPU6050_RA_MOT_DETECT_STATUS //Read-only
106
 
107
//Slave out, dont care
108
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV0_DO, 0x00);
109
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV1_DO, 0x00);
110
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV2_DO, 0x00);
111
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_SLV3_DO, 0x00);
112
//More slave config
113
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_I2C_MST_DELAY_CTRL, 0x00);
114
//Reset sensor signal paths
115
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_SIGNAL_PATH_RESET, 0x00);
116
//Motion detection control
117
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_MOT_DETECT_CTRL, 0x00);
118
//Disables FIFO, AUX I2C, FIFO and I2C reset bits to 0
119
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_USER_CTRL, 0x00);
120
//Sets clock source to gyro reference w/ PLL
121
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0b00000010);
122
//Controls frequency of wakeups in accel low power mode plus the sensor standby modes
123
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_2, 0x00);
124
    //MPU6050_RA_BANK_SEL //Not in datasheet
125
    //MPU6050_RA_MEM_START_ADDR //Not in datasheet
126
    //MPU6050_RA_MEM_R_W //Not in datasheet
127
    //MPU6050_RA_DMP_CFG_1 //Not in datasheet
128
    //MPU6050_RA_DMP_CFG_2 //Not in datasheet
129
    //MPU6050_RA_FIFO_COUNTH //Read-only
130
    //MPU6050_RA_FIFO_COUNTL //Read-only
131
//Data transfer to and from the FIFO buffer
132
ByteWriteI2C(MPU6050_ADDRESS, MPU6050_RA_FIFO_R_W, 0x00);
133
    //MPU6050_RA_WHO_AM_I //Read-only, I2C address
134
 
135
lcd_home();
136
lcd_write_string(PSTR("MPU6050 Setup Done"));
137
 
138
//printf("\nMPU6050 Setup Complete");
139
}


1
regWrite(0x6B, 0xC0);
2
  regWrite(0x6C, 0x00);
3
  delay(10);
4
  
5
// regWrite(0x6B, 0x70);
6
  regWrite(0x6B, 0x00);
7
  regWrite(0x6D, 0x70);
8
  regWrite(0x6E, 0x06);
9
  temp = regRead(0x6F);
10
  Serial.print("Bank 1, Reg 6 = ");
11
  Serial.println(temp, HEX);
12
13
// temp = regRead(0x6B);
14
// Serial.println(temp, HEX);
15
  
16
  regWrite(0x6D, 0x00);
17
  
18
  temp = regRead(0x00);
19
  Serial.println(temp, HEX);
20
  temp = regRead(0x01);
21
  Serial.println(temp, HEX);
22
  temp = regRead(0x02);
23
  Serial.println(temp, HEX);
24
  temp = regRead(0x6A);
25
  Serial.println(temp, HEX);
26
  
27
  regWrite(0x37, 0x32);
28
  
29
  temp = regRead(0x6B);

von Timmo H. (masterfx)


Lesenswert?

Ach ich glaube das ist für den eingebauten DSP. Invensense rückt ja 
nicht raus wie man das manuell einspielen kann. Und diese 
(undukumentierten) Register werden dann befingert um den Fusion 
Algorithmus Dump da wieder einzuspielen (nachdem welche mitgeplottet 
haben was die Motion App da macht)
Da gibts dann 8 Banks in die dann 128 oder 256 Bytes eingespielt werden, 
welche dann diese UC3-A3 Firmware dort einspielen.

Bisher musste ich die Register nie befingern um die Rohdaten des Sensors 
auszulesen.

von fuenfe (Gast)


Lesenswert?

OK, danke für die Info. Da kann es also nicht an diesen Registen liegen.

ein paar Register sind hier beschrieben: 
http://www.i2cdevlib.com/devices/mpu6050#registers

Weiter bin ich trotzdem noch nicht alle Daten Register bleiben leer.

Gibt es noch bestimmte dinge die man beachten sollte beim MPU6050?????

hier meine INIT
1
void mpu6050Init(void)
2
{  
3
  // MPU6050 Reset
4
  i2c_writeReg(MPU6050_ADDRESS, MPU_RA_PWR_MGMT_1, 0x80);
5
  _delay_us(40);
6
  
7
  // MPU6050 no Sleep
8
  i2c_writeReg(MPU6050_ADDRESS, MPU_RA_PWR_MGMT_1, 0x00);
9
  
10
  //Disable gyro self tests, scale of 250 degrees/s
11
  i2c_writeReg(MPU6050_ADDRESS, MPU_RA_GYRO_CONFIG, 0x00);
12
  
13
  //Disable accel self tests, scale of +-2g, no DHPF
14
  i2c_writeReg(MPU6050_ADDRESS, MPU_RA_ACCEL_CONFIG, 0x00);
15
  
16
  // all Reset
17
  //i2c_writeReg(MPU6050_ADDRESS, MPU_RA_SIGNAL_PATH_RESET, 0x07);
18
  
19
  //Disable FSync, 20Hz DLPF (1kHz)
20
  i2c_writeReg(MPU6050_ADDRESS, MPU_RA_CONFIG, 0x04);
21
  
22
  //Sets sample rate to 1000/255+1 = 3.9Hz
23
  i2c_writeReg(MPU6050_ADDRESS, MPU_RA_SMPLRT_DIV, 0xFF);
24
    
25
  // Data Ready Interrupt Enable
26
  i2c_writeReg(MPU6050_ADDRESS, MPU_RA_INT_ENABLE, 0x01);
27
  
28
  //Disable sensor output to FIFO buffer
29
  i2c_writeReg(MPU6050_ADDRESS, MPU_RA_FIFO_EN, 0x88);
30
  
31
  //I2C Master enable and FIFO enable
32
  i2c_writeReg(MPU6050_ADDRESS, MPU_RA_USER_CTRL, 0x60);
33
  
34
  // Setup INT-Pin
35
  i2c_writeReg(MPU6050_ADDRESS, MPU_RA_INT_PIN_CFG, 0x00);
36
    
37
  //Motion threshold of >0mg
38
  //i2c_writeReg(MPU6050_ADDRESS, MPU_RA_MOT_THR, 0x00);
39
  
40
  // Adresse auslesen test Routine
41
  //uart_putc(i2c_readReg(MPU6050_ADDRESS,MPU_RA_WHO_AM_I));
42
  
43
  //uart_puts("\nmpu init\n");
44
}

von Timmo H. (masterfx)


Lesenswert?

Verwende mal CLKSEL =0x03.

Wie liest du deine Register von Gyro und Acc aus?

von fuenfe (Gast)


Angehängte Dateien:

Lesenswert?

CLKSEL = 3 bringt nix

eine Auslese Routine habe ich noch nicht geschrieben, weil ich noch 
keine Daten auslesen konnte.

Ich wollte eigentlich den INT-Pin nehmen einen Interupt generieren und 
die entsprechenden Register auslesen.

Interrupt kommt nicht

Im Moment lese ich einfach folgende Register aus
leider bleiben alle leer.
1
MPU_RA_INT_STATUS       0x3A
2
MPU_RA_ACCEL_XOUT_H     0x3B
3
MPU_RA_ACCEL_XOUT_L     0x3C
4
MPU_RA_ACCEL_YOUT_H     0x3D
5
MPU_RA_ACCEL_YOUT_L     0x3E
6
MPU_RA_ACCEL_ZOUT_H     0x3F
7
MPU_RA_ACCEL_ZOUT_L     0x40
8
MPU_RA_TEMP_OUT_H       0x41
9
MPU_RA_TEMP_OUT_L       0x42
10
MPU_RA_GYRO_XOUT_H      0x43
11
MPU_RA_GYRO_XOUT_L      0x44
12
MPU_RA_GYRO_YOUT_H      0x45
13
MPU_RA_GYRO_YOUT_L      0x46
14
MPU_RA_GYRO_ZOUT_H      0x47
15
MPU_RA_GYRO_ZOUT_L      0x48
16
17
MPU_RA_FIFO_COUNTH      0x72
18
MPU_RA_FIFO_COUNTL      0x73
19
MPU_RA_FIFO_R_W         0x74

Das Auslesen an sich funzt. Ich kann alle zuvor beschriebenen Werte 
wieder zurück lesen.

Mit dem I2C stimmt auf dem Oszi auch alles. (siehe Anhang)

von Timmo H. (masterfx)


Lesenswert?

Mach mal die FIFOs aus. Und warte nach dem Reset mal länger bzw. plle 
darauf bis er ausgeführt wurde (ich warte 5ms).

von fuenfe (Gast)


Lesenswert?

Verdammt das war es
1
// MPU6050 Reset
2
i2c_writeReg(MPU6050_ADDRESS, MPU_RA_PWR_MGMT_1, 0x80);
3
_delay_ms(5);
und die Register bleiben nicht mehr leer. Timmo 1000 Dank.

Nutz du den FIFO oder liest du die Daten direkt von den entsprechenden 
Registern aus??

von Timmo H. (masterfx)


Lesenswert?

Keine Ursache.

Ich nutze den Fifo nicht. Ich lese die Register alle 10ms "manuell" aus, 
so habe ich eine feste Zeitbasis für die Lageberechnung (also unter 
anderem die Integration der Winkelgeschwindigkeit) im µC.

von Thomas H. (t0m_h)


Lesenswert?

fuenfe schrieb:
> Verdammt das war es
>
1
> // MPU6050 Reset
2
> i2c_writeReg(MPU6050_ADDRESS, MPU_RA_PWR_MGMT_1, 0x80);
3
> _delay_ms(5);
4
>
> und die Register bleiben nicht mehr leer. Timmo 1000 Dank.
>
> Nutz du den FIFO oder liest du die Daten direkt von den entsprechenden
> Registern aus??

Hallo, ich spiel gerade mit dem selben Chip rum. Bekommst Du vernünftige 
Daten? Bei mir kommen zwar Gyro- und ACC-Daten, aber ich kann damit gar 
nichts anfangen.

Ich hab bei ruhendem Chip mal den Mittelwert über 256 
Beschleunigungsmessungen gebildet und das als Referenz für die aktuelle 
Lage genommen. Wenn man von den aktuellen Beschleunigungswerten immer 
die Referenz abzieht, sollte eigentlich immer ziemlich null 
herauskommen, solange man den Chip nicht bewegt.

Das tut es nun überhaupt nicht.

von Timmo H. (masterfx)


Lesenswert?

Rauschen hast du immer drin, auch wenn du immer einen Mittelwert von den 
vorherigen Messungen abziehst. Je nach Messbereich und Einstellungen 
(Hochpass/Tiefpass-Filter etc) schwanken die Abweichungen.
Aber wenn du die Werte mal in m/s² oder Grad/s umrechnest wirst du sehen 
dass das Rauschen auf der ebene gar nicht mehr so schlimm ist.

Aber wenns gut eingestellt ist rauschen bei mir die Rohdaten des 
Beschleunigungssensors etwa um +-3 (im 4G Bereich). Der Gyro ist hier 
aber schlimmer, aber das wirkt sich eigentlich nur auf den Drift aus, 
welchen man ja mit dem Beschleunigungssensor ja wieder kompensiert. Den 
Drift um die Z-Achse kompensiere ich mit einem Mag3110 (der Drift ist 
auch noch da wenn man ihn vorher mit einer Mittelwertsbildung bestimmt 
hat und abzieht)

von Thomas H. (t0m_h)


Lesenswert?

Timmo H. schrieb:
> Rauschen hast du immer drin, auch wenn du immer einen Mittelwert von den
> vorherigen Messungen abziehst. Je nach Messbereich und Einstellungen
> (Flter etc) schwanken die Abweichungen.
> Aber wenn du die Werte mal in m/s² oder Grad/s umrechnest wirst du sehen
> dass das Rauschen auf der ebene gar nicht mehr so schlimm ist.
>
> Aber wenns gut eingestellt ist rauschen bei mir die Rohdaten des
> Beschleunigungssensors etwa um +-3 (im 4G Bereich). Der Gyro ist hier
> aber schlimmer, aber das wirkt sich eigentlich nur auf den Drift aus,
> welchen man ja mit dem Beschleunigungssensor ja wieder kompensiert. Den
> Drift um die Z-Achse kompensiere ich mit einem Mag3110

Dann ists bei mir schlecht eingestellt. Hättest Du vielleicht mal eine 
Registerbelegung für den Anfang? Ich hab die von hier:

http://www.roboternetz.de/community/threads/61632-MPU6050-mit-Atmega32

genommen. Wenn ich den Chip nicht bewege hab ich bei x,y,z jeweils 
Abweichungen von ein paar hundert vom Mittelwert. Außerdem kommen nur ca 
3 Messungen pro Sekunde.

von Timmo H. (masterfx)


Lesenswert?

Versuch mal die vom MultiWii 
(https://code.google.com/p/multiwii/source/browse/trunk/MultiWii/Sensors.ino):
1
void Gyro_init() {
2
  TWBR = ((F_CPU / 400000L) - 16) / 2; // change the I2C clock rate to 400kHz
3
  i2c_writeReg(MPU6050_ADDRESS, 0x6B, 0x80);             //PWR_MGMT_1    -- DEVICE_RESET 1
4
  delay(5);
5
  i2c_writeReg(MPU6050_ADDRESS, 0x6B, 0x03);             //PWR_MGMT_1    -- SLEEP 0; CYCLE 0; TEMP_DIS 0; CLKSEL 3 (PLL with Z Gyro reference)
6
  i2c_writeReg(MPU6050_ADDRESS, 0x1A, MPU6050_DLPF_CFG); //CONFIG        -- EXT_SYNC_SET 0 (disable input pin for data sync) ; default DLPF_CFG = 0 => ACC bandwidth = 260Hz  GYRO bandwidth = 256Hz)
7
  i2c_writeReg(MPU6050_ADDRESS, 0x1B, 0x18);             //GYRO_CONFIG   -- FS_SEL = 3: Full scale set to 2000 deg/sec
8
  // enable I2C bypass for AUX I2C
9
 
10
}
11
12
void ACC_init () {
13
  i2c_writeReg(MPU6050_ADDRESS, 0x1C, 0x10);             //ACCEL_CONFIG  -- AFS_SEL=2 (Full Scale = +/-8G)  ; ACCELL_HPF=0   //note something is wrong in the spec.
14
  //note: something seems to be wrong in the spec here. With AFS=2 1G = 4096 but according to my measurement: 1G=2048 (and 2048/8 = 256)
15
  //confirmed here: http://www.multiwii.com/forum/viewtopic.php?f=8&t=1080&start=10#p7480
16
}

Meine müsste ich nochmal raussuchen, aber ich glaube die waren recht 
ähnlich

von Thomas H. (t0m_h)


Lesenswert?

Timmo H. schrieb:
> Versuch mal die vom MultiWii
> (https://code.google.com/p/multiwii/source/browse/trunk/MultiWii/Sensors.ino):
>
1
> void Gyro_init() {
2
>   TWBR = ((F_CPU / 400000L) - 16) / 2; // change the I2C clock rate to 
3
> 400kHz
4
>   i2c_writeReg(MPU6050_ADDRESS, 0x6B, 0x80);             //PWR_MGMT_1 
5
> -- DEVICE_RESET 1
6
>   delay(5);
7
>   i2c_writeReg(MPU6050_ADDRESS, 0x6B, 0x03);             //PWR_MGMT_1 
8
> -- SLEEP 0; CYCLE 0; TEMP_DIS 0; CLKSEL 3 (PLL with Z Gyro reference)
9
>   i2c_writeReg(MPU6050_ADDRESS, 0x1A, MPU6050_DLPF_CFG); //CONFIG 
10
> -- EXT_SYNC_SET 0 (disable input pin for data sync) ; default DLPF_CFG = 
11
> 0 => ACC bandwidth = 260Hz  GYRO bandwidth = 256Hz)
12
>   i2c_writeReg(MPU6050_ADDRESS, 0x1B, 0x18);             //GYRO_CONFIG 
13
> -- FS_SEL = 3: Full scale set to 2000 deg/sec
14
>   // enable I2C bypass for AUX I2C
15
> 
16
> }
17
> 
18
> void ACC_init () {
19
>   i2c_writeReg(MPU6050_ADDRESS, 0x1C, 0x10);             //ACCEL_CONFIG 
20
> -- AFS_SEL=2 (Full Scale = +/-8G)  ; ACCELL_HPF=0   //note something is 
21
> wrong in the spec.
22
>   //note: something seems to be wrong in the spec here. With AFS=2 1G = 
23
> 4096 but according to my measurement: 1G=2048 (and 2048/8 = 256)
24
>   //confirmed here: 
25
> http://www.multiwii.com/forum/viewtopic.php?f=8&t=1080&start=10#p7480
26
> }
27
>
>
> Meine müsste ich nochmal raussuchen, aber ich glaube die waren recht
> ähnlich

Vielen Dank fürs Helfen.

Das mit der langsamen Abtastung lag an völlig falschen Werten fürs TWI.
Beim Mittelwert hab ich das Problem, dass ich es nicht schaffe, die 256 
Messwerte vorzeichenbehaftet zu addieren. Das mit dem

add bla_low, trööt_low
adc bla_high, trööt_high

geht jedenfalls nicht.

von Timmo H. (masterfx)


Lesenswert?

Naja in der Z-Achse (natürlich je nach Drehrichtung) wo du ja immer 1G 
hast, wenn es gerade liegt, ist so ein 16-Bit wert auch schnell 
übergelaufen. Da musst du das schon etwas größer dimensionieren und 
natürlich auch entsprechend die Division dafür vorsehen.
Gut dass ich mich nicht mehr mit Assembler rumschlage :D

von Thomas H. (t0m_h)


Lesenswert?

Timmo H. schrieb:
> Naja in der Z-Achse (natürlich je nach Drehrichtung) wo du ja immer 1G
> hast, wenn es gerade liegt, ist so ein 16-Bit wert auch schnell
> übergelaufen. Da musst du das schon etwas größer dimensionieren und
> natürlich auch entsprechend die Division dafür vorsehen.
> Gut dass ich mich nicht mehr mit Assembler rumschlage :D

ja, ich nehm 24 Bit als Summe. 256 Stück 16 Bit Zahlen gehen genau in 
eine 24 Bit Zahl. Zum Schluss schau ich mir nur die oberen 16 Bit an und 
schon hab ich dividiert.

Jetzt scheints auch zu gehen. Ich hatte ja eigentlich sowas, wie die 
Teapot-Demo vor, nur dass der Chip nicht seine Ausrichtung (theta, psi, 
phi) rechnen soll, sondern seine Lage (x,y,z). Unter der Voraussetzung, 
dass man ihn nicht zusehr dreht.

Mal sehen, aber ich fürchte, ich hab einen grundlegenden Denkfehler.

von Timmo H. (masterfx)


Lesenswert?

Vielleicht als kleine Hilfe für dich/euch, was in Ordnung ist vom 
Rauschen her. Der Sensor wird mit 100 Hz ausgelesen, (jedoch nur jeder 5 
Wert auf dem Display dargestellt), DLPF_CFG = 0 (keine Filterung), Gyro 
@ 2000dps, Acc @ 8G. Ungefilterte und nicht umgerechnete Rohdaten. Nur 
der Gyro Offset von X = -50; Y= 19; Z=-3 wurde rausgerechnet:
http://bilder.pcmx.de/MPU6050.mkv

von Raph (Gast)


Lesenswert?

Hallo Zusammen

Ich habe ein ähnlcihes Problem gehabt. Im meinem Fall Arbeitet nur due 
MPU 6050 Revsion D mit meinem Programm alle neueren MPUs Revsion E 
aufwärts braucht man eine Treiber update...

von Wolfgang S. (derschutzhund)


Lesenswert?

Hallo zusammen,
experimentiere auch gerade mit diesem Sensor und bin froh, dass ich 
endlich ein Forum gefunden habe in dem es um den MPU 6050 geht und in 
dem deutsch gepostet wird!
Was möchte ich machen?
Ich will versuchen Modellbaumotoren + Propeller von meinem Kopter zu 
wuchten. Dazu messe ich mit dem Sensor die Beschleunigung in einer Achse 
und lasse mir mit einer Stroboskop-Schaltung die Position der Unwucht 
anzeigen. Dann auf der gegenüberliegenden Seite Ausgleichsmasse 
anbringen.
Als Prozessor verwende ich einen Picaxe-Prozessor und arbeite über i2c.
Bisher kann ich den Beschleunigungswert auslesen und den Blitz auslösen 
aber die Laufzeiten im Prozessor pendeln immer etwas.
Erste Frage wäre wie kann ich prüfen ob ein neuer Messwert im Sensor 
vorliegt?
Um die Laufzeitprobleme zu umgehen gibt es ja die DMP-Funktion.
Stelle mir das so vor:
- Beschleunigungswert für die Achse ins Register schreiben
- Wenn dieser Beschleunigungswert bei einer Messung überschritten wird 
dann wird ein Interrupt ausgelöst und dieser Wert in einem Register 
abgelegt das ausgelesen werden kann.
Allerdings habe ich keine Ahnung wie ich dazu den Sensor konfigurieren 
muss!
Ihr könnt mir da doch sicher einen Tip geben oder?

LG

Wolfgang

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.