Forum: Mikrocontroller und Digitale Elektronik MPU 6000 Sensor auslesen


von Tisdo (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

habe mir einen MPU6000 zugelegt und habe Probleme diesen auszulesen. 
Zunächst mal meinen abgespeckten Code und den Schaltplan im Anhang:
1
#define RF_PORT    PORTB
2
#define RF_DDR    DDRB
3
#define RF_PIN    PINB
4
5
#define SDI    3
6
#define SCK    5
7
#define CS6    1
8
#define SDO    4
9
10
#define GYRO_XOUT 0x43434444 //Hier bin ich mir unsicher
11
12
#ifndef cbi
13
#define cbi(sfr, bit)     (_SFR_BYTE(sfr) &= ~_BV(bit)) 
14
#endif
15
#ifndef sbi
16
#define sbi(sfr, bit)     (_SFR_BYTE(sfr) |= _BV(bit))  
17
#endif
18
19
typedef union conver_ {
20
  unsigned long dw;
21
  unsigned int w[2];
22
  unsigned char b[4];
23
} CONVERTDW;
24
25
typedef union conver2_ {
26
  unsigned int w;
27
  unsigned char b[2];
28
} CONVERTW;
29
30
void mpu6000_init()
31
{
32
  RF_DDR |= (1<<SDI)|(1<<SCK)|(1<<CS6);
33
  RF_PORT |= (1<<CS6);
34
  SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);
35
}
36
37
signed short mpu6000_getdata(unsigned long wert)
38
{
39
  CONVERTDW val;
40
  val.dw = wert;
41
42
        //????
43
  val.b[3] &= (1<<7);  //lesen
44
  val.b[2] &= (1<<7);  //lesen
45
  val.b[1] &= (1<<7);     //lesen
46
  val.b[0] &= (1<<7);  //lesen
47
  
48
  cbi(RF_PORT, CS6);
49
  
50
  SPDR = val.b[3];
51
  while(!(SPSR & (1<<SPIF)));
52
  val.b[3] = SPDR;
53
  
54
  SPDR = val.b[2];
55
  while(!(SPSR & (1<<SPIF)));
56
  val.b[2] = SPDR;
57
  
58
  SPDR = val.b[1];
59
  while(!(SPSR & (1<<SPIF)));
60
  val.b[1] = SPDR;
61
  
62
  SPDR = val.b[0];
63
  while(!(SPSR & (1<<SPIF)));
64
  val.b[0] = SPDR;
65
  
66
  sbi(RF_PORT, CS6);
67
  
68
  CONVERTW val2;
69
  val2.b[1] = val.b[2];
70
  val2.b[0] = val.b[0];
71
  return (int16_t) val2.w;
72
}
73
74
int main(void)
75
{
76
    char data[6];
77
    while(1)
78
    {
79
        mpu6000_init();
80
        itoa((int16_t)mpu6000_getdata2((int32_t)GYRO_XOUT), data, 10);
81
        //senden der daten
82
        .....
83
    }
84
}

An dem SPI hängt nicht nur der MPU sonder auch ein RFM12 zum übertragen 
der Daten. Jedenfalls sind die Daten sehr unterschiedlich, obwohl der 
Sensor überhaupt nicht bewegt wird. Die Daten sehen so aus:

0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 
-16384 06384 06384 06384 06384 06384 06384 -32768 02768 02768 02768 
02768 02768 02768 02768 02768 02768 02768 02768 16384 0384 0384 0384 
0384 0384 0384 0384 0384 0384 0384 0384 0384 0384 0384 0384 0384 0384 
24320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 
0320 0320 0320 0320 -16384 06384 06384 06384 06384 06384 16128 0128 0128 
0128 0128 0128 0128 0128 0128 0128 0128 0128 -16384 06384 06384 06384 
06384 06384 06384 06384 06384 06384 06384 06384 06384 06384 06384 06384 
06384 06384 06384 24320 0320 0320 0320 0320 0320 0320 0320 0320 0320 
0320 0320 0320 0320 0320 0320 0320 0320 -16384 06384 06384 06384 06384 
06384 06384 -16640 06640 06640 06640 06640 06640 06640 06640 06640 06640 
06640 32512 0512 0512 0512 0512 0512 0512 0512 0512 0512 0512 0512 0512 
0512 0512 0512 0512 0512 0512 32512 0512 0512 0512 0512 0512 0512 0512 
0512 0512 0512 0512 0512 0512 0512 0512 0512 0512 -256 256 06 06 06 06 
06 16128 0128 0128 0128 0128 0128 0128 0128 0128 0128 0128 -256 056 056 
056 056 056 056 056 056 056 16128 0128 0128 0128 0128 0128 0128 0128 
-16384 06384 06384 06384 06384 06384 -24576 04576 04576 04576 04576 
04576 04576 04576 04576 04576 04576 04576 04576 24320 0320 0320 0320 
0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 
24320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 0320 
0320 0320 0320 0320 -8448 0448
0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 
0448 0448-8448 0448 7936 036 036 036 036 036 036 036 036 036 036 036 036 
036 036 036 036-256 056 056 056 056 056 056 056 056 056 056 056 056 056 
056 056 056 056 -256 056 056 056 056 056 056 -24576 04576 04576 04576 
04576 04576 04576 04576 04576 04576 04576 -8448 0448 0448 0448 0448 0448 
0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 0448 usw.

Merkwürdig ist, dass sich die Daten wiederholen. Es sieht für mich nicht 
nach Rauschen o.ä. aus.

Bin mir nicht sicher ob das alles so stimmt wie ich es hier gelöst habe. 
Jemand ne Idee woran es liegen könnte. Vllt hat auch schon jemand von 
euch Code für den MPU6000 mit SPI geschrieben den er schicken könnte.

Gruß

von Joe F. (easylife)


Lesenswert?

wie sieht denn get_data2 aus?

1.: data[] ist zu klein (f. werte < -9999)

: Bearbeitet durch User
von Tisdo (Gast)


Lesenswert?

get_data2 ist get_data. Habe das zwischendurch geändert, ging wohl 
unter...

data ist jetzt auch größer.

von Joe F. (easylife)


Lesenswert?


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.