You are on page 1of 7

Piotr Poskart

Projekt PAS WICZENIE 8


Wprowadzenie do programowania mikrokontrolerw
Temat wasny: Obsuga akcelerometru obrbka danych i
wizualizacja wynikw za pomoc diod LED i wywietlacza
LCD

1. Wyposaenie i opis dziaania ukadu:


a) Wyposaenie ukadu obsugi akcelerometru:
- pytka ewaluacyjna STM32F4 Discovery firmy ST Microelectronics w skad ktrej wchodzi:

mikrokontroler STM32F4 (32-bitowy, czstotliwo taktowania rdzenia 168 Mhz, 80


wej/wyj cyfrowych I/O, liczne ukady peryferyjne)
3-osiowy akcelerometr LIS302DL (rozdzielczo: 8 bitw na kady kierunek
pomiaru, zakres pomiarowy: +/- 2.3 g lub +/- 9.2 g w zalenoci od konfiguracji)
4 diody LED (pomaraczowa, czerwona, niebieska, zielona)
microswitch monostabilny (typu momentary pushbutton)
wszystkie wejcia/wyjcia mikrokontrolera s wyprowadzone do wygodnego
podczania dodatkowych ukadw za pomoc zczy typu goldpin
wiele innych ukadw, niewykorzystywanych w tym projekcie

- wywietlacz LCD 1602 ze sterownikiem HD44780


- ukad scalony - stabilizator napicia (+5V) LM7805
- rezystory ograniczajce prd przy zasilaniu wywietlacza LCD
- kondensatory filtrujce i wygadzajce przebieg napicia wejciowego i wyjciowego
- pytka stykowa
- przewody czce poszczeglne ukady
b) Opis dziaania:
Akcelerometr jest ukadem scalonym o przekroju prostokta i jest zamontowany na pytce
ewaluacyjnej tak, e jego o symetrii wzdu duszego boku (x) pokrywa si z osi symetrii wzdu
duszego boku pytki. O y, prostopada do niej, jest natomiast rwnolega do krtszego boku
pytki. W ten sposb mona otrzyma dane na temat przyspieszenia pytki na kierunkach x,y,z
zwizanych z ukadem akcelerometru. W tym projekcie dane z akcelerometru s przetwarzane i
wykorzystywane na 2 sposoby : do odczytu kta pochylenia pytki wzgldem ukadu

bezwzgldnego (podoa) oraz wzgldem pooenia pocztkowego. Kt nachylenia pytki


wzgldem ukadu globalnego mona obliczy znajc warto przyspieszenia ziemskiego oraz
majc aktualn warto przyspieszenia przy danym pochyleniu (aX) ze wzoru (Rys. 1):
a
= arcsin x
g

( )

Rys. 1
Obliczanie kta w programie sterujcym ukadem odbywa si analogicznie do powyszego wzoru z
t rnic, e wartoci aX i g s przeskalowane na wartoci odczytane z akcelerometru.
Warto kta nachylenia pytki na kierunkach X i Y jest zamieniana na warto w stopniach i
wywietlana na ekranie LCD w postaci komunikatu (np.) :
Pochylenie:
X:30 Y:25 (deg)
Dodatkowo program informuje uytkownika o pochyleniu w kierunku osi x i y poprzez zapalenie
si odpowiedniej diody LED (D1 - D4) z okrelon jasnoci wiecenia. Diody te s rozmieszczone
wok akcelerometru w sposb pokazany na poniszym schemacie:

Rozmieszczenie diod i akcelerometru na pytce

Stopie pochylenia pytki sygnalizowany przez jasno wiecenia diod jest w tym przypadku
pochyleniem wzgldnym, mierzonym w zalenoci od wstpnej orientacji pytki. Jeeli podczas
uruchomienia programu (RESETU mikrokontrolera np. za pomoc przycisku microswitch) pytka
bya wstpnie pochylona wzgldem podoa, to pooenie to przyjmowane jest za pocztkowe i
diody informuj o stopniu odchylenia pytki od tego wanie pooenia.

2. Obsuga poszczeglnych elementw ukadu


Informacje oglne:
Program na mikrokontroler STM32F4, ktry steruje poszczeglnymi ukadami jest napisany w
jzyku C oraz skompilowany i wgrany do pamici flash uC za pomoc rodowiska
programistycznego Atollic TrueSTUDIO. W projekcie wykorzystywane s standardowe biblioteki
jzyka C (np. stdlib.h, math.h) oraz biblioteki firmowe przygotowane przez producenta
mikrokontrolera ST Microelectronics Standard Peripherial Library.
Funkcje konfigurujce poszczeglne ukady i obsugujce je s zdefiniowane w plikach funkcje.c
oraz lcd.c a ich prototypy umieszczone s w plikach nagwkowych funkcje.h oraz lcd.h.
Program gwny zawiera funkcja main.h.
a) Konfiguracja podstawowych ukadw mikrokontrolera
- ustawienie sygnau zegarowego dla rdzenia i ukadw peryferyjnych: Jest realizowane za pomoc
funkcji void RCC_Conf(void). Nastpuje w niej m.in. ustawienie rda taktowania z
zewntrznego rezonatora, ustawienie mnonikw i dzielnikw czstotliwoci rdzenia i
poszczeglnych ukadw uC, zresetowanie sygnau zegarowego oraz wczenie taktowania dla
wybranych ukadw wykorzystywanych w projekcie.
- konfiguracja licznika SysTick: Realizowana jest za pomoc funkcji void SysTick_Conf(void).
Jest w niej ustawione rdo sygnau zegarowego dla ukadu SysTick oraz dzielnik czstotliwoci.
SysTick jest licznikiem uywanym do odmierzania czasu w programie, wykorzystuje go funkcja
odpowiedzialna za odwieanie wywietlacza LCD.
b) Obsuga akcelerometru
Akcelerometr LIS302DL jest ukadem cyfrowym, ktry ma moliwo komunikacji z
mikrokontrolerem za pomoc interfejsu szeregowego SPI lub I2C. W tym projekcie komunikacja
odbywa si poprzez SPI. Do komunikacji su 4 wyjcia ukadu LIS302DL:
- SCK linia zegarowa, synchronizujca oba ukady
- MISO (master input slave output) transmisja danych z akcelerometru do uC
- MOSI (master output slave input) transmisja danych z uC do akcelerometru
- nSS linia ktrej stan zamyka/otwiera transmisj danych
Poszczeglne wyjcia ukadu LIS302DL s poczone z odpowiednimi wejciami uC, takimi, ktre
obsuguj komunikacj poprzez SPI (SCK wejcie PA5, MOSI PA7, MISO PA6, nSS PE3).
Funkcja void SPI_Config(void) przygotowuje uklad SPI mikrokontrolera do pracy. W tym celu
wykonuje m.in. :
- konfiguracja odpowiednich pinw na odpowiednich portach uC : ustawienie pinw w tryb funkcji
alternatywnych (PA5, PA6, PA7) lub jako zwyke wyjcie cyfrowe (PE3), ustawienie czstotliwoci

taktowania odpowiednich wyj (50 Mhz), ustawienie typu wyjcia (Push-Pull/ Open Drain),
ustawienie wewntrznych rezystorw podcigajcych
-konfiguracja ukadu SPI poprzez ustawienie odpowiednich bitw w rejestrach SPI: ustawienie
szybkoci transmisji, ustawienie trybu pracy (master/slave), ustawienie polaryzacji sygnau
zegarowego oraz reakcji na odpowiednie zbocze.
Koleje funkcje do obsugi ukadu SPI i akcelerometru s napisane wedug dokumentacji technicznej
ukadu SPI w uC oraz wedug dokumentacji ukadu LIS302DL i realizuj odpowiednio:
- funkcja char SPI_Transmit(char Data) transmisja jednego bajtu do ukadu podrzdnego
(LIS302DL) oraz odbir 1 bajtu danych.
- void LIS35_ReadRegister(char addr,char * v) zczytanie danych z rejestru addr ukadu
podrzdnego
- void LIS35_WriteRegister(char addr, char v) - zapisanie danych z tablicy (v) do rejestru addr
akcelerometru
- void LIS35_RebootMemory() - zresetowanie pamici flash ukadu LIS302DL
- char LIS35_SPI_Init(void) konfiguracja akcelerometru do pracy ( zresetowanie pamici,
aktywowanie pomiarw na poszczeglnych osiach, wybr zakresu pomiaru itp.)
- void LIS35_GetPosition(signed char * x, signed char * y, signed char * z) funkcja
zwracajca do zmiennych x,y,z aktualne wartoci zmierzonego przyspieszenia na poszczeglnych
osiach
c) Obsuga wywietlacza LCD
Zastosowany wywietlacz LCD 1602 posiada 16 wej 5 do zasilania sterownika i wywietlacza i
11 sterujcych. Ze wzgldu na oszczdno pinw uC czsto stosuje si tylko 7 wej sterujcych
(tzw. tryb czterobitowy), tak te jest w tym przypadku. Linie danych DB0-DB3 pozostaj wolne,
reszta

Wejcia 2 i 15 s dodatnimi wejciami zasilajcymi, wejcia 1 i 16 podczone s do potencjau

niskiego a wejcie 3 VO suy do regulowania kontrastu w wywietlaczu. Wejcie RS okrela czy


na liniach Dbx wystawiana jest komenda sterujca przeznaczona dla sterownika (RS = 0) czy dane
(kod znaku) do wywietlenia (RS = 1). Linia RW okrela kierunek transmisji (0 -zapis, 1 odczyt) a
linia E steruje wysyaniem danych (przed ich wysaniem musi by ustawiona w stan wysoki). Na
wyjciach DB4-DB7 przesyane s dane dla sterownika. Wszystkie 7 wej sterujcych jest
podczone z odpowiednimi pinami uC. Przypisanie to znajduje si w pliku nagwkowym lcd.h.
Natomiast wejcia zasilania i regulacji kontrastu podczone s do odpowiednich zaciskw zasilania
na pytce stykowej.
Funkcje obsugujce wywietlacz LCD:
- Programowa obsuga wywietlacza rozpoczyna si poprzez konfiguracj odpowiednich pinw
uC. Nastpuje to w funkcji LCD_Init(void) odpowiednie piny ustawiane s w niej jako
wyjcia typu push-pull, taktowane z czstotliwoci 50 MHz, wczeniej jeszcze nastpuje
wczenie zagara dla caego portu. Funkcja LCD_Init poza konfiguracj wyj uC nawizuje
poczenie ze sterownikiem wywietlacza oraz konfiguruje tryb pracy za pomoc wysania do
niego odpowiednich bajtw komend.
- void LCD_SendByte(uint8_t cmd) funkcja wysyajca 1 bajt danych (do
sterownika/wywietlacza w zalenoci od stanu bitu RS przed jej uyciem). Wysanie 1 bajtu
realizowane jest poprzez wysanie najpierw starszej jego czci a potem modszej.
- void LCD_SendCmd(uint8_t cmd) funkcja wysyajca bajt danych do sterownika wywietlacza
- uint8_t LCD_ReadByte(void) funkcja odczytujca bajt danych z wywietlacza. Przed
waciwym odczytem danych funkcja ta zmienia konfiguracj pinw poczonych z wejciami
DB4-DB7 na wejcia w celu umoliwienia odbioru danych. Potem nastpuje ustawienie
odpowiedniej konfiguracji linii RS, RW i E i odbir najpierw starszej a potem modszej czci bajtu
ze sterownika. Na kocu linie DB4-DB7 ustawiane s z powrotem jako wyjcia uC.
- void LCD_SendData(uint8_t data) funkcja wysyajca bajt danych do wywietlenia
- void LCD_SendText(uint8_t *text) - funkcja wysyajca tablic znakw do wywietlenia
- void LCD_Clear(void) funkcja czyszczca zawarto wywietlacza
- void LCD_GoTo(uint8_t
wiersza/kolumny

wers,

uint8_t

kol)

funkcja przechodzenia do danego

- void delay_ms(int ms)


i
void delay_us(int us)
- funkcje opniajce program o
okrelon jednostk czasu, wykorzystywane przy konfiguracji LCD np. w funkcjii LCD_Init, gdzie
wymagane s okrelone odstpy czasowe pomidzy wysyanymi komandami.

d) Obsuga diod LED


Diody LED s bezporednio poczone przez odpowiednie rezystory z wyprowadzeniami uC
(PD12, PD13, PD14, PD15). Piny te s rwnie wyjciami czterech kanaw ukadu licznikowego
TIMER4 na ktre mona podawa sygna PWM sterujc w ten sposb jasnoci ich wiecenia.
Obsuga diod LED zaczyna si tradycyjnie od skonfigurowania odpowiednich pinw a potem
samego ukadu licznikowego. Obsuga timera przed gwn ptl programu (while(1)) sprowadza

si do jego konfiguracji do pracy:


-funkcja void TIM_Config(void) zawiera wczenie taktowania portu do ktrego podczone s
diody oraz timera TIM4. Konfiguruje piny PD12-PD15 jako wyjcia z funkcj alternatywn (TIM4)
w trybie push-pull z podcigniciem do dodatniego potencjau zasilania, taktowane z
czstotliwoci 100Mhz. Ponadto funkcja konfiguruje timer TIM4 ustawia warto preskalera
czstotliwoci rda zegarowego (42 MHz) na 100, ustawia warto, do ktrej zlicza licznik
(1000), tryb pracy PWM, warto wypenienia sygnau PWM oraz wcza poszczeglne kanay
timera.
Dziki takiej konfiguracji wyjcia diod s zasilane impulsami prostoktnymi o regulowanym czasie
wypenienia (PWM) z czstotliwoci okresu f = 420 Hz. Jasno wiecenia poszczeglnych diod
mona zatem regulowa stosunkiem wartoci wysokiej sygnau PWM do caego okresu, wpisujc
do odpowiedniego rejestru x (TIM4->CCRx) warto z zakresu od 0 do 1000.
e) obsuga funkcji przerwania od ukadu SysTick realizuje j funkcja:
void SysTick_Handler(void) gdy wystpi przerwanie od ukadu SysTick (co 1 ms tak wynika
z konfiguracji rda sygnau i preskalera ukadu SysTick) funkcja ta zwiksza warto zewntrznej
zmiennej licznikms co pozwala na odliczania w programie czasu w milisekundach. Czas ten jest
wykorzystywany do odwieania ekranu LCD.

3. Program gwny oraz opis jego dziaania:


#include
#include
#include
#include
#include
#include
#include

"stm32f4xx.h"
"mems2_spi_lib.h"
"stm32f4xx_spi.h"
<stdio.h>
"lcd.h"
"math.h"
"funkcje.h"

//doczenie potrzebnych bibliotek i napisanych funkcji

#define rad_to_deg 57.3

//przelicznik radiana na ilosc stopnii

/*

deklaracje zmiennych

*/

int

alfa = 0,
beta = 0;

//deklaracja zmiennych przychowujcych kat


//nachylenia

float pom1 = 0,
pom2 = 0;

//deklaracja zmiennych pomocn. typu float


//do obliczania arcsin

char wyswietl[16];
//deklaracja tablicy do wyswietlania znakw
extern volatile unsigned long int licznikms;
//***************** --- MAIN
int main(void)
{
RCC_Conf();
TIM_Config();
SPI_Config();
LIS35_SPI_Init();
LCD_Init();
LCD_Clear();
SysTick_Conf();

---

***************//

signed char ax, ay, az, ex, ey, ez;


LIS35_GetPosition(&ex,&ey,&ez);
licznikms=0;

//konfigurcja zegarw uC i ukadw peryf.


//konfiguracja timera 4 (diody)
//konfiguracja ukadu SPI
//konfiguracja akcelerometru
//konfiguracja wywietlacza LCD
//wyczys wyswietlacz
//konfiguracja licznika SysTick
//zmienne przechowujce przysp.
//pomiar przysp. do ustalenia poozenia pocz.
//wyzerowanie licznika czasu

while(1)
{
LIS35_GetPosition(&ax,&ay,&az);
if (licznikms>500)
{
pom1 = (float)ax/55.25;
pom2 = (float)ay/55.25;

//pobranie danych z pomiaru przyspiesze

//co 500 ms wyswietlaj aktualn wartosc przysp. na LCD


//obliczanie argumentu funkcji arcsin //55.25 -wartosc odczytywana z ukadu dla przysp. g //wynika z rozdzielczosci (8b) i zakresu pomiarowego +/- 2.3 g

if(fabs(pom1) >= 1) pom1=1;


if(fabs(pom2) >= 1) pom2=1;
pom1 = asin(pom1);
pom2 = asin(pom2);
alfa = pom1*rad_to_deg;
beta = pom2*rad_to_deg;

//wartosc argumentu arcsin nie moze > 1 - zabezpieczenie


//obliczenie aktualnej wartosci kta w radianach
//przeliczenie radianw na stopnie

sprintf(wyswietl, "X:%d Y:%d (deg)",alfa,beta );


LCD_Clear();
LCD_GoTo(0,0);
LCD_SendText("Pochylenie: ");
LCD_GoTo(1,0);
LCD_SendText((uint8_t*)wyswietl);
}
ax-=ex;
ay-=ey;
az-=ez;

licznikms = 0;

//zapisanie do tablicy wyswietl odpowiednich


//znakw ASCII + zamiana liczb(alfa,beta) na
//znaki ASCII
//czyszczenie LCD
//wyswietlanie informacji o pochyleniu na LCD

//zerowanie licznika milisekund

//korekcja wartosci o poozenie pocztkowe //ta wartos bdzie wyswietlana na diodach

if(ax<0)
{
ax*=-1;
TIM4->CCR2 = 18*ax;
TIM4->CCR4 = 0;
}
else
{

//jezeli przyspieszenie ujemne - zapal diod po jednej


// stronie akcelerometru
//wspczynnik wypenienia musi by >= 0
//gasi diod po przeciwnej stronie akcelerometru
//jezeli przysp. dodatnie to zapal diod po drugiej stronie akc//elerometru a zgas po przeciwnej

TIM4->CCR4 = 18*ax;
TIM4->CCR2 = 0;
}
if(ay<0)
{
ay*=-1;
TIM4->CCR1 = 18*ay;
TIM4->CCR3 = 0;
}
else
{
}
}
}

TIM4->CCR3 = 18*ay;
TIM4->CCR1 = 0;

//os y analogicznie do osi x

You might also like