LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

ZL31ARM: wskaźnik przyspieszenia 3D z czujnikiem MEMS LIS35

 

Fot. 7. Powiązanie osi kierunków z czujnikiem MEMS

Fot. 7. Powiązanie osi kierunków z czujnikiem MEMS

 

 

Poniższy kod nie powinien sprawić problemów w zrozumieniu, ale niektóre fragmenty mogą wymagać komentarzy. Funkcja sChar2Str() konwertuje liczbę w tekst i przyjmuje wskaźnik do ciągu znaków typu char (do którego zostanie zapisana liczba w postaci symboli) oraz wartość liczbową typu signed char. Podczas wyznaczania wysokości słupków występuje podzielenie zmierzonej wartości przez 60 i pomnożenie przez 49 – pierwsza wartość została w przybliżeniu wybrana jako maksymalna mierzona statycznie, a druga określa maksymalną wysokość słupka od linii odniesienia.

signed char x, y, z , xKor=0, yKor=0, zKor=0;

void indicator(){
  unsigned int j;
  signed int x_temp, y_temp, z_temp;
  unsigned char STATE = 0;

  //Rysowanie ramek
  drawRectangle(-40, -50, -20, 50,  RED, 0);
  drawRectangle(-10, -50,  10, 50, BLUE, 0);
  drawRectangle( 20, -50,  40, 50,GREEN, 0);

  //Rysowanie linii odniesienia
  drawLine(-66,0,66,0,WHITE);

  //Wyświetlenie oznaczeń osi
  LCDPutChar('X',120, 35, 0, 0xFFF, 0x00);
  LCDPutChar('Y',120, 65, 0, 0xFFF, 0x00);
  LCDPutChar('Z',120, 95, 0, 0xFFF, 0x00);

  while(1){
    //Odczyt wartości przyśpieszeń
    LIS35_GetPosition(&x, &y, &z);

    //Korekta wskazan akcelerometru
    x+=xKor;
    y+=yKor;
    z+=zKor;

    sChar2Str(tempCHAR, x);//Konwersja wartości przyśpieszenia w osi x na ciąg typu String
    for (j=0; j < 4; j++)	//Wyświetlenie znaków ciągu
      LCDPutChar(tempCHAR[j], 0, 20+j*7, 0, 0xFFF, 0x00);

    sChar2Str(tempCHAR, y);
    for (j=0; j < 4; j++)
      LCDPutChar(tempCHAR[j],  0, 50+j*7, 0, 0xFFF, 0x00);

    sChar2Str(tempCHAR, z);
    for (j=0; j < 4; j++)
      LCDPutChar(tempCHAR[j],  0, 80+j*7, 0, 0xFFF, 0x00);

    //(***KOREKTA***)

    x_temp = (signed int) (( (float) x/60)*49);		//Wyznaczenie wysokości słupka
    if(abs(x_temp) > 49) x_temp = (x_temp < 0) ? -49:49;	//Ograniczenie wysokości słupka

    y_temp = (signed int) (( (float) y/60)*49);		
    if(abs(y_temp) > 49) y_temp = (y_temp < 0) ? -49 : 49 ;

    z_temp = (signed int) (( (float) z/60)*49);
    if(abs(z_temp) > 49) z_temp = (z_temp < 0) ? -49 : 49 ;

    //Rysowanie słupków przyśpieszenia
    drawRectangle(-38,   0, -21, x_temp,  RED, 1);
    drawRectangle( -8,   0,   9, y_temp, BLUE, 1);
    drawRectangle( 22,   0,  39, z_temp,GREEN, 1);

    Delay(0x6FFFFF);	//Ustawienie okresu aktualizacji obrazu

    //Czyszczenie narysowanych słupków
    drawRectangle(-38,   0, -21, x_temp, 0x000, 1);
    drawRectangle( -8,   0,   9, y_temp, 0x000, 1);
    drawRectangle( 22,   0,  39, z_temp, 0x000, 1);

    if(GPIO_ReadInputDataBit(JOY_PORT, JOY_RIGHT) == 0) break;	//Zakonczenie dzialania
  }
}
Autor: Jan Szemiet