Go Down

Topic: Help with L3G4200D (Read 753 times) previous topic - next topic

masoud_r

Hi all,
I have a problem on reading angular rate data

This is my code:
Code: [Select]

#include "main.h"
#include "gyro.c"



void Write1Byte(int8,int8);
unsigned int8 Read(int8);

   int16 x=0,y=0,z=0;
   unsigned int8 X_L=0,X_H=0,Y_L=0,Y_H=0,Z_L=0,Z_H=0;
   


void main()
{


   SET_TRIS_D( 0x0F );
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

 
   delay_ms(10);
 
   Write1Byte(CTRL_REG1,0b00001111);
   delay_ms(10);
   Write1Byte(CTRL_REG2,0b00000000);
   delay_ms(10);
   Write1Byte(CTRL_REG3,0b00000000);
   delay_ms(10);
   Write1Byte(CTRL_REG4,0b10100000);
   delay_ms(10);
   Write1Byte(CTRL_REG5,0b00000000);
   delay_ms(10);
   
   
   

     
 
 


  while(1)
   {
   
 
 
   X_L=Read(OUT_X_L);
   X_H=Read(OUT_X_H);

   Y_L=Read(OUT_Y_L);
   Y_H=Read(OUT_Y_H);
   
   Z_L=Read(OUT_Z_L);
   Z_H=Read(OUT_Z_H);
 

   

   
   fprintf(pc," x_h=%u  x_l=%u  ,  y_h=%u  y_l=%u  ,  Z_h=%u   Z_l=%u \n\r\ ",X_H,X_L,Y_H,Y_L,Z_H,Z_L);
   fprintf(pc,"X=%Ld\n\r\n\r",x); 
   
   X_L=0;
   X_H=0;
   
   Y_L=0;
   Y_H=0;
   
   Z_L=0;
   Z_H=0;
   
   delay_ms(100);
   output_toggle(pin_c0);
 
 
   }
   //TODO: User Code

}


void Write1Byte(int8 reg,int8 data)
{
   i2c_start();   
   i2c_write(0b11010000);
   i2c_write(reg);
   i2c_write(data);
   i2c_stop();
 
}


unsigned int8 Read(int8 reg)
{
   unsigned int8 R=0;
   i2c_start();
   i2c_write(0b11010000);
   i2c_write(reg);
   i2c_stop();
   i2c_start();
   i2c_write(0b11010001);
   R=i2c_read(0);
   i2c_stop();
   
   return R;

}



and this is my data :
x_l=11   x_h=160   y_l=249   y_h=10   z_l=5   z_h=227
x_l=11   x_h=161   y_l=249   y_h=11   z_l=5   z_h=229
x_l=11   x_h=159   y_l=249   y_h=2    z_l=5   z_h=225
x_l=11   x_h=157   y_l=249   y_h=5    z_l=5   z_h=224
x_l=11   x_h=150   y_l=249   y_h=11   z_l=5   z_h=231

pls help me!!!

pylon

What exactly is your problem? Seems like your getting correct data from your sensor.

masoud_r

when I don't move the gyro and it's on a horizontal surface, the output values are not zero, they are noisy and don't have a fixed amount

pylon

What library do you use? Have you tried this one? https://github.com/pololu/L3G4200D

masoud_r

it's my library:
Code: [Select]




#define CTRL_REG1     0x20
#define CTRL_REG2     0x21
#define CTRL_REG3     0x22
#define CTRL_REG4     0x23
#define CTRL_REG5     0x24
#define REFERENCE     0x25
#define OUT_TEMP      0x26
#define STATUS_REG    0x27

#define OUT_X_L       0x28
#define OUT_X_H       0x29
#define OUT_Y_L       0x2A
#define OUT_Y_H       0x2B
#define OUT_Z_L       0x2C
#define OUT_Z_H       0x2D

#define INT1_CFG      0x30
#define INT1_SRC      0x31

#define INT1_TSH_XH   0x32
#define INT1_TSH_XL   0x33
#define INT1_TSH_YH   0x34
#define INT1_TSH_YL   0x35
#define INT1_TSH_ZH   0x36
#define INT1_TSH_ZL   0x37

#define INT1_DURATION 0x38





MarkT

Code: [Select]

   fprintf(pc," x_h=%u  x_l=%u  ,  y_h=%u  y_l=%u  ,  Z_h=%u   Z_l=%u \n\r\ ",X_H,X_L,Y_H,Y_L,Z_H,Z_L);

Quote
and this is my data :
x_l=11   x_h=160   y_l=249   y_h=10   z_l=5   z_h=227
x_l=11   x_h=161   y_l=249   y_h=11   z_l=5   z_h=229
x_l=11   x_h=159   y_l=249   y_h=2    z_l=5   z_h=225
x_l=11   x_h=157   y_l=249   y_h=5    z_l=5   z_h=224
x_l=11   x_h=150   y_l=249   y_h=11   z_l=5   z_h=231


You should provide output and code that actually match before confusing everyone.

Anyway the values you get back are fine, you are simply not combining them into a signed 16 bit int:

Code: [Select]

    int X = (Read (OUT_X_H) << 8) | Read (OUT_X_L) ;
    int Y = (Read (OUT_Y_H) << 8) | Read (OUT_Y_L) ;
    int Z = (Read (OUT_Z_H) << 8) | Read (OUT_Z_L) ;



You then simply need to tare the values in a calibration step.
[ I won't respond to messages, use the forum please ]

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy