一羽德、介紹
?? MPU6050是世界上第一款也是唯一一款專為智能手機(jī)、平板電腦和可穿戴傳感器的低功耗迅办、低成本和高性能要求而設(shè)計(jì)的6軸運(yùn)動(dòng)跟蹤設(shè)備宅静。
?? 它集成了3軸MEMS陀螺儀,3軸MEMS加速度計(jì)站欺,以及一個(gè)可擴(kuò)展的數(shù)字運(yùn)動(dòng)處理器 DMP( DigitalMotion Processor)姨夹,可用I2C接口連接一個(gè)第三方的數(shù)字傳感器,比如磁力計(jì)镊绪。擴(kuò)展之后就可以通過其 I2C或SPI接口輸出一個(gè)9軸的信號(hào)( SPI接口僅在MPU-6000可用)匀伏。 MPU-60X0也可以通過其I2C接口連接非慣性的數(shù)字傳感器,比如壓力傳感器蝴韭。
??其它I2C總線實(shí)驗(yàn)可以查看前面的PCF8591相關(guān)實(shí)驗(yàn)够颠,如:
??樹莓派基礎(chǔ)實(shí)驗(yàn)12:PCF8591模數(shù)轉(zhuǎn)換器實(shí)驗(yàn)
二、組件
★Raspberry Pi主板*1
★樹莓派電源*1
★40P軟排線*1
★MPU6050陀螺儀加速度傳感器模塊*1
★面包板*1
★跳線若干
三榄鉴、實(shí)驗(yàn)原理
?? MPU6050的工作原理比較復(fù)雜履磨,需要深度學(xué)習(xí)最好是學(xué)習(xí)官方手冊(cè)蛉抓,本文只做簡(jiǎn)單介紹。
?? 詳細(xì)資料可在官網(wǎng)下載最新的芯片手冊(cè):
https://invensense.tdk.com/products/motion-tracking/6-axis/mpu-6050/
1.傳感器
?? ①陀螺儀傳感器:
?? 陀螺儀的原理就是剃诅,一個(gè)旋轉(zhuǎn)物體的旋轉(zhuǎn)軸所指的方向在不受外力影響時(shí)巷送,是不會(huì)改變的。人們根據(jù)這個(gè)道理矛辕,用它來(lái)保持方向笑跛。然后用多種方法讀取軸所指示的方向,并自動(dòng)將數(shù)據(jù)信號(hào)傳給控制系統(tǒng)聊品。我們騎自行車其實(shí)也是利用了這個(gè)原理飞蹂。輪子轉(zhuǎn)得越快越不容易倒,因?yàn)檐囕S有一股保持水平的力量翻屈。
??現(xiàn)代陀螺儀可以精確地確定運(yùn)動(dòng)物體的方位的儀器陈哑,它在現(xiàn)代航空,航海伸眶,航天和國(guó)防工業(yè)中廣泛使用的一種慣性導(dǎo)航儀器惊窖。傳統(tǒng)的慣性陀螺儀主要部分有機(jī)械式的陀螺儀,而機(jī)械式的陀螺儀對(duì)工藝結(jié)構(gòu)的要求很高厘贼。
??70年代提出了現(xiàn)代光纖陀螺儀的基本設(shè)想界酒,到八十年代以后,光纖陀螺儀就得到了非常迅速的發(fā)展涂臣,激光諧振陀螺儀也有了很大的發(fā)展盾计。光纖陀螺儀具有結(jié)構(gòu)緊湊,靈敏度高赁遗,工作可靠署辉。光纖陀螺儀在很多的領(lǐng)域已經(jīng)完全取代了機(jī)械式的傳統(tǒng)的陀螺儀,成為現(xiàn)代導(dǎo)航儀器中的關(guān)鍵部件岩四。光纖陀螺儀同時(shí)發(fā)展的除了環(huán)式激光陀螺儀外哭尝。
??MPU-60X0由三個(gè)獨(dú)立的振動(dòng)MEMS速率陀螺儀組成,可檢測(cè)旋轉(zhuǎn)角度X軸剖煌,Y軸和Z軸材鹦。 當(dāng)陀螺儀圍繞任何感應(yīng)軸旋轉(zhuǎn)時(shí),科里奧利效應(yīng)就會(huì)產(chǎn)生電容式傳感器檢測(cè)到的振動(dòng)耕姊。 所得到的信號(hào)被放大桶唐,解調(diào)和濾波產(chǎn)生與角速度成比例的電壓。 該電壓使用單獨(dú)的片內(nèi)數(shù)字化16位模數(shù)轉(zhuǎn)換器(ADC)對(duì)每個(gè)軸進(jìn)行采樣茉兰。 陀螺儀傳感器可以全面范圍的被數(shù)字編程為每秒±250尤泽,±500,±1000或±2000度(dps)。 ADC樣本速率可以從每秒8,000個(gè)采樣點(diǎn)編程到每秒3.9個(gè)采樣點(diǎn)坯约,并且可由用戶選擇低通濾波器可實(shí)現(xiàn)廣泛的截止頻率熊咽。
??②加速度傳感器:
??加速度傳感器是一種能夠測(cè)量加速度的傳感器。通常由質(zhì)量塊闹丐、阻尼器横殴、彈性元件、敏感元件和適調(diào)電路等部分組成卿拴。傳感器在加速過程中衫仑,通過對(duì)質(zhì)量塊所受慣性力的測(cè)量,利用牛頓第二定律獲得加速度值巍棱。根據(jù)傳感器敏感元件的不同惑畴,常見的加速度傳感器包括電容式蛋欣、電感式航徙、應(yīng)變式、壓阻式陷虎、壓電式等到踏。
??MPU-60X0的3軸加速度計(jì)為每個(gè)軸使用單獨(dú)的檢測(cè)質(zhì)量。 加速沿著一條特定軸在相應(yīng)的檢測(cè)質(zhì)量上引起位移尚猿,并且電容式傳感器檢測(cè)到該位移位移有差別窝稿。 MPU-60X0的架構(gòu)降低了加速度計(jì)的敏感度制造變化以及熱漂移。 當(dāng)設(shè)備放置在平坦的表面上時(shí)凿掂,將進(jìn)行測(cè)量在X和Y軸上為 0g伴榔,在Z軸上為+ 1g。 加速度計(jì)的比例因子在工廠進(jìn)行校準(zhǔn)并且在名義上與電源電壓無(wú)關(guān)庄萎。 每個(gè)傳感器都有一個(gè)專用的sigma-delta ADC來(lái)提供數(shù)字輸出踪少。 數(shù)字輸出的滿量程范圍可以調(diào)整到±2g,±4g糠涛,±8g或±16g援奢。
??其實(shí)說簡(jiǎn)單點(diǎn),在mpu6050中我們用陀螺儀傳感器測(cè)角度忍捡,用加速度傳感器測(cè)加速度集漾。
?? MPU-60X0是全球首例9軸運(yùn)動(dòng)處理傳感器。它集成了3軸MEMS陀螺儀砸脊, 3軸MEMS 加速度計(jì)具篇,以及一個(gè)可擴(kuò)展的數(shù)字運(yùn)動(dòng)處理器 DMP(DigitalMotion Processor),可用 I2C 接口連接一個(gè)第三方的數(shù)字傳感器凌埂,比如磁力計(jì)驱显。擴(kuò)展之后就可以通過其 I2C 或 SPI 接口 輸出一個(gè) 9 軸的信號(hào)(SPI 接口僅在 MPU-6000 可用)。MPU-60X0 也可以通過其 I2C 接口連接非慣性的數(shù)字傳感器,比如壓力傳感器秒紧。
數(shù)字運(yùn)動(dòng)處理器(DMP):
??嵌入式數(shù)字運(yùn)動(dòng)處理器(DMP)位于MPU-60X0內(nèi)部绢陌,可從主機(jī)處理器中卸載運(yùn)動(dòng)處理算法的運(yùn)算。 DMP從加速度計(jì)熔恢,陀螺儀以及其他第三方傳感器(如磁力計(jì))獲取數(shù)據(jù)脐湾,并處理數(shù)據(jù)。結(jié)果數(shù)據(jù)可以從DMP的寄存器中讀取叙淌,或者可以在FIFO中緩沖秤掌。 DMP可以訪問其中的一個(gè)MPU的外部引腳,可用于產(chǎn)生中斷鹰霍。
??DMP的目的是卸載主機(jī)處理器的時(shí)序要求和處理能力闻鉴。通常,運(yùn)動(dòng)處理算法應(yīng)該以高速運(yùn)行茂洒,通常在200Hz左右孟岛,以提供低延遲的精確結(jié)果。即使應(yīng)用程序以更低的速率更新督勺,這也是必需的渠羞。例如,一個(gè)低功率的用戶界面可能會(huì)以5Hz的速度更新智哀,但運(yùn)動(dòng)處理仍然應(yīng)該以200Hz運(yùn)行次询。 DMP可以作為一種工具使用,以最大限度地降低功耗瓷叫,簡(jiǎn)化定時(shí)屯吊,簡(jiǎn)化軟件架構(gòu),并在主機(jī)處理器上節(jié)省寶貴的MIPS摹菠,以便在應(yīng)用中使用盒卸。
2.數(shù)據(jù)分析
(1)加速度計(jì)
??下圖標(biāo)明了傳感器的參考坐標(biāo)系( XYZ組成右手系)以及 3個(gè)測(cè)量軸和旋轉(zhuǎn)方向。旋轉(zhuǎn)的正向可用右手螺旋定則判斷:
三軸加速度計(jì):
ACCEL_XOUT 16位二進(jìn)制補(bǔ)碼值辨嗽。存儲(chǔ)最近的X軸加速計(jì)測(cè)量值世落。
ACCEL_YOUT 16位二進(jìn)制補(bǔ)碼值。存儲(chǔ)最近的Y軸加速度計(jì)測(cè)量值糟需。
ACCEL_ZOUT 16位二進(jìn)制補(bǔ)碼值屉佳。存儲(chǔ)最近的Z軸加速計(jì)測(cè)量值。
??三個(gè)加速度分量均以重力加速度 g 的倍數(shù)為單位洲押,能夠表示的加速度范圍武花,即倍率可以統(tǒng)一設(shè)定,有4個(gè)可選倍率:±2g杈帐、±4g体箕、±8g专钉、±16g。初始化MPU6050設(shè)置加速度計(jì)輸出的滿量程范圍為± 2g累铅,加速度計(jì)每個(gè) LSB 的靈敏度應(yīng)為 16384 LSB/g跃须。
滿量程范圍± 2g和靈敏度16384 LSB/g有啥關(guān)系?
??上面說了這三個(gè)加速度分量是16位的二進(jìn)制補(bǔ)碼值,且是有符號(hào)的娃兽。故而其輸出范圍 -32768~32767菇民。((2^16)/2)
??32767/2 = 16384 即加速度計(jì)的靈敏度。
那這個(gè)靈敏度又有啥用呢投储?我們拿一組數(shù)據(jù)來(lái)舉個(gè)例子:
??A X: 03702 Y: 12456 Z: 06268 G X:-00023 Y:-00059 Z: 00005
??加速度計(jì) X 軸獲取原始數(shù)據(jù)位 03702第练,那么它對(duì)應(yīng)的加速度數(shù)據(jù)是:03702/16384 = 0.23g.
??g為加速度的單位,重力加速度定義為1g, 等于9.8米每平方秒玛荞。
??具體的加速度公式:加速度數(shù)據(jù) = 加速度軸原始數(shù)據(jù) / 加速度靈敏度
??或者:加速度數(shù)據(jù) = (加速度軸原始數(shù)據(jù) / 32767) X 可選倍率(即±2g娇掏、±4g、±8g勋眯、±16g)
(2)陀螺儀
三軸陀螺儀:
GYRO_XOUT 16位二進(jìn)制補(bǔ)碼值婴梧。存儲(chǔ)最新的X軸陀螺儀測(cè)量。
GYRO_YOUT 16位二進(jìn)制補(bǔ)碼值凡恍。存儲(chǔ)最新的Y軸陀螺儀測(cè)量結(jié)果志秃。
GYRO_ZOUT 16位二進(jìn)制補(bǔ)碼值。存儲(chǔ)最新的Z軸陀螺儀測(cè)量結(jié)果嚼酝。
??三個(gè)角速度分量均以“度/秒”為單位,能夠表示的角速度范圍竟坛,即倍率可統(tǒng)一設(shè)定闽巩,有4個(gè)可選倍率:±250°/s, ±500°/s担汤, ±1000°/s涎跨, ±2000°/s。初始化MPU6050設(shè)置陀螺儀輸出滿量程范圍為 ± 2000 °/s崭歧,陀螺儀每個(gè) LSB 的靈敏度為 16.4 LSB/°/s隅很。
滿量程范圍± 2000 °/s和靈敏度16.4 LSB/°/s有啥關(guān)系?
??上面說了這三個(gè)陀螺儀分量是16位的二進(jìn)制補(bǔ)碼值,且是有符號(hào)的率碾。故而其輸出范圍 -32768~32767叔营。((2^16)/2)
??32767/2000 = 16.4 即陀螺儀的靈敏度。
那這個(gè)靈敏度又有啥用呢所宰?我們用一組數(shù)據(jù)來(lái)舉個(gè)例子:
??A X: 03702 Y: 12456 Z: 06268 G X:-00023 Y:-00059 Z: 00005
??陀螺儀 X 軸獲取原始數(shù)據(jù)位 -00023绒尊,那么它對(duì)應(yīng)的陀螺儀數(shù)據(jù)是:-00023/16.4 = -1.4°/s
??請(qǐng)注意,負(fù)號(hào)表示設(shè)備的旋轉(zhuǎn)方向與傳統(tǒng)的正方向相反仔粥。
??具體的陀螺儀公式:陀螺儀數(shù)據(jù) = 陀螺儀軸原始數(shù)據(jù)/陀螺儀靈敏度
??或者:陀螺儀數(shù)據(jù) = (陀螺儀軸原始數(shù)據(jù) / 32767) X 可選倍率(即±250°/s婴谱, ±500°/s蟹但, ±1000°/s, ±2000°/s)
??MPU6050 是一款姿態(tài)傳感器谭羔,使用它就是為了得到待測(cè)物體(如四軸华糖、平衡小車) x、y瘟裸、z 軸的傾角(俯仰角 Pitch缅阳、滾轉(zhuǎn)角 Roll、偏航角 Yaw) 景描。我們通過 I2C 讀取到 MPU6050 的六個(gè)數(shù)據(jù)(三軸加速度 AD 值十办、三軸角速度 AD 值)經(jīng)過姿態(tài)融合后就可以得到 Pitch、Roll超棺、Yaw 角向族。
??更多姿態(tài)融合等資料,可以參考MPU6050開發(fā)的帖子:
https://blog.csdn.net/qq_29350001/category_7303760.html
3.MPU6050寄存器
??這里說明幾個(gè)重要的寄存器棠绘,詳情查閱官方文檔件相。
(1)寄存器25 - 采樣速率分頻器(SMPRT_DIV)
參數(shù):
??SMPLRT_DIV 為8位無(wú)符號(hào)值。 采樣率是通過將陀螺儀輸出速率除以該值來(lái)確定的氧苍。
描述:
??該寄存器指定用于產(chǎn)生MPU-60X0采樣率的陀螺儀輸出速率的分頻器夜矗。傳感器寄存器輸出,F(xiàn)IFO輸出和DMP采樣都基于采樣率让虐。采樣率是通過將陀螺儀輸出速率除以 SMPLRT_DIV 產(chǎn)生的:
采樣率=陀螺儀輸出速率/(1 + SMPLRT_DIV)
當(dāng)DLPF禁用(DLPF_CFG = 0或7)時(shí)紊撕,陀螺儀輸出速率= 8kHz,當(dāng)DLPF使能時(shí)(見寄存器26)為1kHz赡突。
??注意:加速度計(jì)輸出速率是1kHz对扶。 這意味著對(duì)于大于1kHz的采樣率,同一個(gè)加速度計(jì)采樣可能會(huì)不止一次輸出到FIFO惭缰,DMP和傳感器寄存器浪南。
(2)寄存器26 - 配置(CONFIG)
注:位7和位6保留
參數(shù):
??EXT_SYNC_SET3位無(wú)符號(hào)值。 配置FSYNC引腳采樣漱受。
??DLPF_CFG3位無(wú)符號(hào)值络凿。 配置DLPF設(shè)置
描述:
??該寄存器為陀螺儀和加速度計(jì)配置外部幀同步(FSYNC)引腳采樣和數(shù)字低通濾波器(DLPF)設(shè)置。
??連接到FSYNC引腳的外部信號(hào)可以通過配置 EXT_SYNC_SET 進(jìn)行采樣昂羡。
??FSYNC 引腳的信號(hào)變化被鎖存絮记,以便捕獲短閃光燈。 鎖存的FSYNC信號(hào)將按照寄存器 25 中定義的采樣速率進(jìn)行采樣紧憾。采樣后到千,鎖存器將復(fù)位為當(dāng)前的 FSYNC 信號(hào)狀態(tài)。
??根據(jù)下表赴穗,取樣值將被報(bào)告在由 EXT_SYNC_SET 的值確定的傳感器數(shù)據(jù)寄存器中的最低有效位的位置憔四。
??DLPF由 DLPF_CFG 配置膀息,加速度計(jì)和陀螺儀根據(jù) DLPF_CFG 的值進(jìn)行過濾,如下表所示了赵。
(3)寄存器27 - 陀螺儀配置(GYRO_CONFIG)
注:位2到位0被保留潜支。
參數(shù):
??XG_ST設(shè)置此位將導(dǎo)致X軸陀螺儀執(zhí)行自檢。
??YG_ST設(shè)置此位將使Y軸陀螺儀執(zhí)行自檢柿汛。
??ZG_ST 設(shè)置該位使Z軸陀螺儀執(zhí)行自檢冗酿。
??FS_SEL 2位無(wú)符號(hào)值。 選擇陀螺儀的全量程范圍络断。
描述:
??該寄存器用于觸發(fā)陀螺儀自檢并配置陀螺儀的滿量程范圍裁替。
??陀螺儀自檢允許用戶測(cè)試機(jī)械和電氣部分陀螺儀。每個(gè)陀螺儀軸的自檢可通過控制該寄存器的XG_ST貌笨,YG_ST和ZG_ST位來(lái)激活弱判。每個(gè)軸的自檢可以獨(dú)立進(jìn)行,也可以同時(shí)進(jìn)行锥惋。
??當(dāng)自檢被激活時(shí)昌腰,車載電子裝置將啟動(dòng)適當(dāng)?shù)膫鞲衅鳌_@種驅(qū)動(dòng)將使傳感器的檢測(cè)質(zhì)量移動(dòng)一段相當(dāng)于預(yù)先確定的科里奧利力的距離膀跌。這種檢測(cè)質(zhì)量位移導(dǎo)致傳感器輸出發(fā)生變化遭商,這反映在輸出信號(hào)中。輸出信號(hào)用于觀察自檢響應(yīng)捅伤。
自檢響應(yīng)定義如下:
??自檢響應(yīng)=啟用自檢的傳感器輸出 - 未啟用自檢的傳感器輸出
??每個(gè)陀螺儀軸的自檢限制在MPU-6000 / MPU-6050產(chǎn)品規(guī)格文件劫流。當(dāng)自檢的價(jià)值響應(yīng)在產(chǎn)品規(guī)格的最小/最大范圍內(nèi),零件已通過自??檢暑认。當(dāng)自檢響應(yīng)超過文檔中指定的最小/最大值時(shí)困介,該部分被認(rèn)為是自檢失敗。
??FS_SEL根據(jù)下表選擇陀螺儀輸出的滿量程范圍蘸际。
(4)寄存器28 - 加速度計(jì)配置(ACCEL_CONFIG)
參數(shù):
??XA_ST 當(dāng)設(shè)置為1時(shí),X軸加速度計(jì)執(zhí)行自檢徒扶。
??YA_ST當(dāng)設(shè)置為1時(shí)粮彤,Y軸加速度計(jì)執(zhí)行自檢。
??ZA_ST設(shè)置為1時(shí)姜骡,Z軸加速計(jì)執(zhí)行自檢导坟。
??AFS_SEL 2位無(wú)符號(hào)值。 選擇加速度計(jì)的全量程范圍圈澈。
描述:
??該寄存器用于觸發(fā)加速度計(jì)自檢并配置加速度計(jì)滿量程范圍惫周。該寄存器還配置數(shù)字高通濾波器(DHPF)。
??加速度計(jì)自檢允許用戶測(cè)試加速度計(jì)的機(jī)械和電子部分康栈。每個(gè)加速度計(jì)軸的自檢可通過控制該寄存器的XA_ST递递,YA_ST和ZA_ST位來(lái)激活喷橙。每個(gè)軸的自檢可以獨(dú)立進(jìn)行,也可以同時(shí)進(jìn)行登舞。
??當(dāng)自檢被激活時(shí)贰逾,車載電子裝置將啟動(dòng)適當(dāng)?shù)膫鞲衅鳌_@種致動(dòng)模擬外力菠秒。被驅(qū)動(dòng)的傳感器又將產(chǎn)生相應(yīng)的輸出信號(hào)疙剑。輸出信號(hào)用于觀察自檢響應(yīng)。
自測(cè)響應(yīng)定義如下:
??自檢響應(yīng)=啟用自檢的傳感器輸出 - 未啟用自檢的傳感器輸出
??MPU-6000 / MPU-6050產(chǎn)品規(guī)格文檔的電氣特性表中提供了每個(gè)加速度計(jì)軸的自檢限制践叠。當(dāng)自檢響應(yīng)值在產(chǎn)品規(guī)格的最小/最大范圍內(nèi)時(shí)言缤,該部件已通過自??檢。當(dāng)自測(cè)響應(yīng)超過文檔中指定的最小/最大值時(shí)禁灼,該部分被認(rèn)為是自檢失敗管挟。
??AFS_SEL 根據(jù)下表選擇加速度計(jì)輸出的滿量程范圍。
(5)寄存器59到64 - 加速度計(jì)測(cè)量
參數(shù):
??ACCEL_XOUT 16位二進(jìn)制補(bǔ)碼值匾二。存儲(chǔ)最近的X軸加速計(jì)測(cè)量值哮独。
??ACCEL_YOUT 16位二進(jìn)制補(bǔ)碼值。存儲(chǔ)最近的Y軸加速度計(jì)測(cè)量值察藐。
??ACCEL_ZOUT 16位二進(jìn)制補(bǔ)碼值皮璧。存儲(chǔ)最近的Z軸加速計(jì)測(cè)量值。
描述:
??這些寄存器存儲(chǔ)最新的加速度計(jì)測(cè)量結(jié)果分飞。
??按照 寄存器25 中定義的采樣率將加速度計(jì)測(cè)量值寫入這些寄存器悴务。
??加速度計(jì)測(cè)量寄存器以及溫度測(cè)量寄存器,陀螺儀測(cè)量寄存器和外部傳感器數(shù)據(jù)寄存器由兩組寄存器組成:內(nèi)部寄存器組和面向用戶的讀取寄存器組譬猫。
??加速度計(jì)傳感器內(nèi)部寄存器組內(nèi)的數(shù)據(jù)總是以采樣率更新讯檐。同時(shí),只要串行接口空閑染服,面向用戶的讀取寄存器組就會(huì)復(fù)制內(nèi)部寄存器組的數(shù)據(jù)值别洪。這保證了傳感器寄存器的突發(fā)讀取將從相同的采樣時(shí)刻讀取測(cè)量結(jié)果。請(qǐng)注意柳刮,如果不使用突發(fā)讀取挖垛,則用戶負(fù)責(zé)通過檢查數(shù)據(jù)就緒中斷來(lái)確保一組單個(gè)字節(jié)的讀取對(duì)應(yīng)于單個(gè)采樣時(shí)刻。
??每個(gè)16位加速度計(jì)的測(cè)量結(jié)果都在 ACCEL_FS(寄存器28)中定義了一個(gè)滿量程秉颗。對(duì)于每個(gè)滿量程設(shè)置痢毒,ACCEL_xOUT 中的每個(gè) LSB 的加速度計(jì)靈敏度如下表所示。
(6)寄存器65和66 - 溫度測(cè)量(TEMP_OUT_H和TEMP_OUT_L)
參數(shù):
??TEMP_OUT 16位有符號(hào)值蚕甥。存儲(chǔ)最近的溫度傳感器測(cè)量值哪替。
描述:
??這些寄存器存儲(chǔ)最新的溫度傳感器測(cè)量值。
??溫度測(cè)量值按照 寄存器25 中定義的采樣率寫入這些寄存器菇怀。
??這些溫度測(cè)量寄存器以及加速度計(jì)測(cè)量寄存器凭舶,陀螺儀測(cè)量寄存器和外部傳感器數(shù)據(jù)寄存器由兩組寄存器組成:內(nèi)部寄存器組和面向用戶的讀取寄存器組晌块。
??溫度傳感器內(nèi)部寄存器組內(nèi)的數(shù)據(jù)始終以采樣率進(jìn)行更新。
??同時(shí)库快,只要串行接口空閑摸袁,面向用戶的讀取寄存器組就會(huì)復(fù)制內(nèi)部寄存器組的數(shù)據(jù)值。這保證了傳感器寄存器的突發(fā)讀取將從相同的采樣時(shí)刻讀取測(cè)量結(jié)果义屏。請(qǐng)注意靠汁,如果不使用突發(fā)讀取,則用戶負(fù)責(zé)通過檢查數(shù)據(jù)就緒中斷來(lái)確保一組單個(gè)字節(jié)的讀取對(duì)應(yīng)于單個(gè)采樣時(shí)刻闽铐。
??電氣規(guī)格表(MPU-6000 / MPU-6050產(chǎn)品規(guī)格文檔第6.4節(jié))中提供了溫度傳感器的比例因子和偏移量蝶怔。
??對(duì)于給定的寄存器值,溫度(攝氏度)可以被計(jì)算為:
以℃為單位的溫度=(TEMP_OUT寄存器值作為有符號(hào)數(shù)量)/ 340 + 36.53
??請(qǐng)注意兄墅,上述公式中的數(shù)學(xué)是十進(jìn)制的踢星。
(7)寄存器67至72 - 陀螺儀測(cè)量
參數(shù):
??GYRO_XOUT 16位二進(jìn)制補(bǔ)碼值。存儲(chǔ)最新的X軸陀螺儀測(cè)量隙咸。
??GYRO_YOUT 16位二進(jìn)制補(bǔ)碼值沐悦。存儲(chǔ)最新的Y軸陀螺儀測(cè)量結(jié)果。
??GYRO_ZOUT16位二進(jìn)制補(bǔ)碼值五督。存儲(chǔ)最新的Z軸陀螺儀測(cè)量結(jié)果藏否。
描述:
??這些寄存器存儲(chǔ)最近的陀螺儀測(cè)量結(jié)果。
??陀螺儀測(cè)量值按寄存器25中定義的采樣率寫入這些寄存器充包。
這些陀螺儀測(cè)量寄存器以及加速度計(jì)測(cè)量寄存器副签,溫度測(cè)量寄存器和外部傳感器數(shù)據(jù)寄存器由兩組寄存器組成:內(nèi)部寄存器組和面向用戶的讀取寄存器組。
??陀螺儀傳感器內(nèi)部寄存器組內(nèi)的數(shù)據(jù)總是以采樣率更新基矮。
??同時(shí)淆储,只要串行接口空閑,面向用戶的讀取寄存器組就會(huì)復(fù)制內(nèi)部寄存器組的數(shù)據(jù)值家浇。這保證了傳感器寄存器的突發(fā)讀取將從相同的采樣時(shí)刻讀取測(cè)量結(jié)果本砰。請(qǐng)注意,如果不使用突發(fā)讀取钢悲,則用戶負(fù)責(zé)通過檢查數(shù)據(jù)就緒中斷來(lái)確保一組單個(gè)字節(jié)的讀取對(duì)應(yīng)于單個(gè)采樣時(shí)刻灌具。
??每個(gè)16位陀螺儀測(cè)量具有在 FS_SEL(寄存器27)中定義的滿量程。對(duì)于每個(gè)滿量程設(shè)置譬巫,GYRO_xOUT中陀螺儀每個(gè)LSB的靈敏度如下表所示:
(8)寄存器107 - 電源管理1 (PWR_MGMT_1)
注:位4保留。
參數(shù):
??DEVICE_RESET設(shè)置為1時(shí)督笆,該位將所有內(nèi)部寄存器復(fù)位為默認(rèn)值芦昔。一旦復(fù)位完成,該位自動(dòng)清零娃肿。每個(gè)寄存器的默認(rèn)值可以在第3節(jié)找到咕缎。
??SLEEP當(dāng)該位置1時(shí)珠十,該位將MPU-60X0置于睡眠模式。
??CYCLE當(dāng)該位設(shè)置為1且SLEEP被禁止時(shí)凭豪,MPU-60X0將循環(huán)焙蹭。在睡眠模式和喚醒之間以LP_WAKE_CTRL(寄存器108)確定的速率從活動(dòng)傳感器獲取單個(gè)樣本數(shù)據(jù)。
??TEMP_DIS設(shè)置為1時(shí)嫂伞,該位禁用溫度傳感器孔厉。
??CLKSEL 3位無(wú)符號(hào)值。 指定設(shè)備的時(shí)鐘源帖努。
描述:
??該寄存器允許用戶配置電源模式和時(shí)鐘源又固。它還提供了一些重置整個(gè)設(shè)備颊乘,以及一些禁用溫度傳感器。
??通過將 SLEEP 設(shè)置為1,MPU-60X0 可以進(jìn)入低功耗睡眠模式肢扯。當(dāng) CYCLE 設(shè)置為1而睡眠模式被禁用時(shí),MPU-60X0 將進(jìn)入循環(huán)模式香伴。在周期模式下揽趾,器件在休眠模式和喚醒之間循環(huán),以由 LP_WAKE_CTRL(寄存器108)確定的速率從加速計(jì)獲取單個(gè)采樣亭姥。要配置喚醒頻率稼钩,請(qǐng)使用 電源管理2寄存器(寄存器108)內(nèi)的 LP_WAKE_CTRL。
??MPU-60X0 時(shí)鐘源可選擇內(nèi)部 8MHz 振蕩器致份,基于陀螺儀的時(shí)鐘或外部時(shí)鐘源变抽。當(dāng)選擇內(nèi)部 8MHz 振蕩器或外部時(shí)鐘源作為時(shí)鐘源時(shí),MPU-60X0 可以在陀螺儀禁用的低功耗模式下工作氮块。
??上電時(shí)绍载,MPU-60X0 時(shí)鐘源默認(rèn)為內(nèi)部振蕩器。但是滔蝉,強(qiáng)烈建議將器件配置為使用其中一個(gè)陀螺儀(或外部時(shí)鐘源)作為時(shí)鐘參考击儡,以提高穩(wěn)定性。時(shí)鐘源可以按照下表進(jìn)行選擇蝠引。
(9)寄存器117 - 我是誰(shuí)(WHO_AM_I)
注:位0和7保留阳谍。 (硬編碼為0)
參數(shù):
??WHO_AM_I包含MPU-60X0的6位I2C地址。
??位6:位1的上電復(fù)位值為110 100螃概。
描述:
??**該寄存器用于驗(yàn)證設(shè)備的身份矫夯。 **WHO_AM_I的內(nèi)容是MPU-60X0的7位I2C地址的高6位。 MPU-60X0的I2C地址的最低有效位由AD0引腳的值決定吊洼。 該寄存器不反映AD0引腳的值训貌。
??該寄存器的默認(rèn)值是0x68。
四、實(shí)驗(yàn)步驟
??第1步:連接電路递沪。
樹莓派 | T型轉(zhuǎn)接板 | BMP180氣壓傳感器 |
---|---|---|
SCL | SCL | SCL |
SDA | SDA | SDA |
5V | 5V | VCC |
GND | GND | GND |
??第2步:PCF8591模塊采用的是I2C(IIC)總線進(jìn)行通信的豺鼻,但是在樹莓派的鏡像中默認(rèn)是關(guān)閉的,在使用該傳感器的時(shí)候款慨,我們必須首先允許IIC總線通信儒飒。
??第3步:查詢MPU6050的地址。得出地址為0x68檩奠。
pi@raspberrypi:~ $ sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
??第4步:編寫控制程序桩了。使用Python 2編寫的程序比C++簡(jiǎn)潔許多,smbus函數(shù)請(qǐng)?jiān)谥暗腎2C文章中查閱笆凌。
??樹莓派基礎(chǔ)實(shí)驗(yàn)12:PCF8591模數(shù)轉(zhuǎn)換器實(shí)驗(yàn)
??實(shí)驗(yàn)結(jié)果示例:
gyro_xout : -546 scaled: -5
gyro_yout : -26 scaled: -1
gyro_zout : 82 scaled: 0
accel_xout: 1132 scaled: 0.069091796875
accel_yout: 3912 scaled: 0.23876953125
accel_zout: 14324 scaled: 0.874267578125
x rotation: 15.2301539313
y rotation: -4.35957842715
??控制程序:
#!/usr/bin/python
import smbus
import math
import time
# 電源管理寄存器地址
power_mgmt_1 = 0x6b
power_mgmt_2 = 0x6c
def read_byte(adr):
return bus.read_byte_data(address, adr)
def read_word(adr):
high = bus.read_byte_data(address, adr)
low = bus.read_byte_data(address, adr+1)
val = (high << 8) + low
return val
def read_word_2c(adr):
val = read_word(adr)
if (val >= 0x8000):
return -((65535 - val) + 1)
else:
return val
def dist(a,b):
return math.sqrt((a*a)+(b*b))
#math.sqrt(x) 方法返回?cái)?shù)字x的平方根圣猎。
def get_y_rotation(x,y,z):
radians = math.atan2(x, dist(y,z))
#math.atan2(y, x) 返回給定的 X 及 Y 坐標(biāo)值的反正切值。
return -math.degrees(radians)
#math.degrees(x) 將弧度x轉(zhuǎn)換為角度乞而。
def get_x_rotation(x,y,z):
radians = math.atan2(y, dist(x,z))
return math.degrees(radians)
bus = smbus.SMBus(1) # or bus = smbus.SMBus(1) for Revision 2 boards
address = 0x68 # This is the address value read via the i2cdetect command
# Now wake the 6050 up as it starts in sleep mode
bus.write_byte_data(address, power_mgmt_1, 0)
while True:
time.sleep(0.1)
gyro_xout = read_word_2c(0x43)
gyro_yout = read_word_2c(0x45)
gyro_zout = read_word_2c(0x47)
print ' '
print "gyro_xout : ", gyro_xout, " scaled: ", (gyro_xout / 131) #倍率:±250°/s
print "gyro_yout : ", gyro_yout, " scaled: ", (gyro_yout / 131)
print "gyro_zout : ", gyro_zout, " scaled: ", (gyro_zout / 131)
accel_xout = read_word_2c(0x3b)
accel_yout = read_word_2c(0x3d)
accel_zout = read_word_2c(0x3f)
accel_xout_scaled = accel_xout / 16384.0 #倍率:±2g
accel_yout_scaled = accel_yout / 16384.0
accel_zout_scaled = accel_zout / 16384.0
print "accel_xout: ", accel_xout, " scaled: ", accel_xout_scaled
print "accel_yout: ", accel_yout, " scaled: ", accel_yout_scaled
print "accel_zout: ", accel_zout, " scaled: ", accel_zout_scaled
print "x rotation: " , get_x_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)
print "y rotation: " , get_y_rotation(accel_xout_scaled, accel_yout_scaled, accel_zout_scaled)
time.sleep(0.5)