Wer einen externen 3Achs-Beschleunigungs-Sensor vom Typ BMA180 an
den STM32F4 anschließen will, kann diese Library hier benutzen.
Der Sensor hat 14bit Genauigkeit und eine umschaltbare Auflösung von
+/- 1G bis +/- 16G
Die Library ist wieder so einfach wie möglich gehalten (ohne Interrupts)
und kommt mit zwei Funktionen aus.
1. = BMA180_Init (initialisiert den Sensot mit der gewünschten Auflösung)
2. = BMA180_Read (ließt die Sensordaten und übergibt sie als Struktur)
Hinweis : mein Sensor liefert bei Einstellungen > 2G sehr ungenaue Werte.
Diese sind um einen Offset verschoben. Bin mir nicht sicher ob das an meiner
Software oder am Sensor liegt.
Ich habe den Sensor an SPI4 angeschlossen aus dem Grund wird diese
Library noch zusätzlich benötigt.
Benutzte Pins :
1 2 3 4 | PB2 = ChipSelect PE2 = CLK PE5 = MISO (SDO) PE6 = MOSI (SDI) |
Enumerationen :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | typedef enum { SCALE_1G =0, // Auflösung +/- 1g SCALE_1G5, // Auflösung +/- 1,5g SCALE_2G, // Auflösung +/- 2g SCALE_3G, // Auflösung +/- 3g SCALE_4G, // Auflösung +/- 4g SCALE_8G, // Auflösung +/- 8g SCALE_16G // Auflösung +/- 16g }BMA180_SCALE_t; : typedef enum { FILTER_10Hz =0, // Filter (10 Hz) FILTER_20Hz, // Filter (20 Hz) FILTER_40Hz, // Filter (40 Hz) FILTER_75Hz, // Filter (75 Hz) FILTER_150Hz, // Filter (150 Hz) FILTER_300Hz, // Filter (300 Hz) FILTER_600Hz, // Filter (600 Hz) FILTER_1200Hz, // Filter (1200 Hz) [default] FILTER_HIGH_1Hz, // Filter (High Pass 1Hz) FILTER_BAND_PASS // Filter (Band Pass) }BMA180_FILTER_t; |
Struktur :
1 2 3 4 5 6 7 | typedef struct { int16_t x_achse; // Beschl. der X-Achse (in +/- mg) int16_t y_achse; // Beschl. der Y-Achse (in +/- mg) int16_t z_achse; // Beschl. der Z-Achse (in +/- mg) int16_t temperatur; // Temperatur (in +/- °C) }BMA180_t; BMA180_t BMA180; |
Funktionen :
1 2 3 | ErrorStatus UB_BMA180_Init(BMA180_SCALE_t scale); // zum init vom Sensor void UB_BMA180_Read(void); // zum auslesen vom Sensor void UB_BMA180_SetFilter(BMA180_FILTER_t filter); // zum einstellen vom Filter |
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | //-------------------------------------------------------------- // File : main.c // Datum : 28.09.2014 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F429 // IDE : CooCox CoIDE 1.7.4 // GCC : 4.7 2012q4 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der BMA180-Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" // In Configuration diese Define hinzufügen : // "STM32F429_439xx" , "__ASSEMBLY__" , "USE_STDPERIPH_DRIVER" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_lcd_ili9341.h" #include "stm32_ub_font.h" #include "stm32_ub_bma180.h" #include <stdio.h> void Delay(volatile uint32_t nCount) { while(nCount--) { } } int main(void) { ErrorStatus check; int16_t x,y,z,t; char buf[30]; SystemInit(); // Quarz Einstellungen aktivieren // Init vom LCD UB_LCD_Init(); // Init der Layer UB_LCD_LayerInit_Fullscreen(); // auf Hintergrund schalten UB_LCD_SetLayer_1(); // Hintergrund komplett mit einer Farbe füllen UB_LCD_FillLayer(RGB_COL_WHITE); // auf Vordergrund schalten UB_LCD_SetLayer_2(); // Vordergrund komplett mit einer Farbe füllen UB_LCD_FillLayer(RGB_COL_GREEN); UB_LCD_Rotate_180(); // Ueberschrift UB_Font_DrawString(10,10,"Demo_25 : ",&Arial_11x18,RGB_COL_WHITE,RGB_COL_RED); UB_Font_DrawString(10,30,"AccSens. BMA180",&Arial_11x18,RGB_COL_WHITE,RGB_COL_RED); // init vom BMA180-Sensor check=UB_BMA180_Init(SCALE_2G); if(check==ERROR) { UB_Font_DrawString(10,70,"Error",&Arial_11x18,RGB_COL_WHITE,RGB_COL_RED); while(1); } while(1) { // Sensorwerte einlesen UB_BMA180_Read(); // X-Achse anzeigen x=BMA180.x_achse; sprintf(buf,"X=%d ",x); UB_Font_DrawString(10,90,buf,&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN); // Y-Achse anzeigen y=BMA180.y_achse; sprintf(buf,"Y=%d ",y); UB_Font_DrawString(10,110,buf,&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN); // Z-Achse anzeigen z=BMA180.z_achse; sprintf(buf,"Z=%d ",z); UB_Font_DrawString(10,130,buf,&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN); // Temperatur anzeigen t=BMA180.temperatur; sprintf(buf,"T=%d ",t); UB_Font_DrawString(10,150,buf,&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN); Delay(5000000); } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :