新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32控制三軸加速度傳感器實(shí)現(xiàn)分析

        STM32控制三軸加速度傳感器實(shí)現(xiàn)分析

        作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
        買的stm32F107VC開發(fā)板,帶三軸加速度傳感器LIS302DL,附帶的示例代碼。學(xué)習(xí)了幾天,總結(jié)如下。

        本文引用地址:http://www.104case.com/article/201611/317051.htm

        1。邏輯結(jié)構(gòu)

        初始化各外設(shè)(RCC,GPIO,SPI,NVIC,I2C,LCD)——檢測(cè)MEMS并顯示檢測(cè)狀態(tài)——在死循環(huán)中不斷查詢加速度值并描畫。

        2。硬件原理

        與該程序相關(guān)的硬件連接圖:

        MEMS連接圖

        MEMS引出腳與MCU(左)、IO擴(kuò)展(右下)連接圖

        LCD連接圖

        LCD引出腳與MCU(左)、IO擴(kuò)展(右上)連接圖

        從圖中可以看出,MEMS使用I2C接口SCL和SDA連接MCU;LCD使用SPI3接口連接MCU。兩者的其余引出腳(INT1, 2, TouchScreenXY+-)均連接到IO擴(kuò)展。IO擴(kuò)展部分的原理圖為:

        它由兩塊touchScreen控制芯片組成,同樣掛在I2C總線上。該部分的原理還沒弄清,代碼中怎么控制這兩塊芯片的動(dòng)作,MEMS INT1,2連接擴(kuò)展口的意義何在,是如何作用的,有待進(jìn)一步研究。

        MEMS控制原理

        在程序動(dòng)作前,需要初始化系統(tǒng)中斷向量表(使用NVIC_SetVectorTable函數(shù)),配置系統(tǒng)時(shí)鐘、使能各外設(shè)時(shí)鐘(SystemInit,RCC_APB2PeriphClockCmd,RCC_APB1PeriphClockCmd)。

        1。GPIO

        PB6,PB7分別作為SCL和SDA。查找STM32芯片手冊(cè)的AFIO部分,

        將PB6,PB7作為SCL和SDA使用不需要進(jìn)行重映射,因此只需初始化其模式、速度。

        2。I2C

        (1)外設(shè)時(shí)鐘頻率

        外設(shè)時(shí)鐘頻率fPCLK1需寫入CR2寄存器的最低六位,寫入值的單位為MHz。因此,把RCC中PCLK1的頻率值除以1000,000后,放入CR2中。

        (2)CCR (clock control register)

        該值控制master模式下的I2C時(shí)鐘。

        I2C傳輸分為standard mode (fSCL = 100kHz) 和fast mode (fSCL = 400kHz)。fast mode分為 tlow/thigh = 2 和 tlow/thigh = 16/9 兩種。圖示如下。16/9類同。

        CCR值的公式為:

        standard mode:

        Thigh= CCR * TPCLK1

        Tlow = CCR * TPCLK1

        fast mode:

        比例為2:

        Thigh = CCR * TPCLK1

        Tlow = 2 * CCR * TPCLK1

        比例為16/9:

        Thigh = 9 * CCR * TPCLK1

        Tlow = 16 * CCR * TPCLK1

        因此,計(jì)算CCR值的方法為:

        standard mode:

        CCR = Thigh / TPCLK1 = 0.5 * TSCL / TPCLK1 = fPCLK1 / (2 * fSCL)

        (代碼中結(jié)構(gòu)體的變量I2C_ClockSpeed即為fSCL)

        fast mode:

        比例為2:

        CCR = Thigh / TPCLK1 = (1 / 3) * TSCL / TPCLK1 = fPCLK1 / (3 * fSCL)

        比例為16/9:

        CCR = fPCLK1 / (25 * fSCL)

        在CCR中,standard mode下最小值為0x04,fast mode下為0x01。

        (3)TRISE寄存器

        該值設(shè)定master模式下的最大上升時(shí)間。計(jì)算方法為允許的最大SCL上升時(shí)間除以TPCLK1,所得商值加1。

        在I2C bus specification中,standard mode 下最大時(shí)間為1000ns,fast mode下為300ns。

        因此,TRISE計(jì)算方法為:

        standard mode:

        TRISE = 1000 * (10^(-9)) / TPCLK1 + 1 = fPCLK1 + 1

        fast mode:

        TRISE = 300 * (10^(-9)) / TPCLK1 + 1 = 300 * fPCLK1 / 1000 + 1

        3。讀取MEMS中加速度數(shù)據(jù)

        實(shí)現(xiàn)過程按照LIS302DL datasheet中給的時(shí)序

        大致步驟為:允許ACK,發(fā)送起始位,發(fā)送外設(shè)寫地址,發(fā)送命令數(shù)據(jù),發(fā)送起始位,發(fā)送外設(shè)讀地址,(收到外設(shè)數(shù)據(jù)),禁用ACK,發(fā)送停止位,允許ACK,從DR寄存器讀數(shù)據(jù)。

        發(fā)送和接收命令或地址數(shù)據(jù)的本質(zhì)是讀寫DR寄存器。

        每步執(zhí)行之后需要檢查SR1和SR2相應(yīng)寄存器的狀態(tài),確認(rèn)該步執(zhí)行完成后才能進(jìn)行下一步。

        對(duì)于外設(shè)讀寫地址,LIS302DL datasheet中有說明:當(dāng)SDO接地時(shí),外設(shè)地址SAD為00111010;master要發(fā)送的地址數(shù)據(jù)位SAD+W/R,W/R位,從MEMS讀數(shù)據(jù)時(shí)為1,向MEMS寫數(shù)據(jù)時(shí)為0。

        在發(fā)送外設(shè)寫地址后,對(duì)MEMS的操作為:通過I2C寫入MEMS寄存器的地址,(通過I2C寫入對(duì)該寄存器的控制字)。

        在發(fā)送外設(shè)讀地址后,對(duì)MEMS的操作為:關(guān)閉ACK,發(fā)送停止位,從DR讀取數(shù)據(jù)。

        程序中用到的MEMS寄存器有:0x20 CTRL_REG1,選擇電源模式,選擇加速度檢測(cè)方向

        0x27 STATUS_REG,各軸數(shù)據(jù)獲取和溢出狀況

        0x29, 2B, 2D OUT_X,Y,Z 各軸輸出數(shù)據(jù)。

        剩余問題:在I2C驅(qū)動(dòng)中,對(duì)于外設(shè)時(shí)鐘頻率的賦值,匯編代碼中,MCU寄存器中為正確的值,但單步時(shí)發(fā)現(xiàn),賦值給時(shí)鐘頻率變量的值顯示不正確,無法賦給正確的值;最后計(jì)算結(jié)果為寄存器中數(shù)據(jù)的計(jì)算,因此是正確的。

        若把變量聲明為static,匯編代碼中該變量的存儲(chǔ)位置發(fā)生變化。需要學(xué)習(xí)code, RO data, RW data和ZI data的職能。

        中斷

        設(shè)定某方向的加速度閾值,當(dāng)傳感器測(cè)量值超過該閾值時(shí),傳感器輸出中斷信號(hào)。信號(hào)通過IO擴(kuò)展芯片的中斷管腳與MCU的GPIO相連,進(jìn)而能在傳感器超過閾值時(shí),系統(tǒng)進(jìn)入ISR。

        程序初始化時(shí)需要進(jìn)行的與中斷有關(guān)的設(shè)定如下,設(shè)定都是通過對(duì)寄存器的改寫實(shí)現(xiàn)的:

        MEMS:

        設(shè)定輸出給IO擴(kuò)展芯片管腳的中斷的高/低電平有效

        設(shè)定中斷為非鎖存模式。(鎖存模式即中斷信號(hào)需要在讀取某個(gè)寄存器后才能清除)

        設(shè)定中斷的方向和閾值。

        IO擴(kuò)展芯片:

        設(shè)定輸出給MCU IO口的中斷的高/低電平有效,及l(fā)evel/pulse方式

        使能全局中斷功能

        使能芯片GPIO的中斷功能

        使能綁定某些管腳的中斷功能

        清除當(dāng)前中斷寄存器各位狀態(tài)

        MCU:

        配置與IO擴(kuò)展芯片中斷管腳連接的GPIO的參數(shù)

        將該GPIO與相應(yīng)EXTI綁定

        設(shè)定EXTI相應(yīng)線的使能,上升下降沿觸發(fā)

        設(shè)定NVIC優(yōu)先級(jí)和使能

        中斷發(fā)生,ISR執(zhí)行完成后需要進(jìn)行的釋放操作如下:

        IO擴(kuò)展芯片:

        清除GPIO中斷的掛起狀態(tài)

        清除GPIO具體管腳中斷的掛起狀態(tài)

        清除邊緣檢測(cè)、上升下降沿檢測(cè)狀態(tài)

        MCU:

        清除相應(yīng)EXTI線上的掛起狀態(tài)



        關(guān)鍵詞: STM32三軸加速度傳感

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 抚远县| 永顺县| 遂宁市| 晋中市| 吴江市| 海口市| 顺义区| 平江县| 元阳县| 汽车| 库伦旗| 扬中市| 苏州市| 新安县| 湘阴县| 东乡县| 图们市| 信宜市| 芒康县| 兖州市| 彰武县| 藁城市| 鹤庆县| 兴城市| 陕西省| 兖州市| 香河县| 内黄县| 昂仁县| 赣榆县| 平原县| 措美县| 二手房| 汤阴县| 永福县| 文山县| 江川县| 明星| 固原市| 同心县| 林芝县|