LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

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

Do pobrania

Autor: Jan Szemiet