MPU6050移植讀取數據時出現FIFO溢出問題解析

2021-01-19 電子發燒友

  MPU-6000(6050)為全球首例整合性6軸運動處理組件,相較於多組件方案,免除了組合陀螺儀與加速器時間軸之差的問題,減少了大量的封裝空間。

  MPU-6000(6050)的角速度全格感測範圍為±250、±500、±1000與±2000°/sec (dps),可準確追蹤快速與慢速動作,並且,用戶可程式控制的加速器全格感測範圍為±2g、±4g±8g與±16g。產品傳輸可透過最高至400kHz的IIC或最高達20MHz的SPI(MPU-6050沒有SPI)。MPU-6000可在不同電壓下工作,VDD供電電壓介為2.5V±5%、3.0V±5%或3.3V±5%,邏輯接口VDDIO供電為1.8V± 5%(MPU6000僅用VDD)。MPU-6000的包裝尺寸4x4x0.9mm(QFN),在業界是革命性的尺寸。其他的特徵包含內建的溫度感測器、包含在運作環境中僅有±1%變動的振蕩器。

  對問題做個簡單的分析:為什麼FIFO數據會溢出?MPU6050的DMP在工作的時候,其實大概的工作過程是mpu6050對陀螺儀和加速度計按照一定的採樣速率進行採樣,對採樣得到的陀螺儀和加速度計數據通過DMP處理後得到姿態角(pitch,roll,yaw),然後存入FIFO中,這個過程在你初始化完DMP後就會不受人為控制的持續進行,那麼如果你不及時讀取FIFO的數據,FIFO數據很快就會溢出,那麼就會出現以上的問題啦!

  好了,說了那麼一大堆,問題該如何解決呢? 其實很簡答啦,只要一個簡單循環其實就解決了!看如下的程序:

  while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0){}

  就是上面這麼一句話,如果讀取失敗,馬上進行第二次讀取,這時候FIFO一般沒有溢出,搞定!(因為檢測到FIFO溢出後會馬上reset一下FIFO)。

  最後上一發圖:

  

  

  int dmp_read_fifo(short *gyro, short *accel, long *quat,

  unsigned long *timestamp, short *sensors, unsigned char *more)

  {

  unsigned char fifo_data[MAX_PACKET_LENGTH];

  unsigned char ii = 0;

  /* TODO: sensors[0] only changes when dmp_enable_feature is called. We can

  * cache this value and save some cycles.

  */

  sensors[0] = 0;

  /* Get a packet. */

  if (mpu_read_fifo_stream(dmp.packet_length, fifo_data, more))

  return -1;

  /* Parse DMP packet. */

  if (dmp.feature_mask & (DMP_FEATURE_LP_QUAT | DMP_FEATURE_6X_LP_QUAT)) {

  #ifdef FIFO_CORRUPTION_CHECK

  long quat_q14[4], quat_mag_sq;

  #endif

  quat[0] = ((long)fifo_data[0] 《《 24) | ((long)fifo_data[1] 《《 16) |

  ((long)fifo_data[2] 《《 8) | fifo_data[3];

  quat[1] = ((long)fifo_data[4] 《《 24) | ((long)fifo_data[5] 《《 16) |

  ((long)fifo_data[6] 《《 8) | fifo_data[7];

  quat[2] = ((long)fifo_data[8] 《《 24) | ((long)fifo_data[9] 《《 16) |

  ((long)fifo_data[10] 《《 8) | fifo_data[11];

  quat[3] = ((long)fifo_data[12] 《《 24) | ((long)fifo_data[13] 《《 16) |

  ((long)fifo_data[14] 《《 8) | fifo_data[15];

  ii += 16;

  #ifdef FIFO_CORRUPTION_CHECK

  /* We can detect a corrupted FIFO by monitoring the quaternion data and

  * ensuring that the magnitude is always normalized to one. This

  * shouldn『t happen in normal operation, but if an I2C error occurs,

  * the FIFO reads might become misaligned.

  *

  * Let’s start by scaling down the quaternion data to avoid long long

  * math.

  */

  quat_q14[0] = quat[0] 》》 16;

  quat_q14[1] = quat[1] 》》 16;

  quat_q14[2] = quat[2] 》》 16;

  quat_q14[3] = quat[3] 》》 16;

  quat_mag_sq = quat_q14[0] * quat_q14[0] + quat_q14[1] * quat_q14[1] +

  quat_q14[2] * quat_q14[2] + quat_q14[3] * quat_q14[3];

  if ((quat_mag_sq 《 QUAT_MAG_SQ_MIN) ||

  (quat_mag_sq 》 QUAT_MAG_SQ_MAX)) {

  /* Quaternion is outside of the acceptable threshold. */

  mpu_reset_fifo();

  sensors[0] = 0;

  return -1;

  }

  sensors[0] |= INV_WXYZ_QUAT;

  #endif

  }

  if (dmp.feature_mask & DMP_FEATURE_SEND_RAW_ACCEL) {

  accel[0] = ((short)fifo_data[ii+0] 《《 8) | fifo_data[ii+1];

  accel[1] = ((short)fifo_data[ii+2] 《《 8) | fifo_data[ii+3];

  accel[2] = ((short)fifo_data[ii+4] 《《 8) | fifo_data[ii+5];

  ii += 6;

  sensors[0] |= INV_XYZ_ACCEL;

  }

  if (dmp.feature_mask & DMP_FEATURE_SEND_ANY_GYRO) {

  gyro[0] = ((short)fifo_data[ii+0] 《《 8) | fifo_data[ii+1];

  gyro[1] = ((short)fifo_data[ii+2] 《《 8) | fifo_data[ii+3];

  gyro[2] = ((short)fifo_data[ii+4] 《《 8) | fifo_data[ii+5];

  ii += 6;

  sensors[0] |= INV_XYZ_GYRO;

  }

  /* Gesture data is at the end of the DMP packet. Parse it and call

  * the gesture callbacks (if registered)。

  */

  if (dmp.feature_mask & (DMP_FEATURE_TAP | DMP_FEATURE_ANDROID_ORIENT))

  decode_gesture(fifo_data + ii);

  get_ms(timestamp);

  return 0;

  }

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • FB廣告數據如何讀取,如何整理數據,如何分析?【資源片】
    我在上幾篇文章中已經講到了投放廣告的幾種方式,但是投放好了之後我們如何讀取數據,怎麼分析,如何利用數據進一步確定該廣告是盈利的並且根據廣告的表現決定下一步 等等這些問題是非常重要的,今天我們探討一下其中的兩個問題,我們要讀取的數據有哪些
  • FB廣告數據如何讀取,如何整理數據,如何分析?「資源片」
    我在上幾篇文章中已經講到了投放廣告的幾種方式,但是投放好了之後我們如何讀取數據,怎麼分析,如何利用數據進一步確定該廣告是盈利的並且根據廣告的表現決定下一步 等等這些問題是非常重要的,今天我們探討一下其中的兩個問題,我們要讀取的數據有哪些?我們從後臺如何分析這些數據?
  • 教大家解析包時出現問題怎麼解決
    安卓手機apk安裝時解析包出現問題怎麼辦?大家的安卓手機在安裝apk程序途中彈出「解析包時出現問題」這樣的提示,會不會覺得很揪心呢?那麼安卓解析包出現問題有沒有好的解決辦法呢?安卓手機解析包時出現問題的解決方法:1、安卓apk程序解析包出現問題的話,可能是由於你下載的apk程序本身就有問題,程序的壓縮包可能在下載過程中被損壞了,建議請重新下載一次。
  • 當貝市場分享解決方法:夏普電視解析軟體包時出現問題?
    問題:最近有不少用戶反映自己的夏普電視在安裝軟體時,出現了解析軟體包錯誤的情況,無法順利安裝,想知道如何解決。  原因:在安裝軟體時出現解析包錯誤一般有三方面的原因。一是U盤的問題,如果使用了質量較差有問題的U盤,即使存入U盤的數據容量大於實際內存容量,程序也不會報錯,但其實數據早已丟失。
  • Python數據分析:pandas讀取和寫入數據
    我的公眾號是關於自己在數據分析/挖掘學習過程中的一些技術和總結分享,文章會持續更新......繼續深入學習pandas相關操作,數據讀取寫入、分組、合併,轉換等等。前面一篇文章裡已經寫了關於描述性統計以及常用的基本操作。接下來的一段時間裡,我將陸續地去掌握並輸出。這篇文章是關於數據讀取與寫入的知識點。
  • Client-go Informer之 DeltaFIFO隊列
    其實如果你項目中要自己實現FIFO,可以把這段抄進去直接使用,client-go都幫你驗證過了,實際使用問題不大的,但是注意一點,就是client-go中的FIFO隊列是針對對象的,重複對象添加是會覆蓋的。要是你的應用不需要這個特性,就需要改改了。DeltaFIFO什麼是 DeltaFIFOFIFO的意思是先入先出,而Delta的意思是增量。
  • 夏普電視解析軟體包時出現問題?當貝市場分享詳細解決方法,需要的...
    問題:最近有不少用戶反映自己的夏普電視在安裝軟體時,出現了解析軟體包錯誤的情況,無法順利安裝,想知道如何解決。  原因:在安裝軟體時出現解析包錯誤一般有三方面的原因。一是U盤的問題,如果使用了質量較差有問題的U盤,即使存入U盤的數據容量大於實際內存容量,程序也不會報錯,但其實數據早已丟失。
  • 談談著名的緩衝區溢出
    其中緩衝區溢出發生在棧裡,棧存放了函數的參數、返回地址、EBP(EBP是當前函數的存取指針,即存儲或者讀取數時的指針基地址,可以看成一個標準的函數起始代碼)和局部變量。結構如下:當函數中對局部變量的賦值超過了為其分配的存儲空間,超出的部分就會覆蓋棧裡其他部分的數據,也就是發生了緩衝區溢出。
  • 夏普電視解析軟體包時出現問題?詳細解決方法送你,當貝市場分享
    問題:最近有不少用戶反映自己的夏普電視在安裝軟體時,出現了解析軟體包錯誤的情況,無法順利安裝,想知道如何解決。 原因:在安裝軟體時出現解析包錯誤一般有三方面的原因。
  • 8種方法解決提示「解析軟體包時出現錯誤」問題
    最近許多朋友都反映碰到了「解析軟體包時出現錯誤」的問題,那麼遇到這樣的問題該如何解決?其實導致apk程序安裝失敗的原因是多方面的,因此,我們只有採取逐個排查的方法來找到apk程序不能安裝的原因。下面就給大家列舉8種出現問題的原因及解決方法。
  • 華為AP6050DN濟南 百穀400-630-1699
    【中關村在線山東行情】華為AP6050DN無線接入器,近日在商家「山東百穀信息技術有限公司」特價促銷,價格面議,好物好價,值得您入手!感興趣的朋友可直接前往濟南市歷下區花園路189-2號歷下軟體園乙座317詳詢,關於華為AP6050DN無線接入器的促銷信息也可諮詢(聯繫電話:18954172301 0531-83196110 400-630-1699 )該商家。
  • 一個參數一張Excel表,玩轉Pandas的read_excel()表格讀取
    作者 | 黃偉呢來源 | 數據分析與統計學之美我覺得很有必要講述這個文章,進行數據處理的第一步就是Python數據讀取。但是你可能沒想到,在進行數據讀取的同時,我們其實可以配合相關參數做很多事兒,這對於後續的數據處理都是極其有幫助。
  • Switch移植版最終幻想合集使用32GB遊戲卡帶
    之前我們3DM已經報導過《最終幻想10》、《最終幻想10-2》以及《最終幻想12:黃道時代》三款遊戲將於4月登陸XboxOne與Switch平臺,以上三款遊戲的移植工作都是維塔士負責。最近,有媒體專門就Switch版的移植工作對這家公司進行了採訪。
  • 小心避坑:MySQL分頁時使用 limit+order by 會出現數據重複問題
    之所以MySQL 5.6出現了第二頁數據重複的問題,是因為 priority queue 使用了堆排序的排序方法,而堆排序是一個不穩定的排序方法,也就是相同的值可能排序出來的結果和讀出來的數據順序不一致。MySQL 5.5 沒有這個優化,所以也就不會出現這個問題。
  • R語言中使用scan函數讀取文件中的數據
    要讀取的文本文件中的數據可以使用下面的語句從該文件中讀取出數據:(1)scan("student.txt", what="c") #以字符串的格式讀取數據(2)scan("student.txt,其它兩種格式,將所有變量(欄位)中的數據混到一起了,在處理時不夠方便。
  • 風電場用風功率採集測風塔數據報文格式解析淺談
    目前主流市場上測風塔用的數採器的數據格式主要分為兩種:短整型數據(short)和單精度浮點型(float)。短整型數據佔用兩個字節,又分為有符號整型數據(signed)和無符號短整型數據(unsigned )單精度浮點型數據佔用四個字節由於不同的數採器對於多字節數據的存儲方式不同,在解析報文時首先需要解決字節存儲順序問題。
  • 安裝APK軟體時發生「解析包時出現錯誤」的9大解決方法
    安裝APK軟體時發生「解析包時出現錯誤」的9大解決方法 相信許多使用Android智能電視的用戶都會或多或少的遇到到這樣的問題:解析包時出現錯誤。那麼遇到這樣的問題該如何解決?
  • Xilinx MIG IP核的研究及大容量數據緩衝區的實現
    其中,DDR3的出現給整個行業帶來了不可限量的跨越,這使得我們在工程中對DDR3更加青睞。DDR3(double-data-rate three synchronous dynamic random access memory)是應用在計算機及電子產品領域的一種高帶寬並行數據存儲設備,廣泛應用於工程設計中。
  • 如何在Visual Studio中創建excel並讀取數據
    技術pythondjangoexcel在Visual Studio開發工具中,創建python項目,然後安裝xlwt和xlrd第三方庫,使用xlwt創建excel文件並寫入數據,使用xlrd讀取excel文件中的數據。
  • JVM中十種內存溢出的解決方法
    導言:對於java程式設計師來說,在虛擬機自動內存管理機制的幫助下,不需要自己實現釋放內存,不容易出現內存洩漏和內存溢出的問題,由虛擬機管理內存這一切看起來非常美好,但是一旦出現內存溢出或者內存洩漏的問題,對於不熟悉jvm虛擬機是怎麼使用內存的話,那麼排查錯誤將會是一項非常艱巨的任務。所以在了解內存溢出之前先要搞明白JVM的內存模型。