圣源电子制作

 找回密码
 立即注册
查看: 8199|回复: 0

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

[复制链接]
发表于 2012-4-28 22:52:34 | 显示全部楼层 |阅读模式
转载自互联网!!!仅供学习
是一种用来感测与维持方向的装置,基於角动量不灭的理论设计出来的。陀螺仪主要是由一个位於轴心可以旋转的轮子构成。 陀螺仪一旦开始旋转,由於轮子的角动量,陀螺仪有抗拒方向改变的趋向。陀螺仪多用於导航、定位等系统。 1850年法国的物理学家福柯(J.Foucault)为了研究地球自转,首先发现高速转动中的转子(rotor),由于惯性作用它的旋转轴永远指向一固定方向,他用希腊字gyro(旋转)和skopein(看)两字合为gyro scopei一字来命名这种仪表。

先来看一下陀螺仪的结构图


14574588qsyitrnscqtl07.gif

222453t6nn9nj34icvjkdb.jpg

本次使用的芯片为ITG 3205,使用方法和ITG 3200一致。通过IIC接口连接,测量的结果为角速度,单位为“度/秒”。

145746lka714w7xx79x1vc.jpg

下面是硬件连接图

1457484nhb4em57xzhby22.jpg

145747aqnoyqmsnacoqqyc.jpg
  1. #include <Wire.h>  //调用arduino自带的I2C库
  2. #include <LiquidCrystal.h>   //调用arduino自带的LiquidCrystal库

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

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

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

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

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


  35. void getGyroscopeData(int * result)
  36. {
  37.   /**************************************
  38.   Gyro ITG-3200 I2C
  39.   注册:
  40.   temp MSB = 1B, temp LSB = 1C
  41.   x axis MSB = 1D, x axis LSB = 1E
  42.   y axis MSB = 1F, y axis LSB = 20
  43.   z axis MSB = 21, z axis LSB = 22
  44.   *************************************/

  45.   int regAddress = 0x1B;
  46.   int temp, x, y, z;
  47.   byte buff[G_TO_READ];
  48.   
  49.   readFrom(GYRO, regAddress, G_TO_READ, buff); // 从ITG3200读取数据
  50.   
  51.   result[0] = ((buff[2] << 8) | buff[3]) + g_offx;
  52.   result[1] = ((buff[4] << 8) | buff[5]) + g_offy;
  53.   result[2] = ((buff[6] << 8) | buff[7]) + g_offz;
  54.   result[3] = (buff[0] << 8) | buff[1]; // 温度
  55.   
  56. }

  57. void setup()
  58. {
  59.   lcd.begin(16, 2);  //初始化LCD
  60.   delay(100);
  61.   Wire.begin();  //初始化I2C
  62.   delay(100);
  63.   initGyro();
  64. }

  65. void loop()
  66. {
  67.   int gyro[4];
  68.   getGyroscopeData(gyro);
  69.   hx = gyro[0] / 14.375; // 输出值转换为角速度,单位是度/秒
  70.   hy = gyro[1] / 14.375;
  71.   hz = gyro[2] / 14.375;
  72.   turetemp = 35+ ((double) (gyro[3] + 13200)) / 280; // 输出值转换为摄氏度
  73.   
  74.   lcd.clear(); //清屏
  75.   lcd.print("X="); //使屏幕显示文字X=
  76.   lcd.print(hx);
  77.   lcd.setCursor(8, 0);
  78.   lcd.print("Y=");
  79.   lcd.print(hy);
  80.   lcd.setCursor(0, 1);
  81.   lcd.print("Z=");
  82.   lcd.print(hz);
  83.   lcd.setCursor(8, 1);
  84.   lcd.print("F=");
  85.   lcd.print(turetemp);
  86.   lcd.print((char)223);
  87.   lcd.print("C");
  88.   delay(100);  //延时0.1秒,刷新频率这里进行调整
  89. }

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


  98. // 从累加器的地址寄存器中读取buff数组数据
  99. void readFrom(int DEVICE, byte address, int num, byte buff[]) {
  100.   Wire.beginTransmission(DEVICE); // 开始传输数据到累加器
  101.   Wire.send(address);        // 发送读取的地址
  102.   Wire.endTransmission(); // 结束传输
  103.   
  104.   Wire.beginTransmission(DEVICE); // 开始传输数据到累加器
  105.   Wire.requestFrom(DEVICE, num);    //  从累加器请求6个字节数据
  106.   
  107.   int i = 0;
  108.   while(Wire.available())   
  109.   {
  110.     buff[i] = Wire.receive(); // 接收一个字节
  111.     i++;
  112.   }
  113.   Wire.endTransmission(); // 结束传输
  114. }
复制代码
实验效果如下
回复

使用道具 举报

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

本版积分规则

QQ|手机版|联系我们|闽公网安备 35012102000020号|圣源电子 ( 闽ICP备11020110号 )

GMT+8, 2024-3-29 20:00 , Processed in 0.048185 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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