ZL31ARM: wskaźnik przyspieszenia 3D z czujnikiem MEMS LIS35
Istotną czynnością jest zbadanie poprawność wskazań czujnika i w razie potrzeby wprowadzenie korekty, gdyż w czasie wykonywania danego projektu stwierdzono niezgodności w otrzymywanych wartościach mierzonego przyśpieszenia g w jednej osi w obu kierunkach, np. w przypadku osi Y pomiar w jednym kierunku dał wartość -62, a w drugim 49. Ta rozbieżność w wartościach również ma wpływ na wskazywaną wartość (różną od zera) mierzoną w osi równoległej do powierzchni Ziemi. Wartość korekty, którą należy dodać do otrzymanego pomiaru przyśpieszenia, jest równa wartości jaką uzyskuje się w czasie pomiaru przyśpieszenia 0g ze znakiem minus ‘-‘, tzn. w przypadku równoległego ustawienia do powierzchni Ziemi mierzonej aktualnie osi. Kalibrację układu pomiarowego można ułatwić stosując poniższy kod w miejscu oznaczonym (***KOREKTA***) w poniższym kodzie:
if(GPIO_ReadInputDataBit(JOY_PORT_OK, JOY_OK) == 0){
++STATE; //Kazde kolejne nacisniecie przycisku OK to zmiana stanu
if(STATE > 6) STATE = 0;
switch(STATE){
case 0:{
LCDPutChar('X',120, 35, 0, 0xFFF, 0x000);
LCDPutChar('Y',120, 65, 0, 0xFFF, 0x000);
drawRectangle(90-66,120-66,106-66,129-66,0x000,1); //Czarne tlo
LCDPutChar('Z',120, 95, 0, 0xFFF, 0x000);
break;
}
case 1:{
drawRectangle(30-66,120-66,46-66,129-66,0xFFF,1); //Biale tlo
LCDPutChar('X',120, 35, 0, 0xF00, 0xFFF); //X - czerwony/pozycjonowanie ukladu
break;
}
case 2:{
xKor = -x; //Korekta wskazan w osi X
drawRectangle(30-66,120-66,46-66,129-66,0x00F,1); //Zielone tlo
LCDPutChar('X',120, 35, 0, 0x000, 0x0F0); //X - czarny/zapisano korekte
break;
}
case 3:{
drawRectangle(30-66,120-66,46-66,129-66,0x000,1); //Czarne tlo
LCDPutChar('X',120, 35, 0, 0xFFF, 0x000); //X - bialy/poprawka zastosowana
drawRectangle(60-66,120-66,76-66,129-66,0xFFF,1); //Biale tlo
LCDPutChar('Y',120, 65, 0, 0xF00, 0xFFF); //Y - czerwony/pozycjonowanie ukladu
break;
}
case 4:{
yKor = -y; //Korekta wskazan w osi Y
drawRectangle(60-66,120-66,76-66,129-66,0x00F,1); //Zielone tlo
LCDPutChar('Y',120, 65, 0, 0x000, 0x0F0); //Y - czarny/zapisano korekte
break;
}
case 5:{
drawRectangle(60-66,120-66,76-66,129-66,0x000,1); //Czarne tlo
LCDPutChar('Y',120, 65, 0, 0xFFF, 0x000); //Y - bialy/poprawka zastosowana
drawRectangle(90-66,120-66,106-66,129-66,0xFFF,1); //Biale tlo
LCDPutChar('Z',120, 95, 0, 0xF00, 0xFFF); //Z - czerwony/pozycjonowanie ukladu
break;
}
case 6:{
zKor = -z; //Korekta wskazan w osi Z
drawRectangle(90-66,120-66,106-66,129-66,0x00F,1); //Zielone tlo
LCDPutChar('Z',120, 95, 0, 0x000, 0x0F0); //Z - czarny/zapisano korekte
break;
}
}
while(GPIO_ReadInputDataBit(JOY_PORT_OK,JOY_OK) == 0);//Czekaj na odpuszczenie przycisku
}
Jak widać proces naniesienia poprawek sprowadza się do wciśnięcia przycisku OK aby nazwa aktualnie kalibrowanej osi przyjęła kolor czerwony na białym tle, ustawienia kalibrowanej osi modułu KAmodMEMS2 w pozycji równoległej do powierzchni Ziemi oraz ponownego wciśnięcia przycisku OK w celu zatwierdzenia poprawki (nazwa zmodyfikowanej osi przybiera kolor czarny na zielonym tle). Ten proces powtarza się dla wszystkich trzech osi, a zakończenie kalibracji jest uwidaczniane białym kolorem wszystkich nazw osi. Innym sposobem naniesienia korekty może być przeprowadzenie stosownych pomiarów i podanie na stałe wartości, np.:
//Korekta = -(wartosc odczytana przy polozeniu poziomym) #define xKor 0 #define yKor 7 #define zKor 4
Funkcje pomocne
Poniżej przedstawiono kody niektórych funkcji wykorzystywanych w programie:
//Funkcja pozwalajaca ustawic kontrast za pomoca przyciskow UP i DOWN
//Zatwierdzenie ustawienia za pomoca przycisku OK
void adjustContrast(){
signed char contrast=0;
//Ustawienie kontrastu (przyciski UP i DOWN), potwierdzenie (przycisk OK)
while(GPIO_ReadInputDataBit(JOY_PORT_OK, JOY_OK) == 1){
Delay(0xFFFF);
if(GPIO_ReadInputDataBit(JOY_PORT, JOY_UP) == 0)
SetContrast(contrast == 63 ? contrast : ++contrast);
else if(GPIO_ReadInputDataBit(JOY_PORT, JOY_DOWN) == 0)
SetContrast(contrast == -64 ? contrast : --contrast);
}
}
//Funkcja konwertujaca liczbe 7-bitowa (od -128 do 127) ze znakiem na ciag typu String
void sChar2Str(char *pStr, signed char value){
//Ilosc rozrzadow konwertowanej liczby (bez uwzgledniania znaku)
unsigned char charCount=3;
//Jezeli wartosc jest ujemna to zapisz znak '-'
if(value < 0)
*pStr = '-';
else
*pStr = ' ';
//Ustaw wskaznik na adres komorki zawierajacej najmlodszy rozrzad liczby
pStr = pStr + charCount;
//Konwertuj liczbe; jednosci, dziesiatki, setki
do{
*pStr-- = abs(value % 10) + '0';
value /= 10;
} while(--charCount);
}
//Funkcja ustawiajaca kolor kulki
//Wykorzystywana w przerywaniu
void setBallColor(unsigned int ballColor){
ball_color = ballColor;
}

Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



