Pages: [1]   Go Down
Author Topic: [ITG3200] analisi approfondita  (Read 1631 times)
0 Members and 1 Guest are viewing this topic.
0
Online Online
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Un altro post che non so se mettere in HW o in SW... scusate  smiley-roll-blue

Vediamo se ho fatto le cose per bene.
partiamo dal datasheet: http://invensense.com/mems/gyro/itg3200.html
apprendiamo che è un giroscopio 3 assi I2C, al massimo campiona a 8kHz e con filtro passa basso a 256Hz.
Un ADC interno a 16 bit è molto, ma il range della velocità angolare non è regolabile.

Partiamo subito con il codice, che ci permetti di campionare a 188Hz o a 255Hz, inviando i dati via seriale in modo BINARIO (per risparmiare banda sulla seriale e stare nei baudrate più bassi)
notare che è anche implementato un low pass filter digitale
Code:
#include <Wire.h> //I2C Arduino Library

#define address 0x68 //0011110b, I2C 7bit address of ITG3200

#define FAST true // true = 8kHz sample rate for 256Hz output, else 1kHz for 188Hz putput

void setup(){
  //Initialize Serial and I2C communications
  Serial.begin(19200);
  delay(1000);
  Wire.begin();
  Serial.print("START ");

  Wire.beginTransmission(address);
  Wire.write(0x3E);
  Wire.write(0x80);  //send a reset to the device
  Wire.endTransmission(); //end transmission

    //SETTING SAMPLE RATE DIVER
  Wire.beginTransmission(address);
  Wire.write( 0x15 );
  Wire.write( byte(0x00) );   //sample rate divider to 0
  Wire.endTransmission(); //end transmission

    //SETTING FULL SCALE RANGE AND LOW PASS FILTER
  Wire.beginTransmission(address);
  Wire.write(0x16);
  if (FAST){
    Wire.write(0x18); // ±2000 degrees/s 8kHz sample rate for 256Hz output(default value)
  }
  else{
    Wire.write(0x19); // ±2000 degrees/s 1kHz sample rate for 188Hz output(default value)
  }
  Wire.endTransmission(); //end transmission

  while(Serial.available()<10){
    delay(1000);
    continue;
  }
}

int x,y,z, count=0, countX=0, countY=0, countZ=0; //triple axis data
int Filtered_ValueX=0, Filtered_ValueY=0, Filtered_ValueZ=0;
unsigned long SumX =0, SumY=0, SumZ=0;
int filtro = 3;
void loop(){

  Wire.beginTransmission(address);
  Wire.write(0x1D); //select register 3, X MSB register
  Wire.endTransmission();

  Wire.requestFrom(address, 6);
  while(Wire.available()<6){
    continue;//wait for data
  }
  Serial.flush();

  x = Wire.read()<<8; //X msb
  x |= Wire.read(); //X lsb
  z = Wire.read()<<8; //Z msb
  z |= Wire.read(); //Z lsb
  y = Wire.read()<<8; //Y msb
  y |= Wire.read(); //Y lsb
 
  SumX = SumX - Filtered_ValueX + x;
  Filtered_ValueX = (SumX+(1<<(filtro - 1)))>>filtro;
 
  SumY= SumY - Filtered_ValueY + y;
  Filtered_ValueY = (SumY+(1<<(filtro - 1)))>>filtro;
 
  SumZ = SumZ - Filtered_ValueZ + z;
  Filtered_ValueZ = (SumZ+(1<<(filtro - 1)))>>filtro;
 
  Serial.write(Filtered_ValueX>>8);
  Serial.write(Filtered_ValueX);
  Serial.write(Filtered_ValueY>>8);
  Serial.write(Filtered_ValueY);
  Serial.write(Filtered_ValueZ>>8);
  Serial.write(Filtered_ValueZ);
   
  if (FAST){ 
    delayMicroseconds(3910);//~250Hz
  }
  else{
    delayMicroseconds(5320);//~188Hz
  }
}

passiamo all'analisi dei dati raccolti. prima di tutto il grafico (gnuplot) di x, y, e z da sensore fermo mostra come dallo 0 reale si scenda subito ad un -23 +- 1 circa, dove però rimane stabile (merito del filtro SW, prima leggevo variazioni di +-15)

poi un'alalisi delle frequenze (baudline) del sensore in movimento; mostra un solo asse, sulla destra il suo andamento, e sulla sinista l'analisi delle frequenze.


* grafico.png (18.41 KB, 1920x970 - viewed 38 times.)

* giroscopio primo valore.png (623.62 KB, 1920x1080 - viewed 68 times.)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Qual'è la domanda?  smiley-roll-blue






x iscrizione
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Online Online
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non c'è domanda ma la pubblicazione dei risultati di un test. se avete qualche test da fare chiedete pure.
Il prossimo è il ADXL345, poi l'HCMqualcosa.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 1
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grandissimo,pur non sapendo nulla di I2C mi hai cmq fatto capire abbastanza. È molto più difficile lavorare con la IMU che integra anche l'ADXL345?
Logged

0
Online Online
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no, magari cambiano un pò i registri o l'address (ogni sensore ha il suo address, ma non so se la imu di cuoi parli usa i due sensori semparati o sono su un unico chip e condividono risorse)

ps. ma poi le altre analisi le avrò fatte/pubblicate? bha
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1]   Go Up
Jump to: