Forum: Mikrocontroller und Digitale Elektronik MPU6050 Sleep Mode und nrf51822 - Interrupt funktioniert manchmal nicht.


von Andreas R. (weisseruebe)


Angehängte Dateien:

Lesenswert?

Hallo in die Runde,

ich suche seit geraumer Zeit nach einem sehr sporadischen Problem mit 
dem MPU6050 (auf GY87 Breakout) und einem Nordic nrf51822 BLE Modul auf 
einem Waveshare BLE400 Core Board.

Ich nutze die I2CDevlib.

Das ganze wird von einer CR2032-Knopfzelle gespeist.
Der nrf51822 geht nach 10 Sekunden in den Sleep-Mode, der MPU6050 ebenso 
und wird über den Motion-Interrupt wieder geweckt. Das klappt auch fast 
immer total problemlos. Aber in sehr wenigen Fällen (1%?) leider nicht. 
Dann bleibt der nrf51822 im Sleep-Mode (POWER_MODE_OFF).
Wake-Up über "Falling", der Interrupt-Ausgang ist entweder Open-Drain 
(mit internem 13k Pull-Up im nrf51) oder Push-Pull ohne internen 
Pull-Up.

Die Knopfzelle hat >3V und war teilweise ganz frisch. Auch wenn ich an 
die untere Grenze der zulässigen Versorgungsspannung gehe, kann ich das 
Problem nicht nachstellen.
Die Spannung bricht ein wenig ein während der 10 Sekunden und erholt 
sich im Sleep wieder, aber alles im Rahmen der zulässigen Grenzen.

Wenn ich den Interrupt-Pin messen will und mit dem Oszi dran gehe, wecke 
ich den nrf51822 auf - daraus schliesse ich bisher, dass der Interrupt 
vom MPU6050 nicht kommt.

Ich bin nun etwas ratlos - der Fehler ist schwer zu reproduzieren und 
mir gehen die Ideen aus. Hat jemand noch Tipps?

Ich baue mir gerade einen Testaufbau mit Servo, der das Ding im 20 
Sekunden-Takt bewegt und hänge mal das Oszi fest an den Interrupt-Pin, 
vielleicht bringt das weitere Erkenntnisse oder lässt den Fehler 
schneller auftauchen.

Hier das Code-Snippet, das den MPU6050 in Sleep versetzt.
1
void mpu6050LowPower(u_int16_t motionThreshold, uint8_t motionDuration) {
2
  mpu.setDMPEnabled(false);
3
  mpu.resetFIFO();
4
  mpu.setIntDMPEnabled(false);
5
  mpu.setInterruptMode(1);
6
  mpu.setInterruptDrive(0); //Push-Pull
7
  mpu.setWakeFrequency(1);
8
  mpu.setClockSource(MPU6050_CLOCK_INTERNAL);
9
  mpu.setStandbyYGyroEnabled(true);
10
  mpu.setStandbyXGyroEnabled(true);
11
  mpu.setStandbyZGyroEnabled(true);
12
  mpu.setStandbyZAccelEnabled(true);
13
  mpu.setStandbyXAccelEnabled(true);
14
  mpu.setStandbyZAccelEnabled(true);
15
  mpu.setIntMotionEnabled(true);
16
  mpu.setMotionDetectionThreshold(motionThreshold);
17
  mpu.setMotionDetectionDuration(motionDuration);
18
  mpu.setWakeCycleEnabled(true);
19
}

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.