ADXL345 ivme sensörü kontrolü

Başlatan kriptolojix, 13 Aralık 2013, 18:04:49

tuthenstein

Lastikçilerin teker değiştirirken kullandığı cihazı biraz incelemek lazım onlarda nasıl bir sistem var acaba.

erdtur

Merhaba ,
Bu ivme sensörleri ölçümü g cinsinden veya mm/s2 cinsinden veriyor.
vibrasyonun birimi mm/s ve frekans.
sensörün g cinsinden veya mm/s2 cinsinden verdiği değeri mm/s ve frekans'a  nasıl çevirebiliriz.


Yazilim

#17
Merhabalar yeni konu açmamak için sorumu bu başlık altına yazıyorum
ADXL345 sensörü ile açı ölçmek istiyorum sensörden ham değerler okuyorum ama bu değerleri standart açı değerlerine çeviremedim bu konuda bilgisi olan arkadaşlar yardım edebilirmi.

Kullandığım dil pic ccs.

     accel_data[0]=adxl345_read(0x32); //Read X axis(LSB)
     accel_data[1]=adxl345_read(0x33); //Read X axis(MSB)
     accel_data[2]=adxl345_read(0x34); //Read Y axis(LSB)
     accel_data[3]=adxl345_read(0x35); //Read Y axis(MSB)
     accel_data[4]=adxl345_read(0x36); //Read Z axis(LSB)
     accel_data[5]=adxl345_read(0x37); //Read Z axis(MSB)

     xaxis=make16(accel_data[1],accel_data[0]);  // okunan ham değerler
     yaxis=make16(accel_data[3],accel_data[2]);
     zaxis=make16(accel_data[5],accel_data[4]);

alikeskinkilic

sensör 10 bit 2 g için ayarlanmışsa 1024 verecek 2 g de  açı için 1 g ölçmen gerekecek yani 512 civarı ofset ayarlamanı yaparsan. yani aşağı yukarı  -256 ile +256 arası çıkış verir açı için tabi üstüne iveme koymazsan map fonksiyonu ile -256 ile +256 arasını - 90 ile +90 yada 0 ile 180 arasına oranlarsan olur
Hep meraktan

Yazilim

pic ccs için bir kod öreneği verebilirmisin.

Epsilon

#20
CCS in kendi forum bölümünde de örnek var. Genel arama sonuçları :
Linki
Kendi Sitesindeki Kod örnekleri
Ekleme:
Bu forum da arama yapmayı unutmayın
Link bu forumdan , CCS ile hazır çalışan örnek var
Linki

alikeskinkilic

Alıntı yapılan: Yazilim - 17 Haziran 2024, 01:06:45pic ccs için bir kod öreneği verebilirmisin.
malesef veremem c bilmiyorum ama map için fonksiyon formülünü veririm eğer hazırda öyle bir fonksiyon yoksa internetten aratırsan rahatça bulursun muhtemelen bir kütüphanede vardır birde ham değerleri okuyabiliyorsan bazı durumlarda çıkış değerleri farklı olabiliyor adxl nin ofset ayarlayarak 0 noktasını kendin kalibre etmelisin ardından sağa sola 90 derece döndürerek en yüksek değeri ve en düşük değeri not ederek map formülünde yerine koymalısın net olarak 256 vermez çoğu durumda
DEG=((ham - fS) * (tE - tS)) / ((fE - fS) + tS)
             map(ham,fS, fE, tS,tE) 
             map(128, -256, 256, 0, 180)
  ham = sensörden okunan değer
  fS  = sensörden ölçtülen min değer
  fE  = sensörden ölçülen max değer
  tS  = istediğin alt değer
  tE  = istediğin üst değer
Hep meraktan

Yazilim

#22
@Epsilon çok örnek varda hemen hepsi ham değerleri okumak ile ilgili ben açı ölçmek istiyorum.

pic ccs de map fonfsiyonu yok sanırım. map benzeri fonksiyon ccs de varmıdır acaba

@alikeskinkilic evet sensörlerden farklı değerler alıyorum ama bu sorun değil sıfırlama işlemini yaparım.
 atan2 fonksiyonu ile açı ölçüyorum ama tek yöne ölçüyor diğer yöne yapamadım belkide ben yanlış bişey yapıyorumdur

sonuc=atan2(yaxis,xaxis)*57.5;

alikeskinkilic

atan2 tanjant için değilmiydi.tam emin değilim açı hesaplanıyor ama iki noktanın  birbirleri ile ilişkisine bakıyor sanırım .x ile y ekseninin birbirleri ile böyle bir ilişkisi yok sanırım senin sistemde ayrı ayrı açı hesaplamak istiyordun. ccs de map yokmu yada benzeri birşey kesin vardır
Hep meraktan

Epsilon

#24
@Yazilim
Hangi PIC ile açı ölçmek istiyorsunuz?
CCS hakkında hiçbirşey bilmiyorum  ama
"Map command(veya map function in CCS  ) diye arattırırsanız Map fonkisyonunu CCS de kullanıldığını görürsünüz
Örnek
 
ekran" border="0

Aşağıdaki Linkte ise Row,Pitch ve ve Yaw diye eksenlerdeki dönmelerden bahsediliyor ve Eğimin nasıl hesaplanacağına dair örnek kodlarda en sonda veriliyor
Linki
Burada da 622 sayfalık CCS Manuali var
Manual

Epsilon

#25
Bu arada bu sayfanın bir önceki sayfada yazılan mesajları okuyun.Ölçmenin mantığı anlatılıyor.
*Benim verdiğim linkteki sayfadaki 1g yerçekimi ivmesi.Sanırım  dikey eksenle yaptığı açının değeriyle orantılı değer üretiyor(Tabi diğer eksenlerlede)
* Bu sensörü kullanmadım tahmin sadece

Yazilim

#26
Yardımcı olan arkadaşlara teşekkür ederim.

biraz uğraştırdı ama sonuç başarılı.
kodları ekliyorum belki başka arkadaşlarada lazım olur.

//----------------------------------------------------------
    accel_data[o]=adxl345_read(0x32); //Read X axis(LSB)
    accel_data[1]=adxl345_read(0x33); //Read X axis(MSB)
    accel_data[2]=adxl345_read(0x34); //Read Y axis(LSB)
    accel_data[3]=adxl345_read(0x35); //Read Y axis(MSB)
    // accel_data[4]=adxl345_read(0x36); //Read Z axis(LSB)
    //accel_data[5]=adxl345_read(0x37); //Read Z axis(MSB)

    xaxis= make16(accel_data[1],accel_data[o]);
    yaxis= make16(accel_data[3],accel_data[2]);
    //zaxis=make16(accel_data[5],accel_data[4]);


      sag=atan2(-yaxis,-xaxis)*57.5;    
      sol=atan2(+yaxis,-xaxis)*57.5;    
      
      
      if(sag!=90)aci=sag;
      if(sol!=90)aci=sol;
//----------------------------------------------------------
        adres(1,1);
        printf(lcd,"SONUC: %02ld",aci);
        delay_ms(200);





alikeskinkilic

#27
hocam map ile kolay yoldan örneklemek varken atan2 ile ölçümde ısrarcısınız anlaşılan sadece öğrenmek için soruyorum ve  bana mantıksız gelen birkaç konu var. birincisi okunan ham değer nasıl oluyor da 0-180 derece arasına dönüşüyor .ikincisi değişkenlerden biri 0 olduğunda atan2 deki bölme işleminin 0 a bölme hatasını vermemesini nasıl sağlıyorsunuz üçüncüsü ise adxl 3 eksenli bir ivme ölçer düz tuttuğunuzda sadece sağa sola çevirdiğinizde örneğin x ekseni üzerinde işlem yapıyorsunuz bu y ekseninin mükemmel şartlarda değerinin değişmemesi anlamına geliyor x ekseninin kaç derece ile döndürüldüğünü bulmak için işin içine neden y eksenini de kattığınızı merak ediyorum sensörü yer çekimine çapraz olarak mı konumlandırıyorsunuz.  birde örneğin
yaxis == 220
xaxis == 0
 sag=atan2(-yaxis,-xaxis)*57.5;    
 sol=atan2(+yaxis,-xaxis)*57.5;
için komutu çalıştırabilirmisiniz sonuç ne çıkıyor ben simule edemiyorum c yok bende
Hep meraktan

mustafa_cmbz


extra bilgi olsun..

@Yazilim hocam adxl345 sensöründen önce mpu6050 ile uğraştınız mı ?

Yazilim

#29
@mustafa_cmbz Hocam bu sensörü kullanmadım ADXL345 yaygın olduğu için kullandım.

@alikeskinkilic Hocam fırsat bulursam map fonkfiyonu ile de denerim.

matematiğimde yazılımımda çok iyi değil yazdıklarımı kesin doğru olarak kabul etmeyin sadece fikir olsun.
yanlışım olursa bilen arkadaşlar düzeltirler bildiğim kadarı ile açıklamaya çalışayım.

atan2 fonksiyonu girilen iki değer arasındaki açıyı veriyor. sonundaki çarpan "57.5" sayısıda çıkan değeri 0-90 aralığına çekiyor.
bu yazılımda atan2 0-180 arası açı vermiyor yada ben yapamadım o yüzden sağa ve sola 0-90 derece olarak ayarladım ve sağ sol olarak
ayrı değişkenlerde olan açı değerini if ile kontrol edip hangisi sonda yani 90 da değil ise onu seçip acı değişkenine atıyorum ordan ekrana.
böylece kesintisiz olarak sağ sol 90 derece toplamda 0-180 derece ölçüyorum.

Bölme hatasını fonksiyon kendisi hallediyor.

Burda sadece 2 eksen kullandım tek eksen kullanırsam mesla yere yatay durduğunu düşünelim sıfır değer alırız bir tarafa yattıkça bu değer
önce hızlıca değişiyor ama sonlara doğru bu değer daha az değişiyor yani demek istediğim şey şu sensörden aldığımız ham değerler
sensörün yere göre olan açısı ile tam orantılı değişmiyor bu yüzden x ve y ekseni kullanınca bu sorun ortadan kalkmış oluyor.
ve bir diğer sebep eğer tam tur yani 360 derece
ölçülecekse zaten mecburen iki eksen kullanmak gerekiyor aslında biraz karmaşık bir durum.
eklediğim resimden bişeyler anlaşılabilir.

ayrıca şunuda ekleyim atan2 fonkfiyonuna gelen x y değerleri negatif mi pozitif mi bunuda belirtmek gerekiyor bunun için eğer sayı negatif ise
değişkenin önüne - pozitif ise + koymak gerekiyor ki fonksiyon ona göre hesap yapsın. Örnek: atan2(+yaxis,-xaxis);

Kendimin anladığı kadarı ile anlatmaya çalıştım.