在龍芯1c微控制器上獲取MPU6050的原始資料

2021-08-20 09:28:00 字數 2793 閱讀 1361

mpu6050和其它感測器有類似的地方,也有不同的地方。

類似的地方是輸出乙個物理量,比如加速度值,角速度值,溫度值等。

不同的地方是mpu6050輸出的資料可以通過一些演算法處理後,得到一些更「高階」、更「人性化」的一些概念和資料。比如,可以將mpu6050輸出的資料處理後,得到當前的運動狀態,甚至通過分析一些小動作(運動狀態)來獲取當時的感情等。

手環、智慧型手錶、現在很多手機都可以記步了,即記錄走了多少步。

只需要乙個3軸加速度計就可以了,即只需要mpu6050中的加速度計就可以了,也就是說如果只是為了做計步器的話,mpu6050有點浪費了(浪費了其中的陀螺儀功能),網上有用3軸加速度計adxl345做計步器的文章,感興趣的可以搜一下。簡單來說就是在走路的時候,加速度計的資料會呈現乙個正弦波的波形,只需要檢測波峰波谷的個數,即可實現計步。當然如果要提高精度什麼的,還需要應用一些演算法等。

通過檢測加速度計的值來判斷是否有震動。比如,用指關節敲兩下手機螢幕,就可以截圖。我猜用的原理大概就這個吧。還有,當手機的鬧鐘或者**響起時,只需要把手機翻轉一下,即把螢幕朝下,手機就會自動靜音。翻轉這個動作已經表達了手機使用者的態度或者情感,所以手機會自動靜音,這種互動方式更自然,更人性化。這裡翻轉手機可能需要用到陀螺儀,檢測角速度。

平衡車和無人機類似,都是通過將加速度計和陀螺儀的值融合後,得到傾角,即姿態(角)。然後根據當前姿態,用pid演算法調整電機的轉速和方向。本文重點以平衡車為例來討論。

原始資料是指直接從mpu6050讀出來的值,即加速度值和角速度值。

一些應用場景中只需要這個原始資料即可,可是有一些應用場景需要對原始資料進一步轉化。比如,平衡車和無人機需要的是傾角,即xyz每個軸的傾角,又稱姿態。後面會講解怎麼進行姿態解算,即怎樣從原始資料一步一步轉化為傾角的。

先來張實物圖吧,如下

圖中,是將mpu6050模組接在白菜板v2.1上測試的。測試過程中需要不斷改變mpu6050模組的姿態,為了便於調整姿態,將mpu6050模組用膠布粘在了乙個棍棒上。

來看下mpu6050的各個軸的方向,如下圖所示

當加速度的方向與每個軸的方向相同時為正,相反時為負。

當mpu6050模組靜止時,會收到重力加速度,並且方向始終向下。通過調整mpu6050的姿態,將重力加速度的方向分別與x,y和z軸重合,此時獲取到的加速度值(原始資料)應該是重力加速度。

mpu6050水平放置時,z軸的加速度值約等於重力加速度1g,如下

mpu6050垂直放置時,x軸的加速度值,如下圖

mpu6050垂直放置時,y軸的加速度值,如下圖

注意,x軸加速度值為1g時,和y軸加速度值為1g時,兩個的垂直方向是不一樣的。即姿態不一樣。再去看看兩個截圖中mpu6050模組的姿態是不是一樣的。

角速度和加速度不一樣,角速度是旋轉的方向,即旋轉的方向和mpu6050晶元手冊中每個軸的方向一致,則為正,相反,則為負。再來看下晶元手冊中的有關方向的圖,如下

圍繞x軸旋轉時,測量的加速度值如下

圍繞y軸旋轉時,測量的加速度值如下

圍繞z軸旋轉時,測量的加速度值如下

對於平衡車來說,只需要獲取乙個軸上的傾角即可,常稱為俯仰角。對於四軸無人機來說,需要獲取三個軸的傾角,根據每個軸上的傾角的作用不同,將這三個傾角分別命名為俯仰角,滾轉角和偏航角。

姿態解算方法有多種,比如四元數法,一階互補濾波法,卡爾曼濾波。我個人認為一階互補濾波法比較適合入門,這裡以平衡車上採用一階互補濾波演算法為例來講解。

前面已經獲取到了mpu6050的原始資料,即xyz軸的加速度值和xyz軸的角速度值,可是怎樣才能得到傾角值呢?

方法有很多,比如把加速度值用三角函式算出重力加速度與z軸的夾角(假設mpu6050水平放置),這個夾角就是俯仰角。又比如,把角速度積分可以得到角度,即俯仰角。

俯仰角這個名詞很形象,自己慢慢體會吧。

理論上,用加速度值和角速度值都可以算出俯仰角,實際上兩者各有缺點。比如,積分會使誤差累積,很快誤差就會達到不可接受的程度。而用三角函式這種方法看似很好,即三角函式本身不會引入誤差,但由於平衡車運動時會產生加速度,電機的震動也會產生加速度等,這些干擾因素影響了加速度值的準確性,所以由加速度值轉換得到的俯仰角也是有誤差的。即不能單獨使用加速度值和角速度值來獲取準確的俯仰角。

一階互補濾波法就是給兩種方法算出來的俯仰角加上不同的權值,然後再結合起來,得到乙個更準確的俯仰角。

得到了俯仰角就用pid演算法控制電機轉速和方向,最終實現俯仰角為0,即小車直立。

感謝閱讀!

6 在微控制器上使用c

cuitech 軟體練習 建立通用庫 大綱 echoiot.com 這篇不做強制要求,感興趣的同學可以了解。目前我接觸過的大部分微控制器ide都是支援c 的基礎特性的。除了51 c 中相對來說更強調封裝性一點,比如類啊,namespace啊,還有inline啊 對於微控制器來說,使用c 最大的優點是...

在龍芯1c上用RT Thread列印hello

rt thread的官方git是 rt thread官方的 rt thread程式設計指南 中有新建執行緒的例子,這裡參考裡面的例子新建乙個靜態執行緒,並在新建的執行緒中列印hello。先來看看 rt thread程式設計指南 中關於靜態執行緒的介紹 在文件中,緊隨其後有例子。總結一下就是先定義好執...

卡爾曼濾波在微控制器上的使用

ifndef kalman h define kalman h extern kalmangain 卡爾曼增益 extern estimatecovariance 估計協方差 extern measurecovariance 測量協方差 extern estimatevalue 估計值 extern...