极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: 弘毅

arduino学习笔记14 - ITG 3200/3205陀螺仪传感器实验

  [复制链接]
发表于 2015-5-12 15:55:45 | 显示全部楼层
#include <Wire.h>  //调用arduino自带的I2C库
#include <LiquidCrystal.h>   //调用arduino自带的LiquidCrystal库

// 定义ITG3200陀螺仪常量
#define GYRO 0x68 // 设置IIC地址,AD0与GND相接,二进制数值为11101000.
#define G_SMPLRT_DIV 0x15
#define G_DLPF_FS 0x16
#define G_INT_CFG 0x17
#define G_PWR_MGM 0x3E

#define G_TO_READ 8 // x, y, z 每个轴输出为2个字节

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//设置LCD接口

//  XYZ三轴偏移量修正
int g_offx = 28;  // 修正X轴误差
int g_offy = 53;   // 修正Y轴误差
int g_offz = -15;   // 修正Z轴误差
int hx, hy, hz, turetemp;

// 初始化陀螺仪
void initGyro()
{
  /*****************************************
  * ITG 3200
  * 电源管理设置:
  * 时钟选择为内部振荡器
  * 无复位、无睡眠模式
  * 无待机模式
  * 采样率 = 1KHz
  * 参数为+ / - 2000度/秒
  * 低通滤波 = 5Hz
  * 没有中断
  ******************************************/
  writeTo(GYRO, G_PWR_MGM, 0x00);
  writeTo(GYRO, G_SMPLRT_DIV, 0x07); // EB, 50, 80, 7F, DE, 23, 20, FF
  writeTo(GYRO, G_DLPF_FS, 0x1E); // +/- 2000 dgrs/sec, 1KHz, 1E, 19
  writeTo(GYRO, G_INT_CFG, 0x00);
}


void getGyroscopeData(int * result)
{
  /**************************************
  Gyro ITG-3200 I2C
  注册:
  temp MSB = 1B, temp LSB = 1C
  x axis MSB = 1D, x axis LSB = 1E
  y axis MSB = 1F, y axis LSB = 20
  z axis MSB = 21, z axis LSB = 22
  *************************************/

  int regAddress = 0x1B;
  int temp, x, y, z;
  byte buff[G_TO_READ];

  readFrom(GYRO, regAddress, G_TO_READ, buff); // 从ITG3200读取数据

  result[0] = ((buff[2] << 8) | buff[3]) + g_offx;
  result[1] = ((buff[4] << 8) | buff[5]) + g_offy;
  result[2] = ((buff[6] << 8) | buff[7]) + g_offz;
  result[3] = (buff[0] << 8) | buff[1]; // 温度

}

void setup()
{
  lcd.begin(16, 2);  //初始化LCD
  delay(100);
  Wire.begin();  //初始化I2C
  delay(100);
  initGyro();
}

void loop()
{
  int gyro[4];
  getGyroscopeData(gyro);
  hx = gyro[0] / 14.375; // 输出值转换为角速度,单位是度/秒
  hy = gyro[1] / 14.375;
  hz = gyro[2] / 14.375;
  turetemp = 35+ ((double) (gyro[3] + 13200)) / 280; // 输出值转换为摄氏度

  lcd.clear(); //清屏
  lcd.print("X="); //使屏幕显示文字X=
  lcd.print(hx);
  lcd.setCursor(8, 0);
  lcd.print("Y=");
  lcd.print(hy);
  lcd.setCursor(0, 1);
  lcd.print("Z=");
  lcd.print(hz);
  lcd.setCursor(8, 1);
  lcd.print("F=");
  lcd.print(turetemp);
  lcd.print((char)223);
  lcd.print("C");
  delay(100);  //延时0.1秒,刷新频率这里进行调整
}

//---------------- 函数
// 将值写入累加器中的地址寄存器
void writeTo(int DEVICE, byte address, byte val) {
   Wire.beginTransmission(DEVICE); // 开始传输数据到累加器
   Wire. write(address);        //  发送寄存器地址
   Wire.write(val);        //  发送要写入的值
   Wire.endTransmission(); // 结束传输
}


// 从累加器的地址寄存器中读取buff数组数据
void readFrom(int DEVICE, byte address, int num, byte buff[]) {
  Wire.beginTransmission(DEVICE); // 开始传输数据到累加器
  Wire.write(address);        // 发送读取的地址
  Wire.endTransmission(); // 结束传输

  Wire.beginTransmission(DEVICE); // 开始传输数据到累加器
  Wire.requestFrom(DEVICE, num);    //  从累加器请求6个字节数据

  int i = 0;
  while(Wire.available())   
  {
    buff[i] = Wire.read(); // 接收一个字节
    i++;
  }
  Wire.endTransmission(); // 结束传输
}
回复 支持 反对

使用道具 举报

发表于 2015-5-31 22:29:33 | 显示全部楼层
弱弱地问一下,如果想在计算机屏幕上显示数字,干怎么弄,因为目前没有显示屏。谢谢
回复 支持 反对

使用道具 举报

发表于 2015-6-5 10:48:59 | 显示全部楼层
使用USB口或者UART串口,发送到电脑上。
回复 支持 反对

使用道具 举报

发表于 2015-7-26 20:46:22 | 显示全部楼层
弘毅 发表于 2011-8-24 09:08
陀螺仪初始输出数值是有偏差的,所以需要校准。先读出输出的数据,然后±使其输出数据接近0即可。

我 ...

请问楼主,这个偏移量修正值具体是怎么计算的来的呢
回复 支持 反对

使用道具 举报

发表于 2015-10-7 19:27:54 | 显示全部楼层
好牛的说!学习了!
回复 支持 反对

使用道具 举报

发表于 2016-6-16 22:59:19 | 显示全部楼层
请问这个ITG3205芯片和MPU6050有什么区别,你通用吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-2 16:00 , Processed in 0.040760 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表