ADXL345 İvme Ölçer ve Pic 16f877 ile CCS C Uygulaması

ivme ölçer

ivme ölçer

İvme ölçerler, bir nesnenin hızının değişimi olan ivmeyi ölçen aygıtlardır. Bunlar saniyede metre kare (m / s2) veya G-kuvvetleri (g) cinsinden ölçülür. Dünyada bizim için tek bir G-kuvveti 9.8 m / s2’ye eşdeğerdir, ancak bu ekvatordan kutuplara gidildikçe biraz değişir. İvme ölçerler, sistemlerde veya yönlendirme uygulamaları için titreşimleri algılamak için kullanışlıdır.

İvme ölçer nasıl Çalışır?
İvme ölçerler, ivmenin durağan veya dinamik kuvvetlerini algılayan elektromekanik aygıtlardır. Statik kuvvetler yer çekimi içerirken, dinamik kuvvetler titreşimleri ve hareketi içerebilir.

İvme ölçer, bir, iki veya üç eksende hızlanma ölçebilir. 3 eksenli üniteler, üretim maliyetleri düştükçe daha yaygın hale gelmektedir.

Genellikle, ivmeölçerler dahili olarak kapasitif plakalar içerir. Bunlardan bazıları sabittir, diğerleri sensöre ivme kuvveti hareket ettiği için dahili olarak hareket eden minik yaylara tutturulmuştur. Bu plakalar birbirlerine göre hareket ettikçe aralarındaki kapasite de değişir. Kapasitedeki bu değişikliklerden ivme belirlenebilir.

Diğer ivmeölçerler, piezoelektrik malzemeler etrafında toplanabilir. Bu minik kristal yapılar, mekanik stres altında (örn. Ivme) yerleştirildiğinde elektrik yükü üretir.

ADXL345, eğim algılama uygulamalarında yerçekimi statik ivmelerinin yanı sıra hareket veya şoktan kaynaklanan dinamik ivmelenmeyi ölçmek için de uygundur. Yüksek çözünürlüğü (4 mg / LSB) 1.0 dereceden daha düşük eğim değişikliklerini ölçmenizi sağlar;

Çeşitli özel algılama işlevleri sağlanmaktadır. Etkinlik ve hareketsizlik algılama, hareketin varlığını veya eksikliğini ve herhangi bir eksendeki ivmenin bir kullanıcı tarafından belirlenen seviyeyi aştığını tespit eder. Serbest düşme algılaması, cihazın düşme ihtimalini tespit eder. Bu fonksiyonlar, iki kesme çıkış pininden birine eşlenebilir. Entegre,  32 kademeli bir ilk giriş (FIFO) tamponu, mikrodenetleyici müdahalesini en aza indirgemek için verileri depolamak için kullanılabilir.

Çeşitli sensörler mikrodenetleyicilere değişik yollarla bağlanaiblmetedirler. Örneğin ADXL335 değerleri A/D çevirici ile okunabilmektedir. ADXL345 ise I2C protokolü ile haberleşmektedir.

Sensör Bağlantı şekilleri

adxl

ADXL345 kütüphanesi;

// ADXL345  Registers
#define W_DATA      0xA6    //Used to perform a Write operation
#define R_DATA      0xA7    //Used to perform a Read operation
#define D_FRM       0x31    //Read/Write Register, Selects the operating mode. Default = Single measurement
#define BW_RT       0x2C
#define P_CTL       0x2D    //Send continuous Measurement mode.
#define F_CTL       0x38    //Send Fifo Bypass mode
#define X_LSB       0x32    //Read Register, Output of X LSB 8-bit value.
#define X_MSB       0x33    //Read Register, Output of X MSB 8-bit value.
#define Y_LSB       0x34    //Read Register, Output of Z LSB 8-bit value.
#define Y_MSB       0x35    //Read Register, Output of Z MSB 8-bit value.
#define Z_LSB       0x36    //Read Register, Output of Y LSB 8-bit value.
#define Z_MSB       0x37    //Read Register, Output of Y MSB 8-bit value.
 
void adxl345_write(int add, int data)
{
         i2c_start();
         i2c_write(W_DATA);
         i2c_write(add);
         i2c_write(data);
         i2c_stop();
 
}
      
int adxl345_read(int add){
         int retval;
         i2c_start();
         i2c_write(W_DATA);
         i2c_write(add);
         i2c_start();
         i2c_write(R_DATA);
         retval=i2c_read(0);
         i2c_stop();
         return retval;
}
 
void adxl345_init(){
         adxl345_write(D_FRM,0x0B);
         delay_ms(2);
         adxl345_write(P_CTL,0x08);
         delay_ms(2);
}

Aşağıda örnek uyguluma programı yer almaktadır. Programda verilen kütüphane dosyalarını ve bağlantı pinlerini kendi devrenize göre değiştiriniz

#include "16f877A.h"
#FUSES NOWDT                    
#FUSES NOBROWNOUT              
#FUSES NOLVP                    
#FUSES HS                       
#use delay(clock=20MHz)  
#use I2C(master, sda=PIN_d0, scl=PIN_d1, slow)  
#include "EXLCD.C"  
#include "ADXL345.C"
#include "math.h"
int8  A_data[6]; //6 units 8 bit Accel datas
int16 Xa=0,Ya=0,Za=0;

void main()
{
delay_ms(2);
lcd_init();
adxl345_init();    
   
printf(lcd_putc,"\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"    ADXL345     ");
lcd_gotoxy(1,2);
printf(lcd_putc," Accelerometer  ");
delay_ms(1000);
printf(lcd_putc,"\f");

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

   Xa=make16(A_data[1],A_data[0]);//Converting two 8 bit integer to one 16 bit integer
   Ya=make16(A_data[3],A_data[2]);
   Za=make16(A_data[5],A_data[4]);
   
   float Heading = atan2((signed int16)Ya,(signed int16)Xa)* 180 / pi + 180;      
         
   lcd_gotoxy(1,1);
   printf(lcd_putc,"X=%ld  ",Xa);
   lcd_gotoxy(9,1);
   printf(lcd_putc,"Y=%ld  ",Ya);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"Z=%ld  ",Za);
   lcd_gotoxy(9,2);
   printf(lcd_putc,"H=%f  ",Heading);   
   
   delay_ms(100);
   }
}

Örnek uygulama kendini dengeleyen robot. Sensörden alınan veriler açıya dönüştürülür bu açıya göre motorlara güç verilerek robotun iki teker üstünde kalması sağlanır

Bu yazı CCS C Sürücü kategorisine gönderilmiş ve , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.