25-SPI_BMA180-Library (STM32F429)

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 :

bma180_f429_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_F429_25


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