免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
I2C通信之加速度計(jì)、陀螺儀、磁強(qiáng)計(jì)(345+3205+5883)
       之前簡(jiǎn)單寫(xiě)了陀螺儀傳感器ITG3205加速度傳感器ADXL345 的相關(guān)帖子?,F(xiàn)在把這兩種傳感器和HMC5883L磁強(qiáng)計(jì)放在一起,使用I2C與Arduino通信,讀出這三種傳感器的原始數(shù)據(jù)。沒(méi)有加入濾波算法,沒(méi)有額外庫(kù)文件。方便大家對(duì)I2C通信、幾種常見(jiàn)慣性傳感器初步配置進(jìn)行學(xué)習(xí)、交流~
IDE環(huán)境:Arduino1.0.5      I2C速率 :100Kbps
ARDUINO 代碼
                        
  1. #include <Wire.h>
  2. #define Acc_address   0x53      //ADXL345的I2C地址(ADDR接地)
  3. #define Gyr_address   0x68      //ITG3205的I2C地址(AD0接地)
  4. #define HMCAddress    0x1E      //HMC5883L的I2C地址

  5. #define A_DATA_FORMAT 0x31      //Acc設(shè)置量程、分辨率的寄存器
  6. #define A_BW_RATE     0x2C      //Acc設(shè)置輸出數(shù)據(jù)速率和功率模式的寄存器
  7. #define A_POWER_CTL   0x2D      //Acc設(shè)置測(cè)量模式的寄存器

  8. #define G_SMPLRT_DIV  0x15      // Gyr設(shè)置采樣率的寄存器
  9. #define G_DLPF_FS     0x16      // Gyr設(shè)置量程、低通濾波帶寬、時(shí)鐘頻率的寄存器
  10. #define G_INT_CFG     0x17      // Gyr設(shè)置中斷的寄存器
  11. #define G_PWR_MGM     0x3E      // Gyr設(shè)置電源管理的寄存器

  12. #define ConfigurationRegisterA 0x00  //Mag配置寄存器A
  13. #define ConfigurationRegisterB 0x01  //Mag配置寄存器B
  14. #define ModeRegister 0x02            //Mag模式寄存器


  15. int xAcc,  yAcc,  zAcc;         //存放加速度值
  16. int xGyro, yGyro, zGyro;        //存放角速度值
  17. int xMag,  yMag,  zMag;         // 存放地磁場(chǎng)值

  18. int buff[6];                    //存放寄存器高低位值,X、Y、Z軸共6個(gè)

  19. // 加速度傳感器誤差修正的偏移量
  20. int a_offx = -2;
  21. int a_offy = -3;
  22. int a_offz =10;

  23. // 陀螺儀傳感器誤差修正的偏移量
  24. int g_offx = 83;
  25. int g_offy = 27;
  26. int g_offz = 17;

  27. // 磁強(qiáng)計(jì)橢圓校正的偏移量
  28. int m_offx=-45;
  29. int m_offy=-98;
  30. int m_offz= 75;

  31. void writeRegister(int deviceAddress, byte address, byte val)
  32. {
  33.    Wire.beginTransmission(deviceAddress);
  34.    Wire.write(address);      
  35.    Wire.write(val);        
  36.    Wire.endTransmission();
  37. }

  38. void readRegister(int deviceAddress, byte address)
  39. {
  40.   Wire.beginTransmission(deviceAddress);  
  41.   Wire.write(address);        
  42.   Wire.endTransmission();
  43.   Wire.beginTransmission(deviceAddress);
  44.   Wire.requestFrom(deviceAddress, 6);   

  45.   int i = 0;
  46.   while(Wire.available())   
  47.   {  buff[i++] = Wire.read();  }
  48.   Wire.endTransmission();
  49. }

  50. void initAcc()
  51. {
  52.   /*****************************************
  53.    * ADXL345
  54.    * A_DATA_FORMAT:量程=+-2g,10位分辨率 3.9 LSB/mg
  55.    * A_BW_RATE: 輸出數(shù)據(jù)速率50Hz,帶寬25Hz
  56.    * A_POWER_CTL:測(cè)量模式
  57.    ******************************************/
  58.   writeRegister (Acc_address, A_DATA_FORMAT, 0x00);
  59.   writeRegister (Acc_address, A_BW_RATE, 0x09);
  60.   writeRegister (Acc_address, A_POWER_CTL, 0x08);  
  61. }

  62. void getAccData()
  63. {
  64.   readRegister(Acc_address, 0x32);  
  65.   xAcc = ((buff[1] << 8) | buff[0] )+ a_offx;   
  66.   yAcc = ((buff[3] << 8) | buff[2] )+ a_offy;
  67.   zAcc = ((buff[5] << 8) | buff[4]) + a_offz;
  68. }

  69. void initGyro()
  70. {
  71.   /*****************************************
  72.    * ITG3205     分辨率  14.375 LSB 度/秒
  73.    * G_SMPLRT_DIV:采樣率 = 125Hz
  74.    * G_DLPF_FS:+ - 2000度/秒、低通濾波器5HZ、內(nèi)部采樣率1kHz
  75.    * G_INT_CFG:沒(méi)有中斷
  76.    * G_PWR_MGM:電源管理設(shè)定:無(wú)復(fù)位、無(wú)睡眠模式、無(wú)待機(jī)模式、內(nèi)部振蕩器
  77.    ******************************************/
  78.   writeRegister(Gyr_address, G_SMPLRT_DIV, 0x07); //設(shè)置采樣率
  79.   writeRegister(Gyr_address, G_DLPF_FS, 0x1E); //設(shè)置量程、低通濾波、內(nèi)部采樣率
  80.   writeRegister(Gyr_address, G_INT_CFG, 0x00); //設(shè)置中斷(默認(rèn)值)
  81.   writeRegister(Gyr_address, G_PWR_MGM, 0x00);    //設(shè)置電源管理(默認(rèn)值)
  82. }

  83. void getGyroValues()
  84. {
  85.   readRegister(Gyr_address, 0x1D); //讀取陀螺儀ITG3205的數(shù)據(jù)
  86.   xGyro = ((buff[0] << 8) | buff[1]) + g_offx;
  87.   yGyro = ((buff[2] << 8) | buff[3]) + g_offy;
  88.   zGyro = ((buff[4] << 8) | buff[5]) + g_offz;
  89. }

  90. void initMagn()
  91. {  /*****************************************
  92.    * HMC5883L
  93.    * ModeRegister:連續(xù)測(cè)量模式
  94.    * ConfigurationRegisterA:輸出數(shù)據(jù)速率15Hz、內(nèi)部采樣8次平均、正常測(cè)量配置
  95.    * ConfigurationRegisterB:磁場(chǎng)范圍=+-1.3Ga、1090 LSB/Gauss
  96.    ******************************************/
  97.   writeRegister(HMCAddress, ModeRegister, 0x00);
  98.   writeRegister(HMCAddress, ConfigurationRegisterA, 0x70);
  99.   writeRegister(HMCAddress, ConfigurationRegisterB, 0x20);
  100. }

  101. void getMagnValues()
  102. {
  103.   readRegister(HMCAddress, 0x03); //讀取磁強(qiáng)計(jì)HMC5883L的數(shù)據(jù)
  104.   xMag = ((buff[0] << 8) | buff[1] ) +m_offx ;
  105.   zMag = (( buff[2] << 8) | buff[3] ) +m_offz;
  106.   yMag = (( buff[4] << 8) | buff[5] )+m_offy ;
  107. }

  108. void setup()
  109. {
  110.   Serial.begin(9600);
  111.   Wire.begin();
  112.   initAcc();
  113.   initGyro();
  114.   initMagn();
  115.   delay(50);
  116. }

  117. void loop()
  118. {
  119.     getAccData();
  120.     Serial.print("xAcc=");
  121.     Serial.print(xAcc);
  122.     Serial.print("  yAcc=");
  123.     Serial.print(yAcc);
  124.     Serial.print("  zAcc=");
  125.     Serial.println(zAcc);

  126.     getGyroValues();
  127.     Serial.print("xGyro=");
  128.     Serial.print(xGyro);
  129.     Serial.print("  yGyro=");
  130.     Serial.print(yGyro);
  131.     Serial.print("  zGyro=");
  132.     Serial.println(zGyro);

  133.     getMagnValues();
  134.     Serial.print("xMag=");
  135.     Serial.print(xMag);
  136.     Serial.print("  yMag=");
  137.     Serial.print(yMag);
  138.     Serial.print("  zMag=");
  139.     Serial.println(zMag);
  140.     delay(200);
  141. }




       看到這里,大家或許會(huì)去把這些原始數(shù)據(jù)轉(zhuǎn)換成對(duì)應(yīng)的物理量,沒(méi)關(guān)系,請(qǐng)參考Malc童鞋的:加速度計(jì)和陀螺儀指南。如果希望濾波,以便得到更準(zhǔn)確的姿態(tài)角,請(qǐng)參考黑馬前輩的:我的自平衡小車(chē)D3和笨笨童鞋的:Arduino+MPU6050+Kalman filter。 需要注意的是帖子中的kalman濾波算法只能對(duì)水平面姿態(tài)角之一:Pitch或者Roll正確濾波(歐拉角微分方程簡(jiǎn)化形式:yaw=0&&pitch=0||roll=0)。如果打算使用全姿態(tài)歐拉角,推薦用四元數(shù)法,再采用卡爾曼濾波估計(jì)最優(yōu)的全姿態(tài)角。當(dāng)然,還是推薦互補(bǔ)濾波算法解決這類(lèi)問(wèn)題。






本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
重力加速度陀螺儀傳感器MPU
超詳細(xì)陀螺儀MPU6050模塊輸出姿態(tài)角(有完整版源碼)
如何使用STM32F1/F4驅(qū)動(dòng)CS5463
ADXL345基本介紹
LoRa協(xié)議在Arduino上的應(yīng)用——原理及代碼分析(一)
圓點(diǎn)博士——代碼注釋——初版——來(lái)自波波——attitude.c
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服