ADXL345 3 Yön Sensör hakkında

Başlatan ertsen, 09 Ocak 2013, 20:51:24

ertsen

Alıntı yapılan: sadogan - 17 Ocak 2013, 23:10:48
Hocam SPI bağlantı yaparsanız yardımcı oabilirim
daha önce SPI denemedim hiç ama denemekten zarar gelmez.

artapon

Alıntı yapılan: ertsen - 17 Ocak 2013, 19:29:10
Salih18200 hocam. Örnekleme frekansı derken herhalde nekadar aralıklarla veri aldığımı soruyorsunuz. Bu süreden bağımsız olarak, hiç hareket yokken dahi değişik rakamlar geliyor. Açıkcası registerlerin durumu hakkında çok bilgim yok. Ben bu ürünü sipariş verdiğimde, Ds1307 deki gibi hazır bir kütüphanesi olduğunu ve rahatlıkla verileri okuyabileceğimi düşündüm. Daha önce hiç register ayarları ile uğraşmadığım için bunu anlamak şu anda biraz zor geliyor. Aslında anlamaktan ziyade birçok registeri kontrol etmek sıkıntılı geldi. Yine de kendimize göre bişeyler yazdık ama tutmadı :)

Birde şöyle bir durum var. 5V giriş gerilimini bir pot ile gerilim bölücü yapıyorum ve 3.3V 'a ayarlıyorum. Ancak Adxl345 ten yanıt alamıyorum. Yavaş yavaş artırdığımda cevap geliyor ama bu arada giriş voltajı 4,5-5 V'a gelmiş oluyor.


Yazdığım kod:
adxl345.h
#define ADXL345_ADR   0xA6 //Write           0xA7//Read
#define BW_RATE       0x2C
#define POWER_CTRL    0x2D
#define DATA_FORMAT   0x31
#define FIFO_MODE     0x38

#define ADXL345_xLSB  0x32
#define ADXL345_xMSB  0x33
#define ADXL345_yLSB  0x34
#define ADXL345_yMSB  0x35
#define ADXL345_zLSB  0x36
#define ADXL345_zMSB  0x37
#define BIR           0x01

#define RTC_SDA  PIN_C7 //C4
#define RTC_SCL  PIN_C6 //C3

#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)


void adxl345_init(void)
{

i2c_start(); 
i2c_write(ADXL345_ADR);
i2c_write(POWER_CTRL);
i2c_write(0x00);
i2c_stop();
delay_ms(1);

i2c_start();
i2c_write(ADXL345_ADR);
i2c_write(DATA_FORMAT);
i2c_write(0x01);
i2c_stop();
delay_ms(1);

i2c_start(); 
i2c_write(ADXL345_ADR); 
i2c_write(FIFO_MODE); 
i2c_write(0x40);
i2c_stop();
delay_ms(1); 

i2c_start(); 
i2c_write(ADXL345_ADR);
i2c_write(BW_RATE); 
i2c_write(0x0c); 
i2c_stop(); 
delay_ms(1); 

i2c_start(); 
i2c_write(ADXL345_ADR); 
i2c_write(POWER_CTRL); 
i2c_write(0x08); //Measurement mode  
i2c_stop();
delay_ms(1);
}


Main ise:

                     
#include <18F2550.h>

#fuses  HSPLL,NOWDT,NOPROTECT,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN      // dont change
#use    delay(clock=48000000)  
#include "LCD_FLEX.c" 
#include "adxl345.c"


void main ()
{
   int i;
   signed int16 values[6];   
   signed int16 acc_data_x;
   
    lcd_init();  
    adxl345_init();
   delay_ms(1);

while(true) {

 i2c_start();
 i2c_write(0xA6);    //SDO pini topraklı ise A6 write modu ve a7 read mode
 i2c_write(0x32);    //X0 yani lsb_x     
 i2c_start();
 i2c_write(0xA7);   //SDO pini topraklı ise A6 write modu ve a7 read mode
 values[0]=i2c_read();
 i2c_stop();
 
 
 i2c_start(); 
 i2c_write(0xA6);    //SDO pini topraklı ise A6 write modu ve a7 read mode
 i2c_write(0x33);    //X1 yani msb_x 
 i2c_start(); 
 i2c_write(0xA7);    //SDO pini topraklı ise A6 write modu ve a7 read mode
 values[1]=i2c_read();
 i2c_stop();


acc_data_x =(int16)((values[1] << 8 ) + values[0]);

lcd_gotoxy(1,1);
printf(lcd_putc,"X0:%x",values[0]);
lcd_gotoxy(7,1);
printf(lcd_putc,"X1:%x",values[1]);
lcd_gotoxy(1,2);
printf(lcd_putc,"X:%x",acc_data_x);

output_toggle(PIN_C0); // programın çalışıp çalışmadığını kontrol ediyorum.

delay_ms(300);

   }
}


hocam adxl 345 sensörü 5v kendisi 3.3V ç.eviriyor. üzerinde gerilim regülatörü var. orda uçların arasında bulunan 3.3V luk pin ordan 3.3V alabileceğiniz anlamına geliyor...
Aldanma İnsanların Samimiyetine, Menfaatleri İçin Gelirler Vecde, Vaad Etmeseydi Allah cenneti, O'na Bile Etmezlerdi Secde!   (NFK)

sadogan

Alıntı yapılan: ertsen - 17 Ocak 2013, 23:28:55
daha önce SPI denemedim hiç ama denemekten zarar gelmez.
#include <18f25k22.h> 
#device *=16
#device adc=10
#fuses NOWDT,PUT,NOPROTECT,INTRC_IO,noMCLR, noBROWNOUT
#use delay(clock=4000000)

#define LcdEnbPin   pin_B3
#define LcdClkPin   pin_B5
#define LcdDataPin  pin_B4 

#define SPI_MODE_0  (SPI_L_TO_H | SPI_XMIT_L_TO_H) 
#define SPI_MODE_1  (SPI_L_TO_H) 
#define SPI_MODE_2  (SPI_H_TO_L) 
#define SPI_MODE_3  (SPI_H_TO_L | SPI_XMIT_L_TO_H) 

#include "seri_lcd_4094_winstar.c"
#include "ADXL_345.H"
////////////////////////////////////////////////////////////////////////////////
void adxl_yaz(unsigned int8 reg,unsigned int8 data)
{
   output_low(ADXL_CS); 
   spi_write(reg ); 
   spi_write(data); 
   output_high(ADXL_CS);
}
 
////////////////////////////////////////////////////////////////////////
unsigned int8 adxl_oku(unsigned int8 reg)
{
   
  unsigned int8 data;
   output_low(ADXL_CS); 
   spi_write(0x80| (reg & 0x3F));
   data = spi_read(0); 
   output_high(ADXL_CS); 
  
  return data; 
}
////////////////////////////////////////////////////////////////////////
void init(void)
{  

   setup_oscillator(OSC_4MHZ);
   setup_comparator(NC_NC_NC_NC);// 
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);            // ADC birimi devre dışı
////////////////////////////////////////////////////////////////////
   set_tris_a(0b00000000);
   set_tris_b(0b11100001);
   set_tris_c(0b00010000);
   port_b_pullups (false);
   setup_spi(SPI_MASTER | SPI_MODE_3 | SPI_CLK_DIV_4);  
}
///////////////////////////////////////////////////////////////////////
void main(void)
{
//////////////////////////////////////////////////
        unsigned char X_LByte=0;
        unsigned char X_HByte=0;
        unsigned char Y_LByte=0;
        unsigned char Y_HByte=0;
        unsigned char Z_LByte=0;
        unsigned char Z_HByte=0;        
        unsigned char AdxlDevID=0 ;
//////////////////////////////////////////////////
     
      init();
      lcd_init();
      delay_ms(100);
      adxl_yaz(DATA_FORMAT,0b00000010);
      adxl_yaz(BW_RATE,0x0A);
      adxl_yaz(POWER_CTL,0b00001010);
      delay_ms(10);
      AdxlDevID=ADXL_OKU(DEVID);
      lcd_gotoxy( 1,  1);
      printf(lcd_putc,"%3d  ",AdxlDevID);  
 
 while(TRUE)
 {
     delay_ms(100);
     AdxlDevID=ADXL_OKU( DEVID  );
     X_HByte=ADXL_OKU(DATAX1);
     X_LByte=ADXL_OKU(DATAX0);
     Y_HByte=ADXL_OKU(DATAY1);
     Y_LByte=ADXL_OKU(DATAY0);
     Z_HByte=ADXL_OKU(DATAZ1);
     Z_LByte=ADXL_OKU(DATAZ0);     
     lcd_gotoxy( 1,  1);
     printf(lcd_putc,"%X %X %X ",AdxlDevID,X_HByte,X_LByte);  
     lcd_gotoxy( 1,  2);
     printf(lcd_putc,"%X %X %X %X ",Y_HByte,Y_LByte,Z_HByte,Z_LByte);  
      
 }
 
 
 }

ADXL_345.H
//Pin define
#define   ADXL_CS       PIN_C2
#define   ADXL_CLK      PIN_C3
#define   ADXL_SDI      PIN_C5
#define   ADXL_SDO      PIN_C4
//#define   ADXL_INT1     PIN_B1
//#define   ADXL_INT2     PIN_B0


//ADXL Register Map
#define   DEVID            0x00   //Device ID Register
#define   THRESH_TAP       0x1D   //Tap Threshold
#define   OFSX             0x1E   //X-axis offset
#define   OFSY             0x1F   //Y-axis offset
#define   OFSZ             0x20   //Z-axis offset
#define   DUR              0x21   //Tap Duration
#define   Latent           0x22   //Tap latency
#define   Window           0x23   //Tap window
#define   THRESH_ACT       0x24   //Activity Threshold
#define   THRESH_INACT     0x25   //Inactivity Threshold
#define   TIME_INACT       0x26   //Inactivity Time
#define   ACT_INACT_CTL    0x27   //Axis enable control for activity and inactivity detection
#define   THRESH_FF        0x28   //free-fall threshold
#define   TIME_FF          0x29   //Free-Fall Time
#define   TAP_AXES         0x2A   //Axis control for tap/double tap
#define   ACT_TAP_STATUS   0x2B   //Source of tap/double tap
#define   BW_RATE          0x2C   //Data rate and power mode control
#define   POWER_CTL        0x2D   //Power Control Register
#define   INT_ENABLE       0x2E   //Interrupt Enable Control
#define   INT_MAP          0x2F   //Interrupt Mapping Control
#define   INT_SOURCE       0x30   //Source of interrupts
#define   DATA_FORMAT      0x31   //Data format control
#define   DATAX0           0x32   //X-Axis Data 0
#define   DATAX1           0x33   //X-Axis Data 1
#define   DATAY0           0x34   //Y-Axis Data 0
#define   DATAY1           0x35   //Y-Axis Data 1
#define   DATAZ0           0x36   //Z-Axis Data 0
#define   DATAZ1           0x37   //Z-Axis Data 1
#define   FIFO_CTL         0x38   //FIFO control
#define   FIFO_STATUS      0x39   //FIFO status

Buyrun hocam
Kolay gelsin

Murat Mert

S.A.
Konu merakım dahilinde bir konu oldu verimli bir sonuç alınca paylaşırmısınız?
mert07

ertsen

Alıntı yapılan: sadogan - 18 Ocak 2013, 00:25:38
#include <18f25k22.h> 
#device *=16
#device adc=10
#fuses NOWDT,PUT,NOPROTECT,INTRC_IO,noMCLR, noBROWNOUT
#use delay(clock=4000000)

#define LcdEnbPin   pin_B3
#define LcdClkPin   pin_B5
#define LcdDataPin  pin_B4 

#define SPI_MODE_0  (SPI_L_TO_H | SPI_XMIT_L_TO_H) 
#define SPI_MODE_1  (SPI_L_TO_H) 
#define SPI_MODE_2  (SPI_H_TO_L) 
#define SPI_MODE_3  (SPI_H_TO_L | SPI_XMIT_L_TO_H) 

#include "seri_lcd_4094_winstar.c"
#include "ADXL_345.H"
////////////////////////////////////////////////////////////////////////////////
void adxl_yaz(unsigned int8 reg,unsigned int8 data)
{
   output_low(ADXL_CS); 
   spi_write(reg ); 
   spi_write(data); 
   output_high(ADXL_CS);
}
 
////////////////////////////////////////////////////////////////////////
unsigned int8 adxl_oku(unsigned int8 reg)
{
   
  unsigned int8 data;
   output_low(ADXL_CS); 
   spi_write(0x80| (reg & 0x3F));
   data = spi_read(0); 
   output_high(ADXL_CS); 
  
  return data; 
}
////////////////////////////////////////////////////////////////////////
void init(void)
{  

   setup_oscillator(OSC_4MHZ);
   setup_comparator(NC_NC_NC_NC);// 
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);            // ADC birimi devre dışı
////////////////////////////////////////////////////////////////////
   set_tris_a(0b00000000);
   set_tris_b(0b11100001);
   set_tris_c(0b00010000);
   port_b_pullups (false);
   setup_spi(SPI_MASTER | SPI_MODE_3 | SPI_CLK_DIV_4);  
}
///////////////////////////////////////////////////////////////////////
void main(void)
{
//////////////////////////////////////////////////
        unsigned char X_LByte=0;
        unsigned char X_HByte=0;
        unsigned char Y_LByte=0;
        unsigned char Y_HByte=0;
        unsigned char Z_LByte=0;
        unsigned char Z_HByte=0;        
        unsigned char AdxlDevID=0 ;
//////////////////////////////////////////////////
     
      init();
      lcd_init();
      delay_ms(100);
      adxl_yaz(DATA_FORMAT,0b00000010);
      adxl_yaz(BW_RATE,0x0A);
      adxl_yaz(POWER_CTL,0b00001010);
      delay_ms(10);
      AdxlDevID=ADXL_OKU(DEVID);
      lcd_gotoxy( 1,  1);
      printf(lcd_putc,"%3d  ",AdxlDevID);  
 
 while(TRUE)
 {
     delay_ms(100);
     AdxlDevID=ADXL_OKU( DEVID  );
     X_HByte=ADXL_OKU(DATAX1);
     X_LByte=ADXL_OKU(DATAX0);
     Y_HByte=ADXL_OKU(DATAY1);
     Y_LByte=ADXL_OKU(DATAY0);
     Z_HByte=ADXL_OKU(DATAZ1);
     Z_LByte=ADXL_OKU(DATAZ0);     
     lcd_gotoxy( 1,  1);
     printf(lcd_putc,"%X %X %X ",AdxlDevID,X_HByte,X_LByte);  
     lcd_gotoxy( 1,  2);
     printf(lcd_putc,"%X %X %X %X ",Y_HByte,Y_LByte,Z_HByte,Z_LByte);  
      
 }
 
 
 }

ADXL_345.H
//Pin define
#define   ADXL_CS       PIN_C2
#define   ADXL_CLK      PIN_C3
#define   ADXL_SDI      PIN_C5
#define   ADXL_SDO      PIN_C4
//#define   ADXL_INT1     PIN_B1
//#define   ADXL_INT2     PIN_B0


//ADXL Register Map
#define   DEVID            0x00   //Device ID Register
#define   THRESH_TAP       0x1D   //Tap Threshold
#define   OFSX             0x1E   //X-axis offset
#define   OFSY             0x1F   //Y-axis offset
#define   OFSZ             0x20   //Z-axis offset
#define   DUR              0x21   //Tap Duration
#define   Latent           0x22   //Tap latency
#define   Window           0x23   //Tap window
#define   THRESH_ACT       0x24   //Activity Threshold
#define   THRESH_INACT     0x25   //Inactivity Threshold
#define   TIME_INACT       0x26   //Inactivity Time
#define   ACT_INACT_CTL    0x27   //Axis enable control for activity and inactivity detection
#define   THRESH_FF        0x28   //free-fall threshold
#define   TIME_FF          0x29   //Free-Fall Time
#define   TAP_AXES         0x2A   //Axis control for tap/double tap
#define   ACT_TAP_STATUS   0x2B   //Source of tap/double tap
#define   BW_RATE          0x2C   //Data rate and power mode control
#define   POWER_CTL        0x2D   //Power Control Register
#define   INT_ENABLE       0x2E   //Interrupt Enable Control
#define   INT_MAP          0x2F   //Interrupt Mapping Control
#define   INT_SOURCE       0x30   //Source of interrupts
#define   DATA_FORMAT      0x31   //Data format control
#define   DATAX0           0x32   //X-Axis Data 0
#define   DATAX1           0x33   //X-Axis Data 1
#define   DATAY0           0x34   //Y-Axis Data 0
#define   DATAY1           0x35   //Y-Axis Data 1
#define   DATAZ0           0x36   //Z-Axis Data 0
#define   DATAZ1           0x37   //Z-Axis Data 1
#define   FIFO_CTL         0x38   //FIFO control
#define   FIFO_STATUS      0x39   //FIFO status

Buyrun hocam
Kolay gelsin

Teşekkürler. Neticelenince paylaşacağım inşallah.

elektronik

Adxl335
Adxl345
bu sensörleri nerden bulabilirim

ertsen

Alıntı yapılan: elektronik - 20 Ocak 2013, 15:37:13
Adxl335
Adxl345
bu sensörleri nerden bulabilirim
ben ebaydan almıştım. gelmesi 1 ayı geçiyor.

artapon

Alıntı yapılan: elektronik - 20 Ocak 2013, 15:37:13
Adxl335
Adxl345
bu sensörleri nerden bulabilirim

hocam bende bi kaç tane var isterseniz size yardımcı olabilirim.
Aldanma İnsanların Samimiyetine, Menfaatleri İçin Gelirler Vecde, Vaad Etmeseydi Allah cenneti, O'na Bile Etmezlerdi Secde!   (NFK)

elektronik


Murat Mert

S.A.
Sn. ertsen nedir durum halledebildin mi?
mert07

ertsen

Hallettim. Sorun yok.
https://www.picproje.org/index.php/topic,44710.msg329635.html#msg329635
aşağıdaki linkten kodlara ve bağlantı şemasına ulaşabilirsiniz.