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; }