Elektronik / Mikrodenetleyici Projeleri/

PIC16F628 ADXL345 İvme Ölçer Projesi

Sponsorlu Bağlantılar

Merhaba Arkadaşlar, Epeyce oldu okul ve işler derken hiç vakit bulamıyorum, Malum yaz geldi, vakit buldukça biriktirdiğim yazılarımı yazmaya çalışacağım.

Bu yazımda ADXL345 ivme ölçer çipine ait örnek uygulama paylaşacağım. ADXL345 SMD kılıfta olan bir çip, Deneysel amaçlı kullanmanız için Kendiniz bir board yapabileceğiniz gibi Hazır yapılmış boardlar kullanabilirsiniz. Zira boardla birlikte fiyatları diğer hemcinslerine göre nispeten ucuz. Bende bu yüzden bu çipi kullandım.

Yurtdışında ortalama fiyatı 5-6 dolar. Aynı ürün Türkiyedeki firmalardan 10-15 TL arası bir ücrete temin edilebiliyor.

ADXL345 ivme ölçer çipinin özellikleri

Ultra düşük enerji Tüketimi(Vs=2,5V, Measurement Mode 23uA, StandBy Mode 0.1uA)
10Bit veya 13 Çözünürlük Seçeneği
Serbest Düşüş Tespiti
2.0 ile 3.6v arası çalışma gelirimi
1.7v ile Vs arası I/O voltajı
SPI veya I2C iletişim seçenekleri
-40 ile +85C sıcaklık aralığında çalışma
Esnek interrupt Seçenekleri şeklinde sıralanabilir.

Çipin özellikleri fena değil, I2C ve SPI desteklemesi çok hoş. Başta söylediğim gibi çipi deneysel amaçlı kulllanabilmek için board temin etmek gerekiyor. Benim kullandığım board aşağıdaki resimdekinden.

adxl345-modul

Buna benzer birçok board bulunmaktadır. Bu board’ın güzel bir tarafı hem 5V hemde 3.3V desteğinin bulunmasıdır. Normalde ADXL345 3.3V ile çalışıyor. Board üzerinde 5V->3.3V gelirim regülatörü var. Ayrıca SCL ve SDA hattı pull-up yapılmış. I2C ile haberleşirken ayrıca hatta pull-up direnci eklemenize gerek yok.

PIC16F628 ADXL345 Devre Şeması

pic16f628-adxl345-ivme-olcer-devre-semasi-proteus-isis

Yazılıma gelirsek, Aslında fazla karmaşık değil. ADXL345′den veri alabilmek için Asgari düzeyde bir iki registeri init ederek veri alabilecek konuma getirebiliyoruz çipi. Bütün Registerlere değinmeye gerek yok zaten, Çalışması için gerekli bilgileri bilelim yeter. Fazlası Datasheette ayrıntılı olarak yazıyor.

ADCL345 Kütüphane

için ufak bir kütüphane hazırladım.

// ADXL345  Registers
#define ADXL345_DEVID                   0x00    // R     Device ID
#define ADXL345_THRESH_TAP              0x1D    // R/W   Tap threshold
#define ADXL345_OFSX                    0x1E    // R/W   X-axis offset
#define ADXL345_OFSY                    0x1F    // R/W   Y-axis offset
#define ADXL345_OFSZ                    0x20    // R/W   Z-axis offset
#define ADXL345_DUR                     0x21    // R/W   Tap duration
#define ADXL345_Latent                  0x22    // R/W   Tap latency
#define ADXL345_Window                  0x23    // R/W   Tap window
#define ADXL345_THRESH_ACT              0x24    // R/W   Activity threshold
#define ADXL345_THRESH_INACT            0x25    // R/W   Inactivity threshold
#define ADXL345_TIME_INACT              0x26    // R/W   Inactivity time
#define ADXL345_ACT_INACT_CTL           0x27    // R/W   Axis enable control for activity and inactivity detection
#define ADXL345_THRESH_FF               0x28    // R/W   Free-fall threshold
#define ADXL345_TIME_FF                 0x29    // R/W   Free-fall time
#define ADXL345_TAP_AXES                0x2A    // R/W   Axis control for single tap/double tap
#define ADXL345_ACT_TAP_STATUS          0x2B    // R     Source of single tap/double tap
#define ADXL345_BW_RATE                 0x2C    // R/W   Data Rate and power mode control
#define ADXL345_POWER_CTL               0x2D    // R/W   Power-saving features control
#define ADXL345_INT_ENABLE              0x2E    // R/W   Interrupt enable control
#define ADXL345_INT_MAP                 0x2F    // R/W   Interrupt mapping control
#define ADXL345_INT_SOURCE              0x30    // R     Source of interrupts
#define ADXL345_DATA_FORMAT             0x31    // R/W   Data format control
#define ADXL345_DATAX0                  0x32    // R     X-Axis Data 0
#define ADXL345_DATAX1                  0x33    // R     X-Axis Data 1
#define ADXL345_DATAY0                  0x34    // R     Y-Axis Data 0
#define ADXL345_DATAY1                  0x35    // R     Y-Axis Data 1
#define ADXL345_DATAZ0                  0x36    // R     Z-Axis Data 0
#define ADXL345_DATAZ1                  0x37    // R     Z-Axis Data 1
#define ADXL345_FIFO_CTL                0x38    // R/W   FIFO control
#define ADXL345_FIFO_STATUS             0x39    // R     FIFO status
#define ADXL345_OUTPUTS                 0x32
 
void adxl345_write(int add, int data)
{
         i2c_start();
         i2c_write(0xA6);
         i2c_write(add);
         i2c_write(data);
         i2c_stop();
 
}
      
int adxl345_read(int add){
         int retval;
         i2c_start();
         i2c_write(0xA6);
         i2c_write(add);
         i2c_start();
         i2c_write(0xA7);
         retval=i2c_read(0);
         i2c_stop();
         return retval;
}
 
void adxl345_init(){
         adxl345_write(ADXL345_DATA_FORMAT,0x0B);
         delay_ms(2);
         adxl345_write(ADXL345_POWER_CTL,0x08);
         delay_ms(2);
}

İlk etapta DATA_FORMAT Registerine bakalım. Bu Register 0×31 adresinde bulunuyor.

data_format-registerine-bakalim-bu-register-0x31

7. Bit SELF_TEST biti. Şayet Bu bit 1 olursa ADXL345 SelfTest moduna girer. Bizim bu bitle işimiz yok bu yüzden 0 veriyoruz

6. Bit SPI Seçim biti. Şayet Bu bit 1 olursa ADXL345 SPI haberleşme moduna girer. Biz I2C kullandığımız için yine bu bite 0 veriyoruz.

5. Bit INT_INVERT biti. Görevi ise ADXL345′in interrupt çıkışlarını terslemesi. Biz interrupt kullanmadığımız için bu bitede 0 veriyoruz.

4. Bit Kullanılmıyor

3. Bit FULL_RES biti. Bu bit 1 olursa ADXL345 13 Bit yani full resolution modunda ölçüm yapar. Biz ivme ölçeri full resolution modunda kullandığımız için bu biti 1 yapıyoruz.

2. Bit Justify biti MSB ile LSB yi terslemeye yarıyor. Bizim buna ihtiyacımız yok bu yüzden 0 yapıyoruz. 1. ile 0. Bitler Range Bitleri, İvme ölçerin ölçüm aralığını ayarlamaya yarar. Datasheet Tablo 21′de açıklanmış

adxl345-range-setting

Biz 16G modunda kullanıyoruz. Dolayısıyla 1. ve 0. bitlerin ikisinide 1 yapmamız gerekiyor. DATA_FORMAT Registerinin ayarları bu kadar. Birde POWER_CTL Registeri var.

POWER_CTL Registeri

adxl345-power-ctl-registeri

Bu registerin Çipin Power control işlemlerini yapılmasını olanak sağlar. Örneğin Çipi uyku moduna sokmak isterseniz 2. Biti 1 yapmanız gerekir. Biz sürekli ölçüm yapacağız. Bu yüzden Measure bitini 1 yapıyoruz. Diğerlerine karışmamıza gerek yok. İlk çalışmada bu ayarları yaptıktan sonra ivme ölçer bize değer verecek hale geliyor. Bundan sonra ADXL345′den eksen bilgileri okunabilir. X,Y ve Z eksenlerine ait değerler 16 bit olduğu için iki ayrı paket halinde gönderiliyor. Datasheette Okunacak adresler aşağıdaki gibi belirtilmiş.

adxl345-xy-ve-z-eksenlerine-ait-degerler-16-bit

Bizde okuma yaparken 0×32 adresinden itibaren okuma yapıp gelen paketleri 8 bitlik değerlerde topluyoruz. Ardından 16 bitlik tek paket halinde birleştirmek gerekiyor. Tabi 16 bitlik değer Signed yani işaretli olması gerekiyor. çünkü gelen değerler pozitif veya negatif değerler alabilmektedir.

ADXL345 PIC16F628 Yazılım

#include <16F628A.h>
 
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOMCLR
 
#use delay(clock=4000000)
 
#use I2C(master, sda=PIN_B0, scl=PIN_B1, slow)
 
#use fast_io(a)
#use fast_io(b)
 
#include <lcd_driver.cgt;
#include <ADXL345.cgt;
 
int8 accel_data[6];
int16 xaxis=0,yaxis=0,zaxis=0;
 
 
void main()
{
   set_tris_a(0x00);
   set_tris_b(0x00);
   output_a(0x00);
   output_b(0x00);
    
   setup_ccp1(CCP_OFF);
    
   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)
   {
     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]);
     yaxis=make16(accel_data[3],accel_data[2]);
     zaxis=make16(accel_data[5],accel_data[4]);
           
     lcd_gotoxy(1,1);
     printf(lcd_putc,"X=%ld  ",xaxis);
     lcd_gotoxy(1,2);
     printf(lcd_putc,"Y=%ld  ",yaxis);
     lcd_gotoxy(11,2);
     printf(lcd_putc,"Z=%ld  ",zaxis);
     delay_ms(100);
   }
}

Yazılım son derece sade ve anlaşılır. Umarım Faydalı olmuştur. ADXL345 İvme Ölçer Projesine ait proteus isis PCB, Şema ve kod dosyaları: PIC16F628 ADXL345 İvme Ölçer Projesi
Dosya indirme LINK listesi (TXT formatında) link-23306.zip şifre-pass: 320volt.com

İyi çalışmalar.

http://arectron.com/microchip/pic16f628-adxl345-uygulamasi.html

  • özcan çelik

    mucit23 kardeşim.çok güzel bir uygulama.emeğinize sağlık.fakat ben bu uygulamayı bir iki haftadır uğraşmama rağmen çalıştıramadım.bana bu konuda yardımcı olabilirmisiniz.

    Saygılarımla.
    Özcan ÇELİK
    enelsanelektrik@gmail.com