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 :
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 :
Hier der komplette CooCox-Projektordner zum Download :
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?
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.
Hmmm. Der fliegt bei der Überprüfung der ID raus…
Ich habe jetzt mal die überprüfung der ID rausgeschmissen -> es funktioniert!
Danke!
Wow, vielen Dank für die tollen Anleitungen und Libraries )
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!!
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.