標(biāo)題:
用STM32F103的模擬IIC去讀取陀螺儀、加速度、角度的數(shù)據(jù)
[打印本頁]
作者:
FredZhu
時(shí)間:
2020-9-1 21:20
標(biāo)題:
用STM32F103的模擬IIC去讀取陀螺儀、加速度、角度的數(shù)據(jù)
1 基本介紹
9軸姿態(tài)角度傳感器廣泛用于物聯(lián)網(wǎng)開發(fā),其中JY901陀螺儀由于自帶卡爾曼動(dòng)態(tài)濾波算法便作為了我硬件開發(fā)的選擇。JY901陀螺儀基本可以在各個(gè)平臺(tái)上進(jìn)行數(shù)據(jù)的讀。ㄈ鏰rduino、stm32、樹莓派、上位機(jī)等)。剛好最近項(xiàng)目需要用到這個(gè)模塊。我給大家整理下我是怎么操作的。先給大家看下模塊。上圖:
說實(shí)話這個(gè)模塊挺小的。但是功能還是比較強(qiáng)大的。好了不多說了,不然以為我在打廣告了。進(jìn)入主題。
2 開發(fā)準(zhǔn)備
講程序之前呢,和大家簡單的說說一些硬件、軟件準(zhǔn)備和JY901怎么和STM32F103接線的。
2.1硬件、軟件準(zhǔn)備
硬件:JY901模塊、USB-TTL、STM32F103開發(fā)板、杜邦線。STM32F103的開發(fā)板呢,我用的也是維特智能32開發(fā)板做測(cè)試用。給大家上個(gè)圖:
軟件 :
https://pan.baidu.com/s/1SEWmixu4jtUL2HH_3Hcn2g
提取碼:zryo
這個(gè)是我的寫的一個(gè) 示例代碼大家有興趣的可以看下:
https://pan.baidu.com/s/1sXnlT89FTTs5tONLiaPihw
2.2 接線方式
1、使用USB-TTL將STM32F103C8T6與電腦連接通信
2、JY901與STM32F103C8T6使用杜邦線連接。具體接線如下圖所示:
具體接線方式如下:
3 程序講解
3.1程序思路講解
好了到大家最關(guān)心的地方了。在這里呢。我先和大家說下。我的整體思路是什么。以一個(gè)整體框架給大家做一個(gè)說明
從上面來看呢,一共就分為主要的兩個(gè)部分。串口初始化和while主循環(huán)。
1 、串口初始化又分為時(shí)鐘初始化、串口1初始化、IIC初始化。時(shí)鐘初始化的作用意味著所有工作部件都出于同一的工作準(zhǔn)備狀態(tài),這樣,在以后的工作中才能步調(diào)一致。
2、while主循環(huán)包括數(shù)據(jù)解析和數(shù)據(jù)輸出。數(shù)據(jù)解析負(fù)責(zé)把從串口2中斷服務(wù)函數(shù)得到的數(shù)據(jù)進(jìn)行數(shù)據(jù)的一個(gè)處理。然后從串口1把數(shù)據(jù)輸出到PC端。
下面分別和大家說下中間的一些重要的函數(shù)。
3.2 main函數(shù)
程序的執(zhí)行都是在這個(gè)函數(shù)里面進(jìn)行的。它包括串口初始化和while主循環(huán)。其中這個(gè)SysTick_init函數(shù)就是時(shí)鐘初始化。Initial_UART1函數(shù)是串口1初始化。IIC_Init函數(shù)是IIC初始化。IICreadBytes9()函數(shù)就是去讀取JY901內(nèi)部寄存器的函數(shù)。UART1_Put_String()是串口1發(fā)送到電腦端的函數(shù)。
[backcolor=inherit !important]
3.2 時(shí)鐘初始化
時(shí)鐘初始化的作用意味著所有工作部件都出于同一的工作準(zhǔn)備狀態(tài),這樣,在以后的工作中才能步調(diào)一致。
[backcolor=inherit !important]
3.3 串口1初始化
初始化串口1。將相應(yīng)的引腳配置成UART模式;配置和使能UART,包括配置波特率,是否使用FIF0,數(shù)據(jù)幀格式(數(shù)據(jù)長度,停止位,奇偶校驗(yàn),收發(fā)數(shù)據(jù)緩沖區(qū)大小等);配置中斷(一般分3大類,共7種);讀寫數(shù)據(jù)。
[backcolor=inherit !important]
3.4 IIC初始化
這個(gè)程序我使用的是模擬IIC,沒有使用硬件IIC。因此我只需要對(duì)IO口進(jìn)行初始化就行了。
最后的SDA_OUT()函數(shù)把SDA引腳設(shè)置輸出。IIC_SDA=1;IIC_SCL=1;這兩個(gè)的意思就是把IIC總線設(shè)置成高電平。
[backcolor=inherit !important]
3.5 IICreadBytes讀取函數(shù)
IICreadBytes函數(shù)的程序運(yùn)行流程是這樣的。IIC_Start(),這個(gè)是IIC開始信號(hào)。IIC_Send_Byte()往JY901發(fā)送設(shè)備的ID。IIC_Wait_Ack(),等待JY901應(yīng)答。IIC_Send_Byte(),這個(gè)函數(shù)就是往JY901發(fā)送你要讀的寄存器地址,繼續(xù)等待應(yīng)答。然后又重新開始,根據(jù)JY901的IIC協(xié)議發(fā)送設(shè)備地址IIC_Send_Byte9(dev<<1)+1),現(xiàn)在進(jìn)入了接受JY901的返回的數(shù)據(jù)的模式。最后等待應(yīng)答就可以了。接著就是一個(gè)For循環(huán)。把讀取到的數(shù)據(jù)放在data里。循環(huán)結(jié)束了后。IIC就停止了。最后返回 count。
[backcolor=inherit !important]
3.6 數(shù)據(jù)緩存區(qū)
數(shù)據(jù)緩存區(qū)就是在main函數(shù)里面定義的一個(gè)數(shù)組chrTemp[30]。它是把上面的IICreadBytes
讀取得到的data的數(shù)據(jù)放在了這個(gè)數(shù)組當(dāng)中的。
3.7 數(shù)據(jù)解析
數(shù)據(jù)解析部分。這個(gè)主要是根據(jù)商家給的協(xié)議,把從寄存器獲取到的值。去進(jìn)行處理的。以讀出模塊的角度數(shù)據(jù)為例,RedAddr 為 0x3d、0x3e、0x3f,連續(xù)讀取 6 個(gè)字節(jié),邏 輯分析儀捕獲的波形如下圖所示:
從 0x3d 開始讀取出來的數(shù)據(jù)依次為 0x9C,0x82,0x28,0xFF,0xE6,0x24。也就是說 X 軸的角度 為 0x829C,Y 軸的角度為 0xFF28,Z 軸的角度為 0x24E6。按照 商家公式(如下圖)可以求出轉(zhuǎn)化出來的角度為:X 軸角度-176.33°,Y 軸角度為-1.19°,Z 軸角度為 51.89°。
[backcolor=inherit !important]
3.8 數(shù)據(jù)輸出
數(shù)據(jù)輸出相比較前面的就比較簡單了。它的原理就是把上面解析好的數(shù)據(jù)直接通過一個(gè)函數(shù)就發(fā)出來了。
發(fā)送的函數(shù)就很簡單了。就是一個(gè)UART1_Put_String打印函數(shù)。把解析的結(jié)果直接從串口1打印出來到PC端。
4 輸出結(jié)果
在電腦上正確連接好板子,首先打開串口調(diào)試助手,找到相應(yīng)的端口,然后打開串口,注意這里波特率設(shè)置為9600,然后就可以觀察到左邊的窗口有數(shù)據(jù)輸出了。如圖所示:
作者:
1714461639
時(shí)間:
2021-1-19 15:29
請(qǐng)問實(shí)例代碼的提取碼是多少
作者:
lgm673592463
時(shí)間:
2021-4-17 11:33
例程提取碼 ??
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1