ADXL335 Accelerometer ile Açı Ölçümü

Başlatan kantirici, 19 Temmuz 2013, 02:09:09

kantirici

Merhaba arkadaşlar. ADXL335 accelerometer ile açı ölçmek istiyorum. Biliyorum sadece acc. ile açı ölçmek sağlıklı değil ama amacım sadece yapmak. ADXl335 analog çıkışlarını okuyup barış samancının sitesindeki fomüllerini uyguluyorum. Datasheetten hassasiyet olarak 0.3 V/g olarak aldım ve aşağıdaki formülden g değerini hesapladım.

[jstex]Rx = ((AdcRx -338)* 5 / 1023) ) / 0.3 =  XX g[/jstex]

Sensör masada yere paralelken x ve y den ham 335 ve z den de 408 değerlerini veriyor. Fakat zeroG değeri olarak vcc/2=338 alıyorum. G değerlerini hesapladıktan sonra açılarıda şu formülle hesaplıyorum;

Axr = arccos(Rx/R)
Ayr = arccos(Ry/R)
[/code]

Sonuç olarak sensör yere parelelken x,y den 90 derece civarı z den ise 4 derece civarı okuyorum.

Sorularıma gelince;
1- Sensör yere paralelken okumam gereken açı değerleri tam olarak nedir? Okuduğum açının sağlamasını tam olarak nasıl yapabilirim.
2- ZeroG değerini sensör paralelken okudugum değerlerimi yoksa vcc/2 mi almalıyım?

xc8  için kullandığım kodlar aşağıdadır.

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "usart.h"

#define _XTAL_FREQ 4000000

void main(void) {

    TRISA=0xFF;
    TRISB=0x00;
    PORTA=0x00;
    PORTB=0x00;

    usart_init();

     int x,y,z;
    signed double hass=0.004887585533,ax,ay,az;
    signed double radyan,r;
    ADCON1=0x84;  
    ADCON0=0x01;  //0b00000001 Fosc/2 ve ADG01 

    while(1){
        x=0;y=0;z=0;ax=0;ay=0;az=0;

        x=AdcOku(0);
        y=AdcOku(1);
        z=AdcOku(2);

        ax=(((x-338)*hass))/0.3;
        ay=(((y-338)*hass))/0.3;
        az=(((z-338)*hass))/0.3;

        printf("Ham Degerler x:%d    y:%d    z:%d    \r\n",x,y,z);
        printf("G degerleri x:%+0.3f    y:%+0.3f    z:%+0.3f    \r\n",ax,ay,az);

        r=((ax*ax)+(ay*ay)+(az*az));
        r=sqrt(r);

        radyan=(ax/r);
        ax=acos(radyan);

        radyan=(ay/r);
        ay=acos(radyan);

        radyan=(az/r);
        az=acos(radyan);

        printf("Acilar: x:%+0.2f    y:%+0.2f    z:%+0.2f   \r\n",(ax*180/M_PI),(ay*180/M_PI),(az*180/M_PI));

        __delay_ms(1000);

    }
}


AsHeS

Alıntı yapılan: kantirici - 19 Temmuz 2013, 02:09:09

Sensör masada yere paralelken x ve y den ham 335 ve z den de 408 değerlerini veriyor. Fakat zeroG değeri olarak vcc/2=338 alıyorum.
Sensör masaya paralelken x ve y eksenine 0g  uygulanır z yönünde ise yaklaşık olarak 1 g o da 408 değerine tekabül ediyor. zeroG dediğiniz durum hangi durum sizin için ? 

kantirici

Evet şu hali ile x ve y sıfır civarı z de 1.1 civarı g değerleri. Bu değerlerden açıya geçince elde etmemiz gereken x y z açıları ne olmalı?

Ben bu halie ile x=92 y= 84 z= 5 civarı okuyorum yukarıdaki program ile.

AsHeS

Alıntı yapılan: kantirici - 19 Temmuz 2013, 03:13:19
Evet şu hali ile x ve y sıfır civarı z de 1.1 civarı g değerleri. Bu değerlerden açıya geçince elde etmemiz gereken x y z açıları ne olmalı?
Ben bu halie ile x=92 y= 84 z= 5 civarı okuyorum yukarıdaki program ile.
Apartman ve masa eğikliğinden dolayı bu açılar sapabilir. Açıyı şöyle ölçebilirsin X=x yönünde gelen g kuvveti olsun; Y=y yönünde gelen g kuvveti olsun ;Z=z yönünde gelen g kuvveti olsun
X açısı =x/((x^2+y^2+z^2)^(1/2)) olur. Yani okuduğunuz değerler doğru.