Forum: Mikrocontroller und Digitale Elektronik Leistungstarker Beschleunigungssensor


von Dino (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe ein Setup mit einem Arduino Uno und zwei MMA8452Q 
Beschleunigungssensoren. Ich will damit eine vergleichende Messung 
anstellen.
Nur scheint mein Setup nicht ausreichend leistungsstark. Oben ist eine 
Beispielmessung gezeigt mit beiden Sensorsignalen. Ich gebe ein eine 
Schwingung auf beide Sensoren, und bei einen der beiden sollte eine 
geringere Amplitude ankommen, da dieser nur eine gedämpfte Schwingung 
erfährt.
Man erkennt zwar einen Unterschied im Signal, allerdings ist dieser sehr 
klein. Ich kann zwar etwas mit den Messbereichen spielen 2/4/8g um die 
Empfindlichkeit zu erhöhen, das reicht mir leider nicht.

Gibt es Sensoren dieses Typs, die sagen wir um eine Größenordnung 
empfindlicher sind? Hat jemand damit Erfahrung? Ich bin auch bereit 
etwas mehr Geld auszugeben. Aber alle Alternativen die ich finde 
scheinen in ähnlichen Empfindlichkeitsbereichen zu arbeiten.

Außerdem scheint die Zeitauflösung unerwarteter Weise begrenzt.
Im Datenblatt war die Rede von 800 Hz Data outputrate.
Tatsächlich bekomme ich aber nur wenige Datenpunkte pro Sekunde.
Ist hier der begrenzende Faktor der µC und die serielle Schnittstelle? 
Brauche ich einen µC der zu high speed mode in der Lage ist, würde mir 
das etwas bringen? Oder schafft man wirklich irgendwie eine Messfrequenz 
von
über 80Hz.

von Sebastian R. (sebastian_r569)


Lesenswert?

Nimm nen Beschleunigungssensor mit analogem Ausgang und einen AD-Wandler 
dahinter. Dann kannst du ein paar tausend Messungen pro Sekunde 
erreichen.

von Dino (Gast)


Lesenswert?

Aha warum der AD-Wandler? Kann ich nicht direkt an die Analogports 
anschließen, wenn ich nen analogen Sensor nehme?

von Benno P. (Gast)


Lesenswert?

Dino schrieb:
> Tatsächlich bekomme ich aber nur wenige Datenpunkte pro Sekunde.

Hast du auch DR0, DR1 und DR2 auf Null gesetzt? Nur damit erreichst du 
die 800Hz bei der Output Data Rate.

Wie hoch ist deine I²C-Frequenz?

Hintergrund: Ich habe die Dinger schon in der Lageregelung eines Kopters 
gesehen. Und mit nur ein paar Messungen pro Sekunde würde sich das Gerät 
gnadenlos in den Boden bohren :-)

von Dino (Gast)


Lesenswert?

Mein Clocksignal ist 400000 was dem fast mode des arduino uno 
entspricht.
Das wird dann wohl gleich zu der I^2C Frequenz sein.
Baudrate habe ich mal auch so hoch eingestellt wie ging: 115200.
Was DR0, 1,2 ist weiß ich nicht. Sollen das die Variabeln sein die die 
Datenrate bestimmen?
Im Constructor der Bibiothek wird die output datenrate standardmäßig auf 
800 gesetzt. Da ich außer den Constructor nichts aufrufe sollte doch 
alles gut sein oder?

von Benno P. (Gast)


Lesenswert?

Dino schrieb:
> Was DR0, 1,2 ist weiß ich nicht. Sollen das die Variabeln sein die die
> Datenrate bestimmen?
Das sind Bits im Register "CTRL_REG1" im Sensor.
Schau mal ins Datenblatt, dafür ist es doch da :-)

Ich sag dir sogar noch die Stelle:
Punkt 6.7 "Control registers"
Da steht auch noch eine Bemerkung: Der Sensor muß im standby mode sein, 
damit du die Bits im CTRL_REG1 ändern kannst! Hast du das bedacht?

> Im Constructor der Bibiothek wird die output datenrate standardmäßig auf
> 800 gesetzt. Da ich außer den Constructor nichts aufrufe sollte doch
> alles gut sein oder?
Das klingt jedenfalls so.
Ich kenn die Bibliothek nicht. Vielleicht ist die fehlerhaft?
Alles ist möglich...

von Axel S. (a-za-z0-9)


Lesenswert?

Dino schrieb:
> Aha warum der AD-Wandler? Kann ich nicht direkt an die Analogports
> anschließen, wenn ich nen analogen Sensor nehme?

Ach du ScheiXXe. Di verwendest das Arduino-Framework mit den ganzen 
Abstraktionen darunter? Kein Wunder daß das nichts wird.

Zu deiner Information: hinter den "Analogports" des Arduino verbirgt 
sich ein AD-Wandler. Der kann auch relativ schnell wandeln mit 13µs 
pro Wandlung entsprechend knapp 80kHz Abtastrate. Allerdings ist es nur 
ein ADC; für zwei Kanäle mußt du also immer abwechselnd messen und 
bekommst effektiv nur die halbe Rate. Dein Diagramm ist in dieser 
Hinsicht schon mal falsch. Zwei Datenpunkte sind niemals von der 
gleichen Zeit, sondern immer gegeneinander versetzt.

Dino schrieb:
> Tatsächlich bekomme ich aber nur wenige Datenpunkte pro Sekunde.
> Ist hier der begrenzende Faktor der µC und die serielle Schnittstelle?

Soll das ein Witz sein? Du verschachtelst hier ernsthaft Messungen und 
die Ausgabe über die serielle? Womöglich gar noch mit einem delay() in 
der Schleife für das Timing? So wird das nichts.

OK, wenn es wirklich nur 800Hz Abtastrate sein sollen, reicht es 
vielleicht, wenn du erstmal die Baudrate der Schnittstelle so hoch 
drehst, wie es geht. Mit 115200Bd kannst du bei 800Hz Abtastrate 
immerhin bis 14 Zeichen pro Datenpunkt über die serielle prügeln.

Für eine vernünftige (äquidistante) Abtastung lernst du, wie du einen 
Timer-Interrupt verwendest.

von Dino (Gast)


Lesenswert?

Axel S. schrieb:
> Zu deiner Information: hinter den "Analogports" des Arduino verbirgt
> sich ein AD-Wandler. Der kann auch relativ schnell wandeln mit 13µs
> pro Wandlung entsprechend knapp 80kHz Abtastrate. Allerdings ist es nur
> ein ADC; für zwei Kanäle mußt du also immer abwechselnd messen und
> bekommst effektiv nur die halbe Rate. Dein Diagramm ist in dieser
> Hinsicht schon mal falsch. Zwei Datenpunkte sind niemals von der
> gleichen Zeit, sondern immer gegeneinander versetzt.

Hmm der Grund weshalb ich es über die serielle Schnittstelle gemacht 
habe, war dass ich dachte, dass es tatsächlich zwei Messungen zu 
gleichen Zeitpunkt sind, da sie an dem selben Port hängen mit dem 
gleichen clocksignal.
Durch das Master werden dann die beiden verschiedenen Sensoren 
addressiert und ausgelesen. Und ich erhalte jeweils in den 
entsprechenden Slave die Daten zurück.
Ich bin verwundert darüber, dass das nicht so sein soll.
Abgesehen davon würde es mir nichts ausmachen, wenn sie nicht zeitgleich 
messen solange ich wüsste wie groß der delay zwischen den Sensoren ist.
Ich kann das Signal ansonsten interpolieren. Allerdings erwarte ich das 
der zweite Sensor zeitversetzt reagiert, da

Axel S. schrieb:
> Soll das ein Witz sein? Du verschachtelst hier ernsthaft Messungen und
> die Ausgabe über die serielle? Womöglich gar noch mit einem delay() in
> der Schleife für das Timing? So wird das nichts.

Der Sensor ist digital, der wird seriell angesteuert und ausgelesen, ich 
verschachtel gar nichts. Aber das mit dem delay() hört sich nach einem 
guten Verbesserungsvorschlag an, das kann man loswerden ohne was kaputt 
zu machen?

OK, wenn es wirklich nur 800Hz Abtastrate sein sollen, reicht es
vielleicht, wenn du erstmal die Baudrate der Schnittstelle so hoch
drehst, wie es geht. Mit 115200Bd kannst du bei 800Hz Abtastrate
immerhin bis 14 Zeichen pro Datenpunkt über die serielle prügeln.

Wie gesagt das ist ein digitaler Sensor ich kann nicht die Zeichengröße 
bestimmen.

Axel S. schrieb:
> Ach du ScheiXXe. Di verwendest das Arduino-Framework mit den ganzen
> Abstraktionen darunter? Kein Wunder daß das nichts wird.

Das versteh ich leider überhaupt nicht was damit gemeint ist.

von Dino (Gast)


Lesenswert?

Das klingt jedenfalls so.
Ich kenn die Bibliothek nicht. Vielleicht ist die fehlerhaft?
Alles ist möglich...

Ja ein paar Bugs habe ich schon entdeckt :D Der Nachteil der Opensource 
community.  Ich versuche es mal nachzuvollziehen bis zu den Ports...

von Wolfgang (Gast)


Lesenswert?

Dino schrieb:
> Gibt es Sensoren dieses Typs, die sagen wir um eine Größenordnung
> empfindlicher sind?

Maß der Dinge ist die Erdbeschleunigung und die muss der Sensor 
vertragen, wenn er auf dem Tisch liegt. Ein Faktor 10 in der 
Empfindlichkeit wird da schwierig.

Vielleicht hilft dir ein MXR2999EL (Analogausgang) oder ein ADXL313 
(digital)

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.