mikrocontroller.net

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


Autor: Michael T. (michelback)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas R. (tinman) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ein paar beispiele :

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

Autor: Michael T. (michelback)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael T. (michelback)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael T. (michelback)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael T. (michelback)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: samsung (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.