// CCS library compilation [2014]
// Driver para el giroscopio L3G4200D.
// Programador: Moyano Jonathan
// Compilador: CCS v4.140
// Versión de la librería: v1.0 Revisión: 0.1
// Fecha de modificación: Enero de 2014.
// Definición de macros y funciones
#include <L3G4200D.h>
// Desarrollo de las funciones de usuario.
void L3G4200D_write(int8 reg_address, int8 value){
i2c_start(); // Inicializa comunicación I2C, condición de start.
i2c_write(L3G4200D_WRITE_DEV_ADD); // Envíamos la dirección del dispositivo + comando para escritura.
i2c_write(reg_address); // Indicamos que registro será escrito.
i2c_write(value); // Enviamos el nuevo valor al registro.
i2c_stop(); // Condición de stop.
}
unsigned char L3G4200D_read(unsigned char reg){
unsigned char val = 0x00; // Variable auxiliar.
i2c_start(); // Inicializa comunicación I2C, condición de start.
i2c_write(L3G4200D_WRITE_DEV_ADD); // Envíamos la dirección del dispositivo + comando para escritura.
i2c_write(reg); // Indicamos que registro será leído.
i2c_start(); // Reiniciamos la comunicación.
i2c_write(L3G4200D_READ_DEV_ADD); // Envíamos la dirección del dispositivo + comando para lectura.
val = i2c_read(0); // Leemos el registro.
i2c_stop(); // Condición de stop.
return(val); // Retornamos con el valor leído.
}
void L3G4200D_GetRawAxis(signed int16 *rx, signed int16 *ry, signed int16 *rz){
// Variables auxiliares.
signed int16 ax=0x00;
signed int16 ay=0x00;
signed int16 az=0x00;
int8 lsb,msb;
msb=L3G4200D_read(L3G4200D_OUT_X_H);
lsb=L3G4200D_read(L3G4200D_OUT_X_L);
ax=make16(msb,lsb);
msb=L3G4200D_read(L3G4200D_OUT_Y_H);
lsb=L3G4200D_read(L3G4200D_OUT_Y_L);
ay=make16(msb,lsb);
msb=L3G4200D_read(L3G4200D_OUT_Z_H);
lsb=L3G4200D_read(L3G4200D_OUT_Z_L);
az=make16(msb,lsb);
*rx=ax;
*ry=ay;
*rz=az;
}
void L3G4200D_init(int16 rango){
// Habilitamos los ejes X,Y,Z y encendemos el dispositivo.
L3G4200D_write(L3G4200D_CTRL_REG1,0b00001111);
// Configuración del registro CTRL_REG2.
L3G4200D_write(L3G4200D_CTRL_REG2,0b00011001);
// Configuramos el registro CTRL_REG3.
L3G4200D_write(L3G4200D_CTRL_REG3,0x00);
// Configuramos el registro CTRL_REG5.
L3G4200D_write(L3G4200D_CTRL_REG5,0b00010011);
// Configuramos el rango.
if(rango == 250){
L3G4200D_write(L3G4200D_CTRL_REG4,0x00); // 250 º/seg
}else if(rango == 500){
L3G4200D_write(L3G4200D_CTRL_REG4,0x10); // 500 º/seg
}else{
L3G4200D_write(L3G4200D_CTRL_REG4,0x20); // 2000 º/seg
}
}
int8 ReadWhoAmI(void){
// Variable auxiliar.
int8 value=0x00;
value=L3G4200D_read(L3G4200D_WHO_AM_I); // Leemos el registro.
return(value); // Retornamos con el valor.
}
void L3G4200D_GetBiass(float *_bx, float *_by, float *_bz){
// Variable auxiliar.
int16 i=0x00;
signed int16 _x,_y,_z;
float biass_X;
float biass_Y;
float biass_Z;
// Obtenemos 600 muestras cada 1ms.
for (i =0; i<600; i += 1) {
L3G4200D_GetRawAxis(&_x,&_y,&_z);
biass_X += _x;
biass_Y += _y;
biass_Z += _z;
delay_ms(1);
}
// Promediamos..
biass_X /= 600;
biass_Y /= 600;
biass_Z /= 600;
// Retornamos los valores.
*_bx = biass_X;
*_by = biass_Y;
*_bz = biass_Z;
}
void L3G4200D_GetScaledAxis(float *_sx, float *_sy, float *_sz, float biassX, float biassY, float biassZ, int16 rango){
signed int16 _x,_y,_z;
float gx,gy,gz;
float escala;
// Adquirimos los datos crudos..
L3G4200D_GetRawAxis(&_x,&_y,&_z);
// A los datos crudos le resto el biass.
gx=((float)_x - biassX);
gy=((float)_y - biassY);
gz=((float)_z - biassZ);
// La sensibilidad va a estar determinada por el rango...
if(rango == 250){ escala = 0.00875; // 250 º/seg
}else if(rango == 500){escala = 0.0175; // 500 º/seg
}else{escala = 0.07; // 2000 º/seg
}
// Determino los datos correctos, utilizando la fórmula: (RAW - Offset) * Sensibilidad
gx *= escala;
gy *= escala;
gz *= escala;
// Retornamos con los datos.
*_sx = gx;
*_sy = gy;
*_sz = gz;
}