compas and acc for my stuents

LSM303D_my.cpp

Committer:
docent
Date:
2020-07-15
Revision:
0:034b0a5fc70a

File content as of revision 0:034b0a5fc70a:

#include "LSM303D_my.h"

char EcompLSM303D_GetID(I2C *ecomp)
{
  char data;
  data=WHO_AM_I;
  ecomp->write(I2C_ADDR,&data, 1,1); // 1-no stop
  ecomp->read(I2C_ADDR,&data, 1,0);  
  return data;   
}         
//-------------------------------
void EcompLSM303D_Ini(I2C *ecomp)
{
    char data_write[2];

       data_write[0]=CTRL7;  //enable
       data_write[1]=0;
       ecomp->write(I2C_ADDR,data_write, 2,0);     
       
//! high resolution(6), Magnetic data rate configuration =6.25 Hz(4)=160ms 25Hz(c)=40ms
       data_write[0]=CTRL5;  
       data_write[1]=0x6c;//0x64;
       ecomp->write(I2C_ADDR,data_write, 2,0);  
         
//! Magnetic full-scale (6 +-12gaus)  
       data_write[0]=CTRL6;  
       data_write[1]=0x60;
       ecomp->write(I2C_ADDR,data_write, 2,0); 
       
//!update after read, and all axes of acceleration enabled at 25Hz  - 0x41
//!update continuos, and all axes of acceleration enabled at 25Hz  - 0x47
       data_write[0]=CTRL1;  
       data_write[1]=0x47;
       ecomp->write(I2C_ADDR,data_write, 2,0); 
       
//! 50Hz anti-alias, +/- 16g, no self-test, (SPI 3-wire)
       data_write[0]=CTRL2;  
       data_write[1]=0xe1;
       ecomp->write(I2C_ADDR,data_write, 2,0); 
}

//-----------------------------------------------
void EcompLSM303D_Get_M_Axis(I2C *ecomp,int16_t* m)
{
    char data_write[2];
    char  buffer[6];
    data_write[0]=OUT_X_L_M|0x80;
    ecomp->write(I2C_ADDR,data_write, 1,1); 
    ecomp->read(I2C_ADDR,buffer, 6,0);
    m[0]=*((int16_t*)&buffer[0]);
    m[1]=*((int16_t*)&buffer[2]);
    m[2]=*((int16_t*)&buffer[4]);  
}

//-------------------------------------------------
void EcompLSM303D_Get_A_Axis(I2C *ecomp,double* acc)
{
    char data_write[2];
    char  buffer[6];
    int16_t a[3];
    data_write[0]=OUT_X_L_A|0x80;
    ecomp->write(I2C_ADDR,data_write, 1,1); 
    ecomp->read(I2C_ADDR,buffer, 6,0);
    a[0]=*((int16_t*)&buffer[0]);
    a[1]=*((int16_t*)&buffer[2]);
    a[2]=*((int16_t*)&buffer[4]);
    acc[0]=(double)a[0]*0.061;//0.000 061
    acc[1]=(double)a[1]*0.061;
    acc[2]=(double)a[2]*0.0061;      
}

//-----------------------------------------
uint16_t CalculateBearing(int xi,  int yi){
double a;

    a=180*atan2((double)yi,(double)xi)/M_PI;
    if(a < 0)
      a += 360;
    return (uint16_t)floor(a); 
}