17-SPI_LIS302DL-Library (STM32F4)

Auf dem Discovery-Board ist ein 3Achs-Beschleunigungs-Sensor eingebaut (LIS302DL)

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

Mit diesem Sensor können die Beschleunigungskräfte der X-, Y-, Z-Achse gemessen werden.

Der Sensor hat eine Genauigkeit von 8bit und eine umschaltbare Auflösung von entweder +/- 2g oder +/- 8g

Mit dieser Library kann der Sensor sehr leicht benutzt werden. Man ruft einfach die Funktion “UB_LIS302_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 LIS302DL liegt an PE3 (nicht wie beschrieben an PE2)

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

Beispielbild :

lis302

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
typedef enum {
  SCALE_2G =0,    // Auflösung +/- 2g
  SCALE_8G        // Auflösung +/- 8g
}LIS302_SCALE_t;

.

1
2
3
4
5
6
7
typedef enum {
  FILTER_OFF =0,  // High-Pass Filter abgeschaltet
  FILTER_2Hz,     // Filter eingeschaltet (2 Hz)
  FILTER_1Hz,     // Filter eingeschaltet (1 Hz)
  FILTER_500mHz,  // Filter eingeschaltet (0,5 Hz)
  FILTER_250mHz   // Filter eingeschaltet (0,25 Hz) 
}LIS302_FILTER_t;

Funktionen :

1
2
3
ErrorStatus UB_LIS302_Init(LIS302_SCALE_t scale);  // zum initialisieren des LIS302DL
void UB_LIS302_Read(void);                         // zum auslesen der Beschleunigungswerte
void UB_LIS302_SetFilter(LIS302_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
54
//--------------------------------------------------------------
// File     : main.c
// Datum    : 06.03.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.0
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der LIS302DL Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_lis302dl.h"
#include "stm32_ub_led.h"
 
int main(void)
{
  ErrorStatus check;
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  UB_Led_Init(); // LEDs initialisieren
 
  // LIS302 initialisieren (mit +/- 2G Auflösung)
  check=UB_LIS302_Init(SCALE_2G);
 
  if(check==ERROR) {
    // LIS302 wurde nicht gefunden
    // rote und grüne LED einschalten
    UB_Led_On(LED_RED);
    UB_Led_On(LED_GREEN);
    // STOP
    while(1);
  }
 
  while(1)
  {
    // LIS302 auslesen
    UB_LIS302_Read();
    // wenn Platine nach links geneigt wird, rote LED einschalten
    if(LIS302.y_achse>250) UB_Led_On(LED_RED); else UB_Led_Off(LED_RED);
    // wenn Platine nach rechts geneigt wird, gruene LED einschalten
    if(LIS302.y_achse<-250) UB_Led_On(LED_GREEN); else UB_Led_Off(LED_GREEN);
    // wenn Platine nach hinten geneigt wird, blaue LED einschalten
    if(LIS302.x_achse>250) UB_Led_On(LED_BLUE); else UB_Led_Off(LED_BLUE);
    // wenn Platine nach vorne geneigt wird, orange LED einschalten
    if(LIS302.x_achse<-250) UB_Led_On(LED_ORANGE); else UB_Led_Off(LED_ORANGE);
  }
}

Hier die Library zum Download :

ub_stm32f4_spi_lis302dl_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_17_SPI_LIS302DL

7 Antworten auf 17-SPI_LIS302DL-Library (STM32F4)

  1. DjElko sagt:

    Danke für Deine libs!!!
    Echt spitze!

    Bei dieser lib erkennt der STM32F4 allerdings meinen Beschleunigungschip nicht
    (rote + grüne Led leuchten)…
    Woran könnte das liegen?

    • admin_ub sagt:

      etnweder hast du die SPI-1 schon in einem anderen Mode initialisiert (das wird geprüft) oder dein LIS302 liefert eine andere Kennung als “0x3B” zurück. Setzt mal einen Breakpoint an den Anfang der Init-Funktion und geht die Schritt für Schritt durch, dann siehst du wo und warum er rausfliegt.

  2. DjElko sagt:

    Hmmm. Der fliegt bei der Überprüfung der ID raus…

  3. DjElko sagt:

    Ich habe jetzt mal die überprüfung der ID rausgeschmissen -> es funktioniert!
    Danke!

  4. Joe sagt:

    Wow, vielen Dank für die tollen Anleitungen und Libraries :-) )

  5. dar sagt:

    Hi,
    You have made the greatest libraries!!!

    one feed back I would like to give:

    the newer Discovery boards have the LIS3DSH accelerometer (revision C with MMB997C on them) this accelerometer has 0X3F for the Who_Am_I (register 0F) byte.

    So, just change the #define LIS302_ID to 0X3F in the stm32_ub_lis302dl.h
    it all works perfect.

    keep up the good work!!

    • admin_ub sagt:

      Thanks for the hint. The LIS3DSH is a little bit different in the register settings so i have made a new library. Please check the new LIS3DSH-Lib. I cant test it by my own.


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