Forum: Mikrocontroller und Digitale Elektronik MPU9150 high g interrupt


von Sergej (Gast)


Lesenswert?

Hi Leute,

ich beschäftige mich momentan mit dem MPU9150 Beschleunigungssensor und 
will den "high g interrupt verwenden.
Ich konfiguriere den MPU9150 mit einem Seeeduino Stalker.

Folgende Konfigurationsparameter übergebe ich an den Sensor:

1.  accelgyro.setIntEnabled(64);
2.  accelgyro.setIntMotionEnabled(true);
3.  accelgyro.setMotionDetectionThreshold(32);    //32mg/LSB laut 
Datenblatt
4.  accelgyro.setMotionDetectionDuration(5);

1 und 2 war ja verständlich, Register setzen (siehe Datenblatt), nun ist 
mir der Zusammenhang der Punkte bzw. Funktionen 3 und 4 nicht ganz klar.

Mit den obigen Einstellungen und auch einigen weiteren kann ich den 
Interrupt sehen,  jedoch ist mir nicht klar wie ich den Schwellwert so 
einstelle das es z.B. nur bei 5g ausschlägt.

Hatte jemand damit schon Erfahrung und kann mir weiter helfen, einen 
Ansatz oder Beispiel.

Vielen Dank schon mal.

Gruß
Sergej

von Sergej J. (subz3ro)


Lesenswert?

Keiner eine Idee?

von Sergej J. (subz3ro)


Lesenswert?

Sergej M. schrieb:
> Keiner eine Idee?

Immer noch keiner eine Idee?

von Cyblord -. (cyblord)


Lesenswert?

Sergej M. schrieb:
> Sergej M. schrieb:
>> Keiner eine Idee?
>
> Immer noch keiner eine Idee?

Also ich hab bei "Seeeduino Stalker" aufgehört zu lesen. Sorry.

Dein Problem ist nicht nachzuvollziehen. Threshold = Schwellwert. Den 
willst du doch einstellen. Den Zusammengang zwischen den Registerwert 
und einem realen Messwert entnimmt man dem Datenblatt.

Aber wie gesagt, Ratschläge an Arduinos sind für die Katz, daher stell 
ich das auch nun wieder ein.

von Sergej J. (subz3ro)


Lesenswert?

Hat doch nichts mit Arduino zutun, das ist nur der Mikrocontroller, das 
Hauptproblem ist der Beschleunigungssensor, womit konfiguriert wird ist 
nebensächlich.

Nochmal für nicht technisch versierte :-)

Der BeSensor kann konfiguriert werden das er bei bestimmten Kräften 
einen Interruptsignal generiert. Diese beiden Funktionen haben einen 
Einfluss darauf. Den beiden Funktionen 3 & 4 wird ein 8Bit Wert 
übergeben, für den Schwellwert gilt also max. 255 Zahlenwerte. Aus dem 
Datenblatt ist zu entnehmen das 32mg = 1LSB sind, sprich 32×255= 8160mg.
Wie kann man also rausfinden bei welchen Schwellwert das Interruptsignal 
generiert wird?

Wenn das Interruptsignal bei 5g generiert werden soll welchen Zahlenwert 
sollte man dan in den Register reinschreiben?

Hoffe jetzt ist besser zu verstehen was ich meine

von spess53 (Gast)


Lesenswert?

Hi

>Nochmal für nicht technisch versierte :-)

>Der BeSensor kann konfiguriert werden das er bei bestimmten Kräften
>einen Interruptsignal generiert.

Sicher? Lt. Datenblatt kennt der Sensor vier Interruptquellen:

Interrupt Name                               Module

FIFO Overflow                                FIFO
Data Ready                                   Sensor Registers
I2C Master errors: Lost Arbitration, NACKs   I2C Master
I2C Slave 4                                  I2C Master

In den Sensorregistern kann ich auch nichts anderes finden.

MfG Spess

von Sergej J. (subz3ro)


Lesenswert?

spess53 schrieb:
> Sicher? Lt. Datenblatt kennt der Sensor vier Interruptquellen:

Und noch einen "Motion Detection" und diesen möchte ich auch nutzen.

Habe schon den Hersteller angeschrieben, eventuelle kommt da ja noch 
was. Solange dachte ich das jemand schonmal mit dem Sensor gearbeitet 
hat und die Konfiguration kennt.

von Cyblord -. (cyblord)


Lesenswert?

Sergej M. schrieb:
> Einfluss darauf. Den beiden Funktionen 3 & 4 wird ein 8Bit Wert
> übergeben, für den Schwellwert gilt also max. 255 Zahlenwerte. Aus dem
> Datenblatt ist zu entnehmen das 32mg = 1LSB sind, sprich 32×255= 8160mg.
> Wie kann man also rausfinden bei welchen Schwellwert das Interruptsignal
> generiert wird?
>
> Wenn das Interruptsignal bei 5g generiert werden soll welchen Zahlenwert
> sollte man dan in den Register reinschreiben?

Sagmal kannst du keinen Dreisatz. Sorry dein Problem wird immer noch 
nicht klar. Bist du wirklich zu doof 5000mg (=5g) / 32 = 156,25 zu 
rechnen und dann 156 in das blöde Register zu schreiben? Ernsthaft? Oder 
wo ist das Problem?

Die DURATION wird dann ja wohl die Zeitspanne angeben, wie lange diese 
Beschleunigung anliegen muss. Oder was auch immer, aber das steht im 
Datenblatt.

Arduinos halt. Denken is nich, lesen is nich.

von uwe (Gast)


Lesenswert?

156

von Sergej J. (subz3ro)


Lesenswert?

@Cyblord,

pass mal auf Kleiner, wenn du selber keine Ahnung hast solltest du dein 
Mund nicht so weit aufmachen und andere beleidigen, dachte das ist ein 
anständiges Forum wo Fragen beantwortet werden und nicht dummrum 
gelabert wird.

Worauf basieren den euer ach so schlauen Annahmen? Hast du schon mal ins 
Datenblatt geschaut oder kannst du nur nutzlose Posts schreiben?
Also laut euren Aussagen kann der Sensor nur auf 8g reagieren oder wie?

Aber egal wenn hier nur solche unqualifizierte Posts kommen könnt ihr 
den Post schliessen, von solchen Dummschwätzern wir ihr kann man nichts 
brauchbares erwarten.

Nebenbei hast du schona mal was von Testen gehört? Wenn nicht dann 
solltest du dir die Frage stellen wer hier noch der blöde ist.

Vielen Dank nochmal für die sehr hilfreichen Posts.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Sergej M. schrieb:
> @Cyblord,
>
> pass mal auf Kleiner, wenn du selber keine Ahnung hast solltest du dein
> Mund nicht so weit aufmachen und andere beleidigen, dachte das ist ein
> anständiges Forum wo Fragen beantwortet werden und nicht dummrum
> gelabert wird.
Nun, da ich Ahnung habe, kann deinen Rat wohl in den Wind schlagen. Und 
für dich als Arduino-Nutzerlein bin ich der µC-Gott. Alles klar?

Und wer sowas hier schreibt:
> Also laut euren Aussagen kann der Sensor nur auf 8g reagieren oder wie?

und dabei anderen vorwirft, sie hätten keine Ahnung. Meine Fresse Junge.
Mehr Vorrechnen kann man es dir nicht mehr. Soll ichs vortanzen?
8g ist der maximale Wert, da 32*255 ~ 8g. Daher nur 156 ins Register und 
nicht 255.


> Worauf basieren den euer ach so schlauen Annahmen?

Auf dieser Zeile in deinem eigenen Code du Spaten:
//32mg/LSB laut Datenblatt

> Hast du schon mal ins
> Datenblatt geschaut
Nein, meinst du ich mach deine Arbeit oder wie? Außerdem scheinst du das 
ja wohl bereits nachgeschaut zu haben.
Wenn die 32 mg/LSB doch nicht stimmen sollten, dann guck den korrekten 
Wert doch einfach nach.

Und wieder versteht einfach niemand wo dein Problem liegt. Ich tippe auf 
Ardunio-typische absolute Unfähigkeit. Oder aber du kannst dich nicht 
ausdrücken. Ich weiß es nicht.

: Bearbeitet durch User
von Sergej J. (subz3ro)


Lesenswert?

Cyblord ---- schrieb:
> Nun, da ich Ahnung habe, kann deinen Rat wohl in den Wind schlagen. Und
> für dich als Arduino-Nutzerlein bin ich der µC-Gott. Alles klar?
>

Ja das merkt man ja auch.
Und ich verstehe immer noch nicht was dich jetzt am Arduino stört. Hast 
du schon gewusst das die Arduinos einen Atmega µC haben?

> Und wer sowas hier schreibt:
>> Also laut euren Aussagen kann der Sensor nur auf 8g reagieren oder wie?
>
> und dabei anderen vorwirft, sie hätten keine Ahnung. Meine Fresse Junge.
> Mehr Vorrechnen kann man es dir nicht mehr. Soll ichs vortanzen?
> 8g ist der maximale Wert, da 32*255 ~ 8g. Daher nur 156 ins Register und
> nicht 255.
>

Ok auf maximal 8g, ist das fur deinen eingeschränkten Verstand besser zu 
verstehen?

>
>> Worauf basieren den euer ach so schlauen Annahmen?
>
> Auf dieser Zeile in deinem eigenen Code du Spaten:
> //32mg/LSB laut Datenblatt

Hast du mal gelesen was zu dem Wert geschrieben steht?

>
>> Hast du schon mal ins
>> Datenblatt geschaut
> Nein, meinst du ich mach deine Arbeit oder wie? Außerdem scheinst du das
> ja wohl bereits nachgeschaut zu haben.

Habe ich dich gebeten hier was zu schreiben wenn du von dem Sensor keine 
Ahnung hast?


> Wenn die 32 mg/LSB doch nicht stimmen sollten, dann guck den korrekten
> Wert doch einfach nach.

Und wieder mal, wenn du solche Aussagen machst vergewissere dich doch 
mal ob die stimmen.

>
> Und wieder versteht einfach niemand wo dein Problem liegt. Ich tippe auf
> Ardunio-typische absolute Unfähigkeit. Oder aber du kannst dich nicht
> ausdrücken. Ich weiß es nicht.

Dein Dreisatz funktioniert nicht, denkst du ich bohre hier nur in der 
Nase. Nicht alle Menschen sind wie du, nicht nachschauen keine Ahnung 
vom Thema haben und trotzdem andere anschnauzen und schalu daher reden.

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?


von Sergej J. (subz3ro)


Lesenswert?

Sry erstmal ohne Link aber im Datenblatt Seite 32/52 steht alles 
beschrieben. Da ist ein Ablaufplan mit allen Registern.

Das ist mir aber klar nur die Schwellwerte sind uneindeutig.

von Cyblord -. (cyblord)


Lesenswert?

Sergej M. schrieb:
> Sry erstmal ohne Link aber im Datenblatt Seite 32/52 steht alles
> beschrieben. Da ist ein Ablaufplan mit allen Registern.

Kann es sein dass du Sensoren irgendwie verwechselst? Auf Seite 32 steht 
davon rein gar nichts.

Auch die Tabelle mit den Interruptquellen ist halt schon recht 
eindeutig. Wenn da nur diese stehen und kein Motion Interrupt, dann 
wirds keinen geben.

Ich finde auch absolut keinen Register mit einem "Motion Detection 
Threshold" oder irgendwas ähnliches.


> Hast du mal gelesen was zu dem Wert geschrieben steht?
Ja, dass er so im Datenblatt steht. Also glaube ich das. Wenn nun dein 
Problem darin bestehen würde, zu verifizieren ob dieser Wert auch 
wirklich korrekt ist, warum schreibst du das dann nicht einfach?

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Sry erstmal ohne Link aber im Datenblatt Seite 32/52 steht alles
>beschrieben. Da ist ein Ablaufplan mit allen Registern.

Die Register gibt es in der Register-Map überhaupt nicht. Interessant 
ist, das das Datenblatt von 2012, die Registermap von 2013 stammt. 
Vielleicht haben sie es nicht hinbekommen und diese Funktion(en) 
gestrichen. Das würde auch diese Registermap, z.B. beginnend mit 0x0D, 
erklären.

MfG Spess

von Sergej J. (subz3ro)


Lesenswert?

Hier das Datenblatt, zu diesen Sensor gibt es zwei Dokumente einmal das 
Datenblatt und dann noch das Registermap Dokument.

hier das Datenblatt:
http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/IMU/PS-MPU-9150A.pdf

Der Interrupt kommt, hab es mit einem Osszi gemessen und auch mit 
einwenig LED spielereien :)

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Der Interrupt kommt, hab es mit einem Osszi gemessen und auch mit
>einwenig LED spielereien :)

Am gemeinsamen Interrupt-Ausgang?

MfG Spess

von Sergej J. (subz3ro)


Lesenswert?

Der Sensor hat nur einen Interruptausgang, Pin 12.

Gruß

von Sergej J. (subz3ro)


Lesenswert?

Ich kann ja mal schreiben was ich schon alles weiss.

Für den Sensor gibt es eine C++ Library, dort sind die notigen 
Funktionen mit den entsprechenden Registern zu finden.
Aus dem Datenblatt ist zu entnehmen wie der Motion Detection Int 
konfiguriert werden soll.

Habe auch einige andere Beschleunigungssensoren angeschaut die auch 
einen Motion Detection Int haben. Dort hat jedoch jede Einstellung (2g, 
4g, 8g usw.) ihre eigene Sensibilität. Hier ist es dann nur die 32mg/LSB 
für alle Einstellungen.

Hier wird es schon deutlicher wie es funktioniert, aber mit einem 
anderen Sensor und als Free Fall Int.
http://www.ecnmag.com/articles/2013/04/one-accelerometer-interrupt-pin-both-wakeup-and-non-motion-detection

Wenn man die 2te Abbildung betrachtet wird es schon klarer, aber ich bin 
immer noch nicht dahinter gekommen wie man rausfindet wieviel mg wieviel 
g darstellen.
Auch die Zeit, die als Duration eingestellt wird ist klar. Das ist dann 
auch nicht mehr nötig, aber der Schwellwert ist immer noch unklar, 
zumindest für mich.

Gruß

: Bearbeitet durch User
von Carsten M. (ccp1con)


Lesenswert?

Bevor du mit motion detection, free fall und zero motion anfängst, 
sollte der Sensor erstmal richtig konfiguriert sein. Ist das bei dir der 
Fall? bekommst du Beschl. und Winkelg. Werte?
Das ist meine config für FF, Motion ....
1
    // FREE FALL
2
    MPU9150_Registers._0x1D_FREE_FALL_Accel_Threshold = 20; // 1 LSB = 32mg; 30 = 640 mg
3
    MPU9150_Registers._0x1E_FREE_FALL_Duration = 2; // 1 LSB = 1 ms
4
    MPU9150_Registers._0x69_Motion_detect_ctrl.FF_COUNT = 1; // decrement by 1
5
    // SHOCK
6
    MPU9150_Registers._0x1C_Accel_config.ACCEL_HPF = _on_5_00Hz;
7
    MPU9150_Registers._0x1F_Motion_Detection_Threshold = 32; // 1 LSB = 32 mg; 1024 mg
8
    MPU9150_Registers._0x20_Motion_Detection_Duration = 1; // 1 LSB = 1 ms
9
    MPU9150_Registers._0x69_Motion_detect_ctrl.MOT_COUNT = 1; // decrement by 1
10
    MPU9150_Registers._0x69_Motion_detect_ctrl.ACCEL_ON_DELAY = 3; // 7 ms delay
11
    // ZERO MOTION
12
    MPU9150_Registers._0x21_Zero_Motion_Detection_Threshold = 1; // 1 LSB = 32 mg; 2 = 64 mg
13
    MPU9150_Registers._0x22_Zero_Motion_Detection_Duration = 46; // 1 LSB = 64 ms; 46 = 3000 ms

: Bearbeitet durch User
von Jojo S. (Gast)


Lesenswert?

Sergej M. schrieb:
> Hier ist es dann nur die 32mg/LSB für alle Einstellungen.

Aber das ist doch eindeutig, der Bereich ist von 32 mg bis 255*32 mg. 
Und das relativ zum Wert der während des Register setzen ansteht, siehe 
** im Ablaufdiagramm.

von Sergej J. (subz3ro)


Lesenswert?

Jojo S. schrieb:
> Sergej M. schrieb:
>> Hier ist es dann nur die 32mg/LSB für alle Einstellungen.
>
> Aber das ist doch eindeutig, der Bereich ist von 32 mg bis 255*32 mg.
> Und das relativ zum Wert der während des Register setzen ansteht, siehe
> ** im Ablaufdiagramm.

Welcher Wert ist dann 2g?

@ Carsten M.
Ich habe wie schon in den oberen Posts erwähnt wie ich die Register 
setze (siehe Datenblatt Seite 32/52).

So sieht meine Funktion dann aus
1
void init_high_g_int(){
2
    
3
      //datasheet PS-MPU-9150A page 32/52              LSB = least significant bit
4
  
5
  accelgyro.setSleepEnabled(false);                  //wake up the acc
6
  accelgyro.setWakeCycleEnabled(false);
7
  accelgyro.setStandbyXAccelEnabled(false);          //acc axis enable
8
  accelgyro.setStandbyYAccelEnabled(false);
9
  accelgyro.setStandbyZAccelEnabled(false);
10
  accelgyro.setDHPFMode(0x00);
11
  accelgyro.setDLPFMode(0x00);
12
  
13
  accelgyro.setIntEnabled(0x40);                      //enable the mot_detect_int
14
  accelgyro.setIntMotionEnabled(true);
15
  accelgyro.setMotionDetectionDuration(1);           //1 LSB = 1ms    25 LSB * (1/5Hz) = 5s
16
  accelgyro.setMotionDetectionThreshold(64);         //1 LSB = 32mg    10 LSB * 32 mg/LSB = 320mg
17
  
18
  delay(1);
19
  
20
  accelgyro.setDHPFMode(0x07);
21
  accelgyro.setWakeFrequency(B01000111);    //5Hz
22
  
23
  accelgyro.setWakeCycleEnabled(false);
24
  accelgyro.setTempSensorEnabled(false);
25
  
26
}

Ich will eine verbindliche Aussage, wie die Werte gesetzt werden müssen. 
Wenn ich z.B. den Schwellwert wie in dem Ablauf setze dann kommt ein 
Interrupt wenn man die Hand auf den Tisch ablegt.

Wenn jemand eine Formel oder ähliches hat wäre das super. Dann könnte 
ich es gleich mal nachprüfen. :)

: Bearbeitet durch User
von Jojo S. (Gast)


Lesenswert?

Sergej M. schrieb:
> Welcher Wert ist dann 2g?

2g (absolut) kann der Sensor nicht per Interrupt melden.

von Carsten M. (ccp1con)


Lesenswert?

>Wenn jemand eine Formel oder ähnliches hat...

1 LSB = 32 mg
1 LSB = 1 ms

ist doch Formel genug!?

Dann spielen noch der filter und der motion count einer Rolle.
Sieht aus, als ob dein filter off ist. (0x07)

von Sergej J. (subz3ro)


Lesenswert?

Jojo S. schrieb:
> Sergej M. schrieb:
>> Welcher Wert ist dann 2g?
>
> 2g (absolut) kann der Sensor nicht per Interrupt melden.

Das ist klar, jedoch sollte es doch möglich sein die mg-Werte so zu 
interpretieren das dieser einem g-Wert zugeordnet werden können, oder 
nicht?


Carsten M. schrieb:
>>Wenn jemand eine Formel oder ähnliches hat...
>
> 1 LSB = 32 mg
> 1 LSB = 1 ms
>
> ist doch Formel genug!?
>
> Dann spielen noch der filter und der motion count einer Rolle.


Das ist doch keine Formel, das sind nur zwei Variablen.
LSB = 60
mg = 32 = 0,032g
Ich meine sowas wie Schwelwert = LSB/mg = 60/32 = 1,875g?

> Sieht aus, als ob dein filter off ist. (0x07)

Hab es so konfiguriert wie im Ablaufplan.
Ein Fehler gabs aber noch, hab am Ende
1
accelgyro.setWakeCycleEnabled(true);
nicht wieder auf true gesetzt, ob das was ausmacht.

: Bearbeitet durch User
von Carsten M. (ccp1con)


Lesenswert?

Bin mir gerade nicht sicher, ob du die "Formel" (ok ist nur ne 
Gleichung) richtig verstehst.

1 LSB = 32 mg heisst:
wenn du 1 ins Register schreibst ist Threshold 32 mg
bei 2 ist es 64 mg,
bei 3 ist Threshold 96 mg ...
...
bei 59 ist Threshold 1888 mg (deine 1,88 g).

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Carsten M. schrieb:
> Bin mir gerade nicht sicher, ob du die "Formel" (ok ist nur ne
> Gleichung) richtig verstehst.

Ich bin mir nicht sicher ob der TE uns langsam hier alle verarscht.
>
> 1 LSB = 32 mg heisst:
> wenn du 1 ins Register schreibst ist Threshold 32 mg
> bei 2 ist es 64 mg,
> bei 3 ist Threshold 96 mg ...
> ...
> bei 59 ist Threshold 1888 mg (deine 1,88 g).

Dieser Zusammenhang wurde jetzt einige male verdeutlicht. Die Formel 
wurde aufgestellt und vorgerechnet. Jetzt nochmal von dir. Darum sage 
ich ja auch dauernd, dass das Problem des TE irgendwie nicht klar wird. 
Das meine ich ernst.

von Jojo S. (Gast)


Lesenswert?

Sergej M. schrieb:
>>> Welcher Wert ist dann 2g?
>>
>> 2g (absolut) kann der Sensor nicht per Interrupt melden.
>
> Das ist klar, jedoch sollte es doch möglich sein die mg-Werte so zu
> interpretieren das dieser einem g-Wert zugeordnet werden können, oder
> nicht?


Das 'm' steht für milli und zwischen mg und g liegt einfach der Faktor 
1000, wenn das nicht klar ist dann bitte nicht mehr weiterlesen und auf 
gar keinen Fall weiterprogrammieren.
Das Gleiche gilt wenn man nicht 'Rel_Threshold = 32 mg * x' nach x 
umgestellt bekommt. LSB heisst nur 'Least significant bit' und ist kein 
Wert von x, es entspricht nur einer Auflösung von x mg.
Meine Aussage bezog sich aber mehr darauf das man nicht 2g (oder ca. 
2000 mg) einstellt sondern die relative Schwelle von +/- 2g, bezogen auf 
den aktuellen Wert. Wenn der im Ruhezustand gerade zufällig =0 ist dann 
kommt der Interrupt bei Messwert > +2g oder Messwert <-2g 
(Vorrausgesetzt die Zeit 'Motion Duration' wurde erreicht). Wenn das 
Register gesetzt wird und zu dem Zeitpunkt der Messwert 1g ist sind die 
Schwellen +3g und -1g. So interpretiere ich das Datenblatt und so zeigt 
es auch das Diagramm deines alternativen Sensors.
und was 'setWakeCycleEnabled' macht sollte die Doku zu der Lib die du 
verwendest erklären, da kann man wieder nur raten.

von Sergej J. (subz3ro)


Lesenswert?

Carsten M. schrieb:
> Bin mir gerade nicht sicher, ob du die "Formel" (ok ist nur ne
> Gleichung) richtig verstehst.

Also wenn du deine "Formel" meinst, dann nicht.

>
> 1 LSB = 32 mg heisst:
> wenn du 1 ins Register schreibst ist Threshold 32 mg
> bei 2 ist es 64 mg,
> bei 3 ist Threshold 96 mg ...
> ...
> bei 59 ist Threshold 1888 mg (deine 1,88 g).

Das ist schon längst allen klar, jedoch müssen ja die mg-Werte was 
aussagen.
Die Formel habe ich jetzt nur so hingeschrieben, die muss nicht 
stimmern.

Klingt natürlich plausibel, dass LSB von 255 dann einen Wert von 8196mg 
= 8,1g ergibt, stimmt das aber?
Wieso steht dann im Datenblatt nicht das es nur bis max 8g eingestellt 
werden kann, obwohl der Sensor bis 16g konfigurierbar ist.

: Bearbeitet durch User
von uwe (Gast)


Lesenswert?

Ist dir Bewußt das 1mg "ein milli g", also 1 Tausendstel g?
32mg sind also 0,032g. Wenn du nun den Schwellwert bei 2g haben willst 
dann mußt du doch nur 2g/0,032g=62,5 rechnen. Wenn du also 62 in das 
Register schreibst entspricht das 62*0,032g=2g. Verstanden?

von uwe (Gast)


Lesenswert?

>obwohl der Sensor bis 16g konfigurierbar ist.
Eventuell weil er positive und negative Beschleunigung mißt. Cih habe 
das Datenblatt auch noch nicht gelesen, aber kann er +-16g messen oder 
nur +-8g?
Wenn er nur +-8g messen kann und er normalerweise 0g haben würde dann 
wären ein schwellwert von 8g schon logisch.

von Sergej J. (subz3ro)


Lesenswert?

Ach Leute, das ist doch zum Mäusemelken.

Ihr braucht mir die Grundlagen der Informatik und der Mathematik nicht 
zu erklären. Meine Frage war doch sehr simpel.

Noch mal an den Anfang.

Sensor kann Motion Interrupt
1 LSB im Register ergibt, laut Datenblatt, 32mg
Maximaler Schwelwert 255 LSB * 32 = 8196mg rund 8g
Sensor kann auf +-16g konfiguriert werden
Der Interrupt dann wohl nicht wie es aussieht

Alle eure Tipps hatte ich bevor ich hier was geschrieben habe selber 
validiert und bin nicht zu den Ergebnissen gekommen die theoretisch 
rauskommen müssten.

Daher meine Zweifel. Ich hoffen wir können uns nun weiter unterhalten, 
ohne das alle ausfallend werden, ich halte mich ja auch einigermassen 
zurück. :)

Gruß

von Carsten M. (ccp1con)


Lesenswert?

ok dann ist ja alles klar. aber ich würde nicht am Sensor zweifeln 
sondern an meinem Code oder meinem Verständnis an der Funktionsweise.

von Sergej J. (subz3ro)


Lesenswert?

Carsten M. schrieb:
> ok dann ist ja alles klar. aber ich würde nicht am Sensor zweifeln
> sondern an meinem Code oder meinem Verständnis an der Funktionsweise.

Also würdest du sagen das der Sensor nur bis 8g einen Interrupt 
generieren kann? Was ja den Berechnungen zu entnehmen ist.

von uwe (Gast)


Lesenswert?

Auch Datnblätter haben fehler oder sind unvollständig. Ich denke mal 
wenn ich den Messbereich auf 2g stelle, daß der Sensor dann auch nicht 
mehr bis 8g messen kann. Wäre auch unlogisch wenn er das könnte. Also 
wird man für den Bereich +-16g halt 64mg/LSB ins Register schreiben 
müssen und für 2g halt 8mg/LSB usw.
Das solltest du jedoch testen. z.B. so: wenn du den gleichen Wert is 
Schwellwertregister schreibst und das in verschiedene Meßbereichen 
machst wird der Interupt sensibler?

von Sergej J. (subz3ro)


Lesenswert?

uwe schrieb:
> Das solltest du jedoch testen. z.B. so: wenn du den gleichen Wert is
> Schwellwertregister schreibst und das in verschiedene Meßbereichen
> machst wird der Interupt sensibler?

Nein wird es nicht (mit 2g und 16g getestet). Wäre auch unlogisch, im 
Konfigurationsablaufplan wird ja auch nicht vorerst der Sensor 
konfiguriert, oder wird zumindest nichts erwähnt bei welcher 
Konfiguration die es machen.

Gruß

von Jojo S. (Gast)


Lesenswert?

In der Registerbeschreibung wird auf das Datenblatt verwiesen:
'This register configures the detection threshold for Motion interrupt 
generation. The mg per LSB increment for MOT_THR can be found in the 
Electrical Specifications table of the MPU - 9150 Product Specification 
document.'
Im Datenblatt findest du auf S.12 :
'NTELLIGENCE FUNCTION INCREMENT  32 mg/LSB'
ohne irgendwelche Anmerkungen das dieser Wert auf die Messbereich 
Skalierung bezogen ist, daher würde ich das auch so glauben.

von Sergej J. (subz3ro)


Lesenswert?

Jojo S. schrieb:
> Im Datenblatt findest du auf S.12 :
> 'NTELLIGENCE FUNCTION INCREMENT  32 mg/LSB'

Genau, was mich aber stuzig macht ist die "intelegente Funktion", der 
Wert orientiert sich ja anscheinend an der Konfiguration. Dazu ist auch 
nichts zu finden.

Wie schon erwähnt, andere Sensoren haben verschiedene Sensibilitäten für 
verschiedene g-Kräfte.

von Jojo S. (Gast)


Lesenswert?

Mit 'Intelligenz' ist mit Sicherheit der integrierte DMP (Digital Motion 
Processor) gemeint der unabhängig von der Ausgabegeschwindigkeit und 
Auflösung Bewegungsüberwachung macht und meldet.

von Sergej J. (subz3ro)


Lesenswert?

Jojo S. schrieb:
> Mit 'Intelligenz' ist mit Sicherheit der integrierte DMP (Digital Motion
> Processor) gemeint der unabhängig von der Ausgabegeschwindigkeit und
> Auflösung Bewegungsüberwachung macht und meldet.

Vielen Dank das ist mal was nützliches.

Um mal einen Zwischenstand fest zu halten.

- Keiner hat mit dem Sensor und dem Motion Detection INterrupt 
gearbeitet.
- Alle Vermuttungen und Aussagen basieren auf das durchlesen des 
Datenblattes.
- Die einstellung des Sensors hat nichts mit dem Interrupt zu tun
- Der Interrupt kann theoretisch nur auf maximal +8g reagieren

: Bearbeitet durch User
von Jojo S. (Gast)


Lesenswert?

Wenn du Anfangs geschrieben hättest das du für 5000mg/32mg=156 
konfiguriert hast und das trotzdem zu empfindlich erscheint dann wäre 
der Thread sicher deutlich kürzer geworden...
Ich habe den Sensor auch vor kurzem ausprobiert, aber die Werte nur auf 
ein OLED Display geschrieben und noch nicht den Interrupt genutzt. Dazu 
habe ich die Lib von 
https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU9150
genutzt (aber unter mbed).
Im Code wird auf eine Spec 2.0 verwiesen und da ist die Empfindlichkeit 
MOT_THR mit 2 mg/LSB angegeben. Ich habe versucht die zu finden und erst 
einmal eine neuere 4.2/4.3 gefunden: und da gibt es die Kapitel Motion 
Detection & entsprechende Interrupts gar nicht mehr!
Das ist irgendein Geschiss mit dem DMP, vielleicht mit den Rechten an 
den Algorithmen oder sowas, jedenfalls ist der DMP Teil ja auch nicht 
offen dokumentiert. Möglicherweise kann man über die DMP Konfiguration 
auch die MOT_THR Empfindlichkeit verstellen?
Auf die Schnelle habe ich noch das gefunden: 
http://www.i2cdevlib.com/forums/topic/153-official-dmp-documentation-is-released-by-invensense/
Nach Registrierung kann man die DMP Docs eventuell doch runterladen, 
aber da bin ich erstmal raus.

von Carsten M. (ccp1con)


Lesenswert?

>- Keiner hat mit dem Sensor und dem Motion Detection INterrupt
>gearbeitet.

Doch. Was denkst du warum ich code dafür schreibe.
Es funzt auch. Allerdings will ich keine 16 g erreichen. ;-) Sondern mir 
reicht ein Int, wenn man die Hand auf die Tischplatte legt. Genau das 
wollte ich. Ich will damit sicher stellen, dass das Gerät in totaler 
Ruhe ist.

btw.
Um den DMP zu aktivieren muß man extra firmware in die MPU hochladen, 
wenn ich mich recht erinneren.

von Sergej J. (subz3ro)


Lesenswert?

@Jojo S.
Ok danke, werde ich mir mal genauer anschauen.

Carsten M. schrieb:
>>- Keiner hat mit dem Sensor und dem Motion Detection INterrupt
>>gearbeitet.
>
> Doch. Was denkst du warum ich code dafür schreibe.
> Es funzt auch. Allerdings will ich keine 16 g erreichen. ;-) Sondern mir
> reicht ein Int, wenn man die Hand auf die Tischplatte legt. Genau das
> wollte ich. Ich will damit sicher stellen, dass das Gerät in totaler
> Ruhe ist.
>
> btw.
> Um den DMP zu aktivieren muß man extra firmware in die MPU hochladen,
> wenn ich mich recht erinneren.

Sorry hast ja wirklich den Code :)
Aber kannst du mir den erklären was genau du da eingestellt hast und 
wieso?
Und hast du es mal nachgeprüft?

Gruß

von Carsten M. (ccp1con)


Lesenswert?

Naja so gut das halt geht.
Ich schüttle das Ding gut - bekomme Schock (Motion) Detection Int
Ich lasse es 3 Sekunden ruhig liegen - bekomme Zero Motion Int
Wenn ich jetzt nur daran wackle gibt es nochmal ein Zero Motion Int!
Das hat mich erst verwundert, dann habe ich aber gelesen, dass auch ein 
Int generiert wird, wenn der Sensor aus dem Zero Motion Zusand kommt.

: Bearbeitet durch User
von Sergej J. (subz3ro)


Lesenswert?

Carsten M. schrieb:
> Naja so gut das halt geht.
> Ich schüttle das Ding gut - bekomme Schock (Motion) Detection Int
> Ich lasse es 3 Sekunden ruhig liegen - bekomme Zero Motion Int
> Wenn ich jetzt nur daran wackle gibt es nochmal ein Zero Motion Int!
> Das hat mich erst verwundert, dann habe ich aber gelesen, dass auch ein
> Int generiert wird, wenn der Sensor aus dem Zero Motion Zusand kommt.

Super das du es auch mal ausprobiert hast.

Jedoch beantwortet es nicht meine Frage :)
Wie gesagt ich hate es auch schon mit verschiedenen Werte ausprobiert, 
aber das ist ja dann sowas wie trial and error.

Ich hätte gerne so eine Art mathematischen Beweis für einen Protokol. Da 
kann ich schlecht rein schreiben: ich habe es mal schwach und mal stark 
geschüttelt :)

Der einzige mathematische Ansatz war ja der den schon alle x-Mal 
durgekaut haben (xLSB * 32mg).

Gruß

von Carsten M. (ccp1con)


Lesenswert?

Keine Ahnung was du für Möglichkeiten hast. Aber woher willst du denn 
(mathematisch) genaue Beschleunigung nehmen/erzeugen? Die einzige, die 
mir zur Verfügung steht ist 1g (9,81 m/s2). ;-)

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Sergej M. schrieb:

> Der einzige mathematische Ansatz war ja der den schon alle x-Mal
> durgekaut haben (xLSB * 32mg).

Nun, man muss sich schon auf die Herstellerangaben verlassen können. 
Mehr Beweis braucht es selten. Der mathematische Zusammenhang zwischen 
Messgröße und Register ist das einzige was du brauchst. Testest du deine 
Thermometer auch erstmal in der Kühlkammer durch oder glaubst du den 
Angaben?

Wenn du der Meinung bist, das stimmt nicht, dann musst du definierte 
Beschleunigungen erzeugen können und mit den Ausgaben des Sensors 
vergleichen.
Nur warum sollte das so nicht stimmen?
Was ist denn genau der Hintergrund deines Misstrauens?
Warum willst du den Sensor unbedingt exakt qualifizieren?

von Sergej J. (subz3ro)


Lesenswert?

Carsten M. schrieb:
> Keine Ahnung was du für Möglichkeiten hast. Aber woher willst du denn
> (mathematisch) genaue Beschleunigung nehmen/erzeugen? Die einzige, die
> mir zur Verfügung steht ist 1g (9,81 m/s2). ;-)


z.B. mit sowas


> Testest du deine
> Thermometer auch erstmal in der Kühlkammer durch oder glaubst du den
> Angaben?

Ich mache das nicht aber der Hersteller sicherlich, sonst kann er ja 
keine Angeben machen ;)

> Nur warum sollte das so nicht stimmen?
> Was ist denn genau der Hintergrund deines Misstrauens?

Mit fehlen Angaben wie z.B. der Interrupt kann nur auf max. 8g reagieren 
oder sowas.

> Warum willst du den Sensor unbedingt exakt qualifizieren?

Naja ich verwende diesen Sensor und einer der Hauptaufgaben des 
Projektes ist es den Interrupt richtig einzustellen, wenn da Fragen 
kommen mit wie haben sie den Schwellwert definiert und validiert dann 
sage ich ammmm ammmm siehe diesen Thread :)

von uwe (Gast)


Lesenswert?

Dann ließ den Beschleunigungswert ständig aus und wenn der Interupt 
kommt merke dir den letzten Wert undden danch ausgelesen. Das Zeichnest 
du dir in ein Diagramm. Wenn du das noch validieren mußt dann nimm ein 
Kalibriertes Beschleunigungsmessgerät und befestige die Beiden 
miteinader und mach den Test nochmal.

von Sergej J. (subz3ro)


Lesenswert?

Nun jut Leute,

vielen Dank an alle, hab mir auf jeden Fall geholfen.

Wenn ich was neues Handfestes erfahre werde ich es hier posten, wenn 
nicht dann ist die hier disskutierte Lösung die Richtige :-)

Gruß

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.