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 | }
|