84-SPI_LIS3DSH-Library (STM32F4)

Auf dem Discovery-Board (der neuen Revision C) ist ein 3Achs-Beschleunigungs-Sensor eingebaut (LIS3DSH)

Hinweis : auf “alten” Discovery-Boards ist der LIS302DL bestückt
für den gibt es eine extra Library hier im Blog.

Mit dem Sensor können die Beschleunigungskräfte der X-, Y-, Z-Achse gemessen werden. Der Sensor hat eine Genauigkeit von 16bit und eine umschaltbare
Auflösung von +/- 2g, 4g, 6g, 8g, 16g

Mit dieser Library kann der Sensor sehr leicht benutzt werden. Man ruft einfach die Funktion “UB_LIS3DSH_Read()” zyklisch auf und erhält als Ergebnis die aktuellen Beschleunigungswerte in mg aller 3 Achsen als Struktur zurück.
(bei 2g Auflösung also Werte von -2000mg bis +2000mg)

Der Sensor kann eigentlich im Interrupt-Betrieb benutzt werden und auch Klick-Events bzw. Doppelklick-Events auswerten …aber darauf hab ich wegen der Übersichtlichkeit verzichtet. Wer diese Funktionen will, soll sich bei mir melden.

Vorsicht : im UserManual vom Discovery-Board ist ein Fehler, der ChipSelect-Pin vom LIS3DSH liegt an PE3 (nicht wie beschrieben an PE2)

Der Sensor hängt am SPI1 aus dem Grund wird die SPI1-Lib auch benötigt.

Hinweis : es werden nur 8bit (statt 16bit) Auflösung benutzt. Das kann von euch aber leicht abgeändert werden. Einfach noch das Lo-Byte auslesen und den Umrechnungsfaktor
anpassen.

Ich konnte die Library selbst nicht testen weil ich nur ein altes Discovery habe,
aber laut “Michael” scheint sie zu funktionieren.

Benutzte Pins :

1
2
3
4
SCK an PA5
MOSI an PA7
MISO an PA6
ChipSelect an PE3

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : GPIO
Benutzte Librarys : STM32_UB_SPI1

Enumerationen :

1
2
3
4
5
6
7
typedef enum {
  SCALE_2G =0,    // Auflösung +/- 2g
  SCALE_4G,       // Auflösung +/- 4g
  SCALE_6G,       // Auflösung +/- 6g
  SCALE_8G,       // Auflösung +/- 8g
  SCALE_16G       // Auflösung +/- 16g
}LIS3DSH_SCALE_t;

:

1
2
3
4
5
6
typedef enum {
  FILTER_800Hz =0,  // Filter (800 Hz)
  FILTER_400Hz,     // Filter (400 Hz)
  FILTER_200Hz,     // Filter (200 Hz)
  FILTER_50Hz       // Filter (50 Hz)
}LIS3DSH_FILTER_t;

Funktionen :

1
2
3
ErrorStatus UB_LIS3DSH_Init(LIS3DSH_SCALE_t scale); // zum initialisieren des LIS3DSH
void UB_LIS3DSH_Read(void);                         // zum auslesen der Beschleunigungswerte
void UB_LIS3DSH_SetFilter(LIS3DSH_FILTER_t filter); // zum einstellen des Filters

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//--------------------------------------------------------------
// File     : main.c
// Datum    : 17.05.2014
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.4
// GCC      : 4.7 2012q4
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der LIS3DSH Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_lis3dsh.h"
#include "stm32_ub_led.h"
 
int main(void)
{
  ErrorStatus check;
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  UB_Led_Init(); // LEDs initialisieren
 
  // LIS3DSH initialisieren (mit +/- 2G Auflösung)
  check=UB_LIS3DSH_Init(SCALE_2G);
 
  if(check==ERROR) {
    // LIS3DSH wurde nicht gefunden
    // rote und grüne LED einschalten
    UB_Led_On(LED_RED);
    UB_Led_On(LED_GREEN);
    // STOP
    while(1);
  }
 
  while(1)
  {
    // LIS3DSH auslesen
    UB_LIS3DSH_Read();
    // wenn Platine nach links geneigt wird, rote LED einschalten
    if(LIS3DSH.y_achse>250) UB_Led_On(LED_RED); else UB_Led_Off(LED_RED);
    // wenn Platine nach rechts geneigt wird, gruene LED einschalten
    if(LIS3DSH.y_achse<-250) UB_Led_On(LED_GREEN); else UB_Led_Off(LED_GREEN); // wenn Platine nach hinten geneigt wird, blaue LED einschalten if(LIS3DSH.x_achse>250) UB_Led_On(LED_BLUE); else UB_Led_Off(LED_BLUE);
    // wenn Platine nach vorne geneigt wird, orange LED einschalten
    if(LIS3DSH.x_achse<-250) UB_Led_On(LED_ORANGE); else UB_Led_Off(LED_ORANGE);
  }
}

Hier die Library zum Download :

ub_stm32f4_spi_lis3dsh_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_84_SPI_LIS3DSH


7 Antworten auf 84-SPI_LIS3DSH-Library (STM32F4)

  1. Michael Schulze sagt:

    Habe es eben auf mein Discovery getestet, und es läuft super. Danke!

    • admin_ub sagt:

      Gut zu wissen, Danke für den Test.

  2. Borkenkäfer sagt:

    Hallo, habe auch CooCox installiert, nachdem ich mit eclipse noch nicht 100%ig klaar komme. Sind doch noch zu viele Parameter, fürs erste.
    Bei den LED’s waren bei mir die X und Y Richtungen vertauscht. Habe das bei mir abgeändert.
    Klasse Seite

  3. so sieht jetzt mein Code in main.h ab Zeile 44 (Damit leuchtet immer die tiefste LED :-) )

    while(1)
    {
    // LIS3DSH auslesen
    UB_LIS3DSH_Read();
    // wenn Platine nach links geneigt wird, rote LED einschalten
    if(LIS3DSH.x_achse>250) UB_Led_On(LED_RED); else UB_Led_Off(LED_RED);
    // wenn Platine nach rechts geneigt wird, gruene LED einschalten
    if(LIS3DSH.x_achse250) UB_Led_On(LED_ORANGE); else UB_Led_Off(LED_ORANGE);
    // wenn Platine nach vorne geneigt wird, blaue LED einschalten
    if(LIS3DSH.y_achse<-250) UB_Led_On(LED_BLUE); else UB_Led_Off(LED_BLUE);
    }
    }

  4. Trambulin sagt:

    These libraries helped me pass my exam.
    Thank you very much!!

  5. Christian Alpin sagt:

    Moin, ich schreibe auch grad an einer Lib für den LIS3DSH, basierend auf der für den LIS302DL.
    Mit dem “alten” LIS302DL scheint es möglich zu sein mit einem Aufruf mehrere Bytes auf einmal auszulesen (bit1 MS-bit). Ist das mit dem LIS3DSH nicht mehr möglich? Das Datenblatt beschreibt das MS-bit nicht, obwohl es in der Abbildung im Datenblatt des Sensors vorhanden ist. Außerdem gibt es in CTRL-REG6 das ADD-INC bit, das für multi byte read/write bestimmt zu sein scheint. Wie teile ich dem Sensor aber mit, dass ich multi byte read/write nutzen möchte?
    Beste Grüße!

    • admin_ub sagt:

      es gibt das Bit “ADD_INC” im “CTRL_REG6″ zum einstellen…steht alles im Datasheet.


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert