hola a todos
necesito realizar un sistema que mida los grados de inclinación en los tres ejes, para ello
adquirí un acelerómetro adxl345 que se configura por medio de i2c, como microcontorlador he usado un 16f877a para leer los datos y poder procesarlos, he logrado comunicarlo con el pic, sin embargo no me toma lecturas negativas, la concatenación la estoy realizando como dice en la pagina de fabricante, agradecería cualquier aporte
necesito realizar un sistema que mida los grados de inclinación en los tres ejes, para ello
adquirí un acelerómetro adxl345 que se configura por medio de i2c, como microcontorlador he usado un 16f877a para leer los datos y poder procesarlos, he logrado comunicarlo con el pic, sin embargo no me toma lecturas negativas, la concatenación la estoy realizando como dice en la pagina de fabricante, agradecería cualquier aporte
Código:
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=4M)
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <lcd.c>
#use i2c(MASTER, SDA=PIN_c4, SCL=PIN_c3,FORCE_HW)
#define ACCEL_WRITE_ADDR 0XA6//0xA6 //0x53//0x3a
#define ACCEL_READ_ADDR 0XA7//0xA7 //0x53//0x3b
#define ACCEL_DATA_ADDR 0x32
#define ACCEL_PWRCTRL_ADDR 0x2d
#define ACCEL_MEASURE_MODE 0x08
unsigned int accel_data[6];
unsigned int16 x,y,z;
float x1,y1,z1,R;
float teta=0, gama=0,fi=0;
void main ()
{
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
// initialize
while(true) {
lcd_init();
// Tell the accelerometer to wake up
i2c_start();
i2c_write(ACCEL_WRITE_ADDR);
i2c_write(0X31);
i2c_write(0X01);
i2c_stop();
I2C_start();
i2c_write(ACCEL_WRITE_ADDR);
i2c_write(ACCEL_PWRCTRL_ADDR);
i2c_write(ACCEL_MEASURE_MODE);
I2C_stop();
// Read data from the accel
i2c_start();
i2c_write(ACCEL_WRITE_ADDR);
i2c_write(ACCEL_DATA_ADDR);
i2c_start();
i2c_write(ACCEL_READ_ADDR);
accel_data[0] = i2c_read(); //x0
accel_data[1] = i2c_read(); //x1
accel_data[2] = i2c_read(); //y0
accel_data[3] = i2c_read(); //y1
accel_data[4] = i2c_read(); //z0
accel_data[5] = i2c_read(0); // z1, NACK on last read
i2c_stop();
//////////concatenar datos adxl345/////////////
x=((accel_data[1])<<8)|accel_data[0] ;
y=((accel_data[3])<<8)|accel_data[2];
z=((accel_data[5])<<8)|accel_data[4];
x1=(float)x/256;
y1=(float)y/256;
z1=(float)z/256;
////////////////////////////////////////////////
R=sqrt((x1*x1)+(y1*y1)+(z1*z1));
teta=acos(x1/R);
teta=teta * 57,296;
gama=acos(y1/R);
gama=gama*57,296;
fi=acos(z1/R);
fi=fi*57,296;
printf(lcd_putc,"\f %.2f %.2f %.2f ",x1,y1,z1);
printf(lcd_putc,"\n %f %f %f ",teta,gama,fi);
}
}
Última edición por un moderador: