Forum: Mikrocontroller und Digitale Elektronik ADXL345: Treiber / Code gesucht


von Michael T. (michelback)


Lesenswert?

Hallo zusammen,

bisher konnte mir das Forum hier schon sehr viel helfen und die ersten 
Funktionen bei meinem Projekt funktionieren. Vielen Dank soweit.
Als nächstes möchte ich einen Vibrations-/Beschleunigungssensor mit 
meinem Mikrocontroller ansprechen/auslesen. Es handelt sich dabei um den 
ADXL345 von Analog.

Dazu bin ich auf der Suche nach Treibern oder Code. Hat jemand damit 
schonmal was gemacht und würde mir seinen Code zukommen lassen?

Das Datenblatt des ADXL345 ist Kommando- und Codemäßig leider sehr 
dürftig und auf der Analog-Homepage habe ich nichts finden können (bilde 
mir aber ein, dass es da mal einen monströsen Linux-treiber gab???).

Wenn da jemand was hat, wär ich sehr dankbar.
Grüße,
Michael

von Thomas R. (tinman) Benutzerseite


Angehängte Dateien:

Lesenswert?

ein paar beispiele :

- ADuC7026EVB firmware mit ansteuerung von ADXL345EVB
- IIC ansteuerung beispiel
- LPC2294 firmware mit ansteuerung von ADXL345EVB

von Michael T. (michelback)


Lesenswert?

Hallo Thomas,

vielen Dank, das hat mir schonmal weitergeholfen. Jetzt habe ich noch 
einige Fragen zum ADXL345:

1) ich möchte Vibrationen in einem fahrenden Kfz messen. Welchen g-range 
stelle ich dazu am besten ein? 16g?

2) Woher weiß ich dass der FIFO-Buffer vollständig ausgelesen ist? Kann 
ich das irgendwie abfragen?

Grüße,
Michael

von Jochen (Gast)


Lesenswert?

zu 1) Vielleicht schaust du dir DATA_FORMAT ( 0x31 ) - FULL_RES ( D3 ) 
an.

zu 2) es gibt da wohl mehrere Möglichkeiten:

a) Wenn du wissen willst, wie viele Daten noch im FIFO sind:
FIFO_STATUS ( 0x39 ) Bit0-5 => Gibt die Anzahl der FIFO-Einträge zurück

b) Wenn du nur wissen willst, ob neue Daten da sind:
INT_SOURCE ( 0x30 ) Bit7 => DATA_READY

Am Elegantesten ist es wohl mit Hilfe von INT_ENABLE ( 0x2E ) und 
INT_MAP ( 0x2F ) einen der externen Interrupts damit zu verbinden.

von Michael T. (michelback)


Lesenswert?

Hallo Jochen,

super, vielen Dank! Das waren genau die Antworten die ich gesucht habe. 
Das mit FULL_RES ist ja ziemlich pfiffig, da bin ich beim Lesen des 
Datenblattes gar nicht drauf aufmerksam geworden...

Grüße,
Michael

von Michael T. (michelback)


Lesenswert?

jetzt ist doch noch eine Frage aufgetaucht. Ich möchte den FIFO 
auslesen, wenn er 20 Einträge hat. Meine CLOCK-Frequenz der SPI ist 
2,5MHz. Jetzt steht beim ADXL allerdings drin, dass der FIFO mit einer 
maximalen Frequenz von 3,2kHz beschrieben wird.
Heißt das jetzt, dass ich nur den ersten Eintrag im FIFO-Ausgang mit der 
SPI-Frequenz von 2,5MHz auslesen kann, dann warten muss, bis der nächste 
Eintrag wieder im FIFO-Ausgang ist (also 312,5usec warten)?

Was bringt mir dann eine Maximale CLOCK-Frequenz von 5MHz????

Oder kann ich direkt nach einmal Auslesen ohne Pause den nächsten Wert 
auslesen?

Grüße,
Michael

von Michael T. (michelback)


Lesenswert?

ich glaube ich habs kapiert:
beschrieben wird der FIFO mit 3200Hz wenn eine Eingangsfrequenz von 
1600Hz gewählt wird. Das heißt, der erfasste Wert wird so schnell in den 
FIFO geschrieben. Da hat wohl der Herr Nyquist und der Herr Shannon 
seine Finger im Spiel ;)
Beim Auslesen des FIFOs muss CS 5µs zwischen dem Auslesen des ersten 
sample-sets und dem Auslesen des folgenden sample-sets auf HIGH sein. 
Dann ist das Popping(Werte der zweiten FIFO-Position rutschen in die 
erste FIFO-Position/FIFO-Ausgang) gewährleistet. Es muss also 5µs 
gewartet werden und nicht 312,5µs.
Das wäre ja noch schöner gewesen...

Ich hoffe ich liege da richtig, falls nicht, korrigiert mich bitte.
Grüße,
Michael

von Stephan (Gast)


Lesenswert?

Ich bin auch gerade dabei mit dem ADXL345 zu experimentieren.

Aber ich schaff's einfach nicht eine stabile Ansteuerung über SPI hin zu 
bekommen. Hat da vielleicht jemand einen Bsp. Code? Im samples.zip is ja 
leider nur I2C.

danke,
Stephan

von Michael (Gast)


Lesenswert?

Hallo Stefan,

was für einen µC hast du denn? Für den R8C/22 von Renesas hab ich die 
SPI (heißt dort SSU) realisiert und auch alle zu übertragenden Kommandos 
für den ADXL345. Bei mir klappt das auslesen der Vibrationsdaten 
problemlos (nach langer Zeit). Ist allerdings wirklich nur für die 
SSU-Schnittstelle anzuwenden, da sie vom R8C/22 bereitgestellt wird.

Wenn es um ein eher generelles Problem geht, wie anzusteuern ist, dann 
hier ein paar Tipps zu den Kommandos:

zur config des ADXL:
Je nachdem, wie er arbeiten soll, musst du die entsprechenden kommandos 
senden(zB config für FIFO-Buffer, oder die Data rate). Dabei ist 
folgendermaßen vorzugehen:

1) Chip Select bzw enable // ADXL345 über chip select anwählen (CS LOW)
2) Register auswählen:
adresse des registers senden (zB 0x71 für das DATA_FORMAT register)
3) Kommando schicken zB:0x09 //self test disable, 4wire mode, INT active 
HIGH, FULL-RES, 4g
4) CHip deselect //ADXL345 abwählen (CS HIGH)

Nach dem chip select also immer 2 bytes senden und dann wieder die chip 
select leitung auf high ziehen. Dieser Vorgang muss für jedes register 
gemacht werden, in dem du die Werkseinstellungen ändern willst. Zwischen 
der Config der einzelnen register habe ich bei mir ein paar nop's 
hinzugefügt.


Um die Daten auszulesen musst du folgendermaßen vorgehen:
1) Chip Select (CS LOW)
2) Kommando Read-data senden:
zB 0xF2 //Read command, multiple byte read, start address 0x32
3) 6 Bytes auslesen (also 48 clock-cycles)
4) Chip deselect (CS HIGH)

Ich hoffe ich konnte dir weiterhelfen.
Gruß,
Michael

von Stephan (Gast)


Lesenswert?

Hi Michael,

Danke für deine ausführliche Antwort. Sorry, ich bin schon ganz 
betriebsblind. Als µC verwende ich einen ATMega88.

Das mit der Reg. Programmierung mach ich im Prinzip eh so - hoff ich 
wenigstens. Ich werd's mir noch mal genau anschauen, vielleicht find ich 
da ja noch einen Bug. Delays nach dem schreiben wird ich auf alle Fälle 
dazu geben, die können nicht schaden.

by(e)
Stephan

von samsung (Gast)


Lesenswert?

Hallo an Alle,

den ADXL345 versuche ich mit einem dsPIC33 über SPI/I2C anzustueren. 
Meinen Code habe ich in c geschrieben.
Kann jemand vielleicht seinen Code posten um zur vergelich zwecken. 
Währe sehr hilfreich. Bin noch ein absoluter Anfänger in sachen 
Programmierung


Danke

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.