<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      《ESP32-S3使用指南—IDF版 V1.6》第三十二章 IIC_QMA6100P實驗

      第三十二章 IIC_QMA6100P實驗

      1)實驗平臺:正點原子DNESP32S3開發(fā)板

      2)章節(jié)摘自【正點原子】ESP32-S3使用指南—IDF版 V1.6

      3)購買鏈接:https://detail.tmall.com/item.htm?&id=768499342659

      4)全套實驗源碼+手冊+視頻下載地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html

      5)正點原子官方B站:https://space.bilibili.com/394620890

      6)正點原子DNESP32S3開發(fā)板技術(shù)交流群:132780729

      155537c2odj87vz1z9vj6l

      155537nfqovl2gg9faaol9

      前面,我們介紹了IIC驅(qū)動XL9555、AP3216C、AT24C02等器件,本章我們將向大家介紹如何使用IIC來驅(qū)動QMA6100P三軸加速度計,獲取X,Y,Z的原始數(shù)據(jù),并把原始數(shù)據(jù)轉(zhuǎn)化為pitch俯仰角和roll翻滾角并把數(shù)據(jù)顯示在LCD上。
      本章分為如下幾個小節(jié):
      32.1 IIC簡介
      32.2 硬件設(shè)計
      32.3 程序設(shè)計
      32.4 下載驗證

      32.1 QMA6100P介紹
      QMA6100P是一款三軸加速度傳感器,具有高集成、小尺寸封裝的特點。它集成了信號調(diào)節(jié)ASIC的加速度傳感器,可以感知傾斜、運動、沖擊和振動。QMA6100P基于先進的高分辨率單晶硅MEMS技術(shù),配合定制設(shè)計的14位ADC專用集成電路,具有低噪聲、高精度、低功耗、偏置微調(diào)等優(yōu)點。它支持?jǐn)?shù)字接口I2C和SPI,內(nèi)置硬件計步器,支持多種不同中斷模式。QMA6100P的最大可支持64級FIFO,待機電流為5μA,計步器工作電流為44μA。主要應(yīng)用市場與優(yōu)勢是手機,手環(huán),手表,各類低功耗IOT設(shè)備,集成各類應(yīng)用算法,計步器,抬手亮屏,垂手亮屏,久坐提醒,跌倒報警,跌落報警,睡眠檢測,平衡檢測,傾斜檢測,睡眠喚醒等超過20種不同應(yīng)用。QMA6100P還具有低成本和與市場主流傳感器兼容的優(yōu)點,以及超低功耗、可靠性高的特點。下圖是QMA6100P內(nèi)部框圖。

      image001

      圖32.1.1 QMA6100P框圖
      根據(jù)上文,QMA6100P三軸加速度計支持SPI和IIC兩種通信接口。接口的實現(xiàn)流程可參考《13-52-20 QMA6100PDatasheet Rev. D.pdf》數(shù)據(jù)手冊。本章節(jié)以ESP32-S3開發(fā)板電路為基準(zhǔn),該開發(fā)板使用IIC通信接口來獲取QMA6100P三軸加速度計的相關(guān)參數(shù)。
      QMA6100P的引腳說明如下表所示。

      QQ截圖20250802173957
      圖32.1.1 QMA6100P管腳描述

      32.1.1 QMA6100P尋址
      從規(guī)格書的章節(jié)5.4所示,QMA6100P在IIC通信下,具有兩種設(shè)備地址設(shè)置,它們分別為0x12和0x13(7位串行地址)。這兩個設(shè)備地址的選擇是根據(jù)QMA6100P的第1號管腳確定,如下圖所示:

      image003

      圖32.1.2 設(shè)備地址的選擇
      從上圖可知,當(dāng)?shù)?號管腳(AD0)拉低時,QMA6100P設(shè)備地址被設(shè)置為0x12,反次,該設(shè)備地址為0x13。本開發(fā)板是把AD0管腳拉低,所以在QMA6100P設(shè)備地址為0x12。

      32.1.2 QMA6100P寄存器介紹
      QMA6100P有一些列寄存器,由這些寄存器來控制QMA6100P的工作模式,以及中斷配置和數(shù)據(jù)輸出等。這里我們僅介紹我們在本章需要用到的一些寄存器,其他寄存器的描述和說明,請大家參考QMA6100P的數(shù)據(jù)手冊。
      本章需要用到QMA6100P的寄存器如下表所示:

      QQ截圖20250802174012
      表32.1.2.1 QMA6100P相關(guān)寄存器及其說明
      其余的寄存器可在數(shù)據(jù)手冊下找到相關(guān)描述和配置信息。

      32.1.3 QMA6100P時序介紹
      l 寫寄存器
      QMA6100P的寫寄存器時序如下圖所示。

      image005

      圖32.1.3.1 QMA6100P寫寄存器時序
      圖中,先發(fā)送QMA6100P的地址(7位,0X12,左移一位后為:0X24),最低位W=0表示寫數(shù)據(jù),隨后發(fā)送8位寄存器地址,最后發(fā)送8位寄存器值。其中:START,表示IIC起始信號;R/W,表示讀/寫標(biāo)志位(R/W =0表示寫,R/W =1表示讀);SACK,表示應(yīng)答信號;STOP,表示IIC停止信號。
      l 讀寄存器
      QMA6100P的讀寄存器時序如下圖所示。

      image007

      圖32.1.3.2 QMA6100P讀寄存器時序
      圖中,同樣是先發(fā)送7位地址+寫操作,然后再發(fā)送寄存器地址,隨后,重新發(fā)送起始信號(Sr),再次發(fā)送7位地址+讀操作,然后讀取寄存器值。其中:SA,表示重新發(fā)送IIC起始信號;MACK,表示MCU應(yīng)答;NACK,表示設(shè)備應(yīng)答;其他簡寫同上。

      32.2 硬件設(shè)計
      32.2.1 例程功能
      在LCD顯示屏上,我們能夠看到XYZ的數(shù)據(jù)。當(dāng)我們翻轉(zhuǎn)開發(fā)板時,這些數(shù)據(jù)會根據(jù)開發(fā)板的翻轉(zhuǎn)角度來計算出pitch俯仰角和roll翻滾角。

      32.2.2 硬件資源

      1. LED燈
        LED-IO1
      2. XL9555
        IIC_SDA-IO41
        IIC_SCL-IO42
      3. SPILCD
        CS-IO21
        SCK-IO12
        SDA-IO11
        DC-IO40(在P5端口,使用跳線帽將IO_SET和LCD_DC相連)
        PWR- IO1_3(XL9555)
        RST- IO1_2(XL9555)
      4. QMA6100P
        SDA - IO41
        CLK - IO42
        IO RXIO - P01

      32.2.3 原理圖
      QMA6100P原理圖,如下圖所示。

      image009

      圖32.2.3.1 QMA6100P原理圖
      這里說明一下,QMA6100P的QMA_INT腳是連接在XL9555器件的IO0_1腳上,如果大家要使用QMA6100P的中斷輸出功能,必須先初始化XL9555器件并配置IO0_1為輸入功能,監(jiān)測XL9555中斷引腳是否有中斷產(chǎn)生。若發(fā)現(xiàn)有中斷產(chǎn)生,則判斷是否是IO0_1導(dǎo)致的,從而檢測到QMA6100P的中斷。在本章中,并沒有用到QMA6100P中斷功能,所以沒有對XL9555器件的IO0_1做設(shè)置。

      32.3 程序設(shè)計
      32.3.1 程序流程圖
      程序流程圖能幫助我們更好的理解一個工程的功能和實現(xiàn)的過程,對學(xué)習(xí)和設(shè)計工程有很好的主導(dǎo)作用。下面看看本實驗的程序流程圖:

      image012

      圖32.3.1.1 QMA6100P實驗程序流程圖

      32.3.2 QMA6100P函數(shù)解析
      這一章節(jié)除了涉及到GPIO、IIC的API函數(shù),便沒有再涉及到其他API函數(shù)。因此,有關(guān)GPIO和IIC的API函數(shù)介紹,請讀者回顧此前的第十章與第十九章的內(nèi)容。接下來,筆者將直接介紹QMA6100P的驅(qū)動代碼。

      32.3.3 QMA6100P驅(qū)動解析
      在IDF版22_qma6100p例程中,作者在22_qma6100p\components\BSP路徑下新增了一個QMA6100P文件夾,分別用于存放qma6100p.c、qma6100p.h這兩個文件。其中,qma6100p.h文件負(fù)責(zé)聲明QMA6100P相關(guān)的函數(shù)和變量,而qma6100p.c文件則實現(xiàn)了QMA6100P的驅(qū)動代碼。下面,我們將詳細(xì)解析這兩個文件的實現(xiàn)內(nèi)容。
      1,qma6100p.h文件
      該文件下包含了對QMA6100P的命令配置以及寄存器地址的相關(guān)定義。

      #define QMA6100P_ADDR                     0x12      /* QMA6100P地址 */
      /* QMA6100P命令 */
      /* 獲取ID,默認(rèn)值為0x9x */
      #define QMA6100P_REG_CHIP_ID              0x00
      /* 數(shù)據(jù)寄存器,三軸數(shù)據(jù),默認(rèn)值為0x00 */
      #define QMA6100P_REG_XOUTL                0x01
      #define QMA6100P_REG_XOUTH                0x02
      #define QMA6100P_REG_YOUTL                0x03
      #define QMA6100P_REG_YOUTH                0x04
      #define QMA6100P_REG_ZOUTL                0x05
      #define QMA6100P_REG_ZOUTH                0x06
      /* 帶寬寄存器 */
      #define QMA6100P_REG_BW_ODR               0x10
      /* 電源管理寄存器 */
      #define QMA6100P_REG_POWER_MANAGE        0x11
      /* 加速度范圍,設(shè)置加速度計的滿刻度 */
      #define QMA6100P_REG_RANGE                0x0f
      /* 軟件復(fù)位 */  
      #define QMA6100P_REG_RESET                0x36
      #define QMA6100P_REG_ACC_VAL(lsb, msb)  ((int16_t)(((uint16_t)msb << 8) |
                                                     ((uint16_t)lsb & 0xFC)) >> 2)
      typedef struct {
          uint8_t data[2];
          float  acc_x;
          float  acc_y;
          float  acc_z;
          float  acc_g;
          float  pitch;                       /* 圍繞X軸旋轉(zhuǎn),也叫做俯仰角 */
          float  roll;                       /* 圍繞Z軸旋轉(zhuǎn),也叫翻滾角 */
      }qma6100p_rawdata_t;
      /* 設(shè)置量程寄存器 */
      typedef enum
      {
          QMA6100P_BW_100=   0,
          QMA6100P_BW_200=   1,
          QMA6100P_BW_400=   2,
          QMA6100P_BW_800=   3,
         QMA6100P_BW_1600 =  4,
          QMA6100P_BW_50 =    5,
          QMA6100P_BW_25 =    6,
         QMA6100P_BW_12_5 =  7,
         QMA6100P_BW_OTHER = 8
      }qma6100p_bw;
      /* 設(shè)置加速度寄存器 */
      typedef enum
      {
         QMA6100P_RANGE_2G =  0x01,
         QMA6100P_RANGE_4G =  0x02,
         QMA6100P_RANGE_8G =  0x04,
         QMA6100P_RANGE_16G = 0x08,
         QMA6100P_RANGE_32G = 0x0f
      }qma6100p_range;
      /* 設(shè)置復(fù)位寄存器 */
      typedef enum
      {
          QMA6100P_RESET =     0xB6,
         QMA6100P_RESET_END = 0x00,
      }qma6100p_reset;
      /* 設(shè)置中斷 */
      typedef enum
      {
         QMA6100P_MAP_INT1,
         QMA6100P_MAP_INT2,
         QMA6100P_MAP_INT_NONE
      }qma6100p_int_map;
      /* 設(shè)置管理寄存器 */
      typedef enum
      {
          QMA6100P_ACTIVE=         0x80,
         QMA6100P_ACTIVE_DIGITAL = 0x84,
         QMA6100P_STANDBY =        0x00,
      }qma6100p_power;
      typedef enum
      {
         QMA6100P_MCLK_102_4K =   0x03,
         QMA6100P_MCLK_51_2K  =   0x04,
         QMA6100P_MCLK_25_6K  =   0x05,
         QMA6100P_MCLK_12_8K  =    0x06,
         QMA6100P_MCLK_6_4K   =     0x07,
         QMA6100P_MCLK_RESERVED = 0xff
      }qma6100p_mclk;
      typedef enum
      {
         QMA6100P_SENSITITY_2G =  244,
         QMA6100P_SENSITITY_4G =  488,
         QMA6100P_SENSITITY_8G =  977,
         QMA6100P_SENSITITY_16G = 1950,
         QMA6100P_SENSITITY_32G = 3910
      }qma6100p_sensitity;
      2,qma6100p.c文件
      /**
      * @brief       qma6100p初始化
      * @param       無
      * @retval      無
      */
      void qma6100p_init(i2c_obj_t self)
      {
          if (self.init_flag == ESP_FAIL)
          {
              iic_init(I2C_NUM_0);    /* 初始化IIC */
          }
         qma6100p_i2c_master = self;
         
          while (qma6100p_config())   /* 檢測不到qma6100p */
          {
              ESP_LOGE("qma6100p", "qma6100p init fail!!!");
              vTaskDelay(500);
          }
      }
      /**
      * @brief       初始化qma6100p
      * @param       無
      * @retval      0, 成功;
                       1, 失敗;
      */
      uint8_t qma6100p_config(void)
      {
      static uint8_t id_data[2];
      /* 讀取設(shè)備ID,正常是0x90 */
         qma6100p_register_read(QMA6100P_REG_CHIP_ID, id_data, 1);
         
          /* qma6100p的初始化序列,請看手冊“6.3 Initial sequence”章節(jié) */
         qma6100p_register_write_byte(QMA6100P_REG_RESET, QMA6100P_RESET);
          vTaskDelay(5);
         qma6100p_register_write_byte(QMA6100P_REG_RESET, QMA6100P_RESET_END);
      vTaskDelay(10);
          /* 讀取設(shè)備ID,正常是0x90 */
         qma6100p_register_read(QMA6100P_REG_CHIP_ID, id_data, 1);
         
         qma6100p_register_write_byte(0x11, 0x80);
         qma6100p_register_write_byte(0x11, 0x84);
         qma6100p_register_write_byte(0x4a, 0x20);
         qma6100p_register_write_byte(0x56, 0x01);
         qma6100p_register_write_byte(0x5f, 0x80);
          vTaskDelay(1);
         qma6100p_register_write_byte(0x5f, 0x00);
          vTaskDelay(10);
         qma6100p_register_write_byte(QMA6100P_REG_RANGE, QMA6100P_RANGE_8G);
         qma6100p_register_write_byte(QMA6100P_REG_BW_ODR, QMA6100P_BW_100);
      qma6100p_register_write_byte(QMA6100P_REG_POWER_MANAGE,
                                       QMA6100P_MCLK_51_2K | 0x80);
         qma6100p_register_write_byte(0x21, 0x03);/* default 0x1c,step latch mode */
         
         qma6100p_step_int_config(QMA6100P_MAP_INT1, 1);
         
          if (id_data[0] == 0x90)
          {
              ESP_LOGE("qma6100p", "qma6100p success!!!");
              return 0;    /* qma6100p正常 */
          }
          else
          {
              ESP_LOGE("qma6100p", "qma6100p fail!!!");
              return 1;    /* qma6100p失敗 */
          }
      }
      

      在qma6100_init()函數(shù)中,通過判斷IIC初始化標(biāo)志位,確認(rèn)IIC是否已經(jīng)初始化,如果沒有則進行IIC初始化,已經(jīng)初始化了則跳過。然后把IIC_SDA引腳和IIC_SCL引腳作為I2C_NUM_0的數(shù)據(jù)線和時鐘線使用。然后調(diào)用了qma6100p_config函數(shù),用于初始化和配置QMA6100P傳感器模塊。在qma6100p_config函數(shù)中,我們首先讀取0x00寄存器來獲取設(shè)備ID。然后,我們復(fù)位該設(shè)備并執(zhí)行初始化序列(請參考規(guī)格書的6.3小節(jié))。接下來,我們配置量程刻度、帶寬、中斷等參數(shù)。最后,我們檢查讀取的ID是否為0x90。如果是,則設(shè)備通信成功;否則,通信失敗。
      接下來我們來講解一下對QMA6100P的IIC寫時序函數(shù),我們編寫QMA6100P的IIC寫時序函數(shù),如下所示:

      /**
      * @brief       向qma6100p寄存器寫數(shù)據(jù)
      * @param       reg_addr     :要寫入的寄存器地址
      * @param       data         : 要寫入的數(shù)據(jù)
      * @retval      錯誤值         :0成功,其他值:錯誤
      */
      static esp_err_tqma6100p_register_write_byte(uint8_t reg, uint8_t data)
      {
          uint8_t memaddr_buf[1];
          memaddr_buf[0]  = reg;
          i2c_buf_t bufs[2] = {
              {.len = 1, .buf = memaddr_buf},
              {.len = 1, .buf = &data},
          };
          i2c_transfer(&qma6100p_i2c_master, QMA6100P_ADDR, 2, bufs,I2C_FLAG_STOP);
          return ESP_OK;
      }
      

      在上述源代碼中,作者根據(jù)傳入的IIC控制塊,調(diào)用了IIC收發(fā)函數(shù)來發(fā)送QMA6100P的命令和數(shù)據(jù)。發(fā)送完成后,函數(shù)返回了ESP_OK狀態(tài)。
      接下來我們來講解一下對QMA6100P的IIC讀時序函數(shù),我們編寫QMA6100P的IIC讀時序函數(shù),如下所示:

      /**
      * @brief       讀取qma6100p寄存器的數(shù)據(jù)
      * @param       reg_addr     : 要讀取的寄存器地址
      * @param       data          :讀取的數(shù)據(jù)
      * @param       len            :數(shù)據(jù)大小
      * @retval      錯誤值         :0成功,其他值:錯誤
      */
      esp_err_t qma6100p_register_read(const uint8_t reg, uint8_t *data, const size_t len)
      {
          uint8_t memaddr_buf[1];
          memaddr_buf[0]  = reg;
          i2c_buf_t bufs[2] = {
              {.len = 1, .buf = memaddr_buf},
              {.len = len, .buf = data},
          };
      i2c_transfer(&qma6100p_i2c_master,
                       QMA6100P_ADDR,
                       2,
                       bufs,
                       I2C_FLAG_WRITE | I2C_FLAG_READ | I2C_FLAG_STOP);
          return ESP_OK;
      }
      

      同樣地,QMA6100P的讀時序也是利用IIC收發(fā)函數(shù)來實現(xiàn)的。寫時序和讀時序的唯一區(qū)別在于最后的flag標(biāo)志位不同,從而導(dǎo)致發(fā)送流程有所不同。
      下面是根據(jù)XYZ原始數(shù)據(jù),使用特定的算法來計算pitch俯仰角和roll翻滾角,如下所示:

      /**
      * @brief   從QMA6100P寄存器中讀取原始x,y,z軸數(shù)據(jù)
      * @param   data  : 3軸數(shù)據(jù)存儲數(shù)組
      * @retval  無
      */
      voidqma6100p_read_raw_xyz(int16_t data[3])
      {
          uint8_t databuf[6] = {0};
          int16_t raw_data[3];
         qma6100p_read_reg(QMA6100P_XOUTL, databuf, 6);
          raw_data[0] = (int16_t)(((databuf[1] << 8)) | (databuf[0]));
          raw_data[1] = (int16_t)(((databuf[3] << 8)) | (databuf[2]));
          raw_data[2] = (int16_t)(((databuf[5] << 8)) | (databuf[4]));
          data[0] = raw_data[0] >> 2;
          data[1] = raw_data[1] >> 2;
          data[2] = raw_data[2] >> 2;
      }
      /**
      * @brief   計算得到加速度計的x,y,z軸數(shù)據(jù)
      * @param    accdata  : 3軸數(shù)據(jù)存儲數(shù)組
      * @retval  無
      */
      voidqma6100p_read_acc_xyz(float accdata[3])
      {
          int16_t rawdata[3];
         qma6100p_read_raw_xyz(rawdata);
          accdata[0] = (float)(rawdata[0] * M_G) / 1024;
          accdata[1] = (float)(rawdata[1] * M_G) / 1024;
          accdata[2] = (float)(rawdata[2] * M_G) / 1024;
      }
      

      上述源碼中,作者先讀取三軸的XYZ原始數(shù)據(jù),然后經(jīng)過特定的算法計算出pitch俯仰角和roll翻滾角。

      32.3.4 CMakeLists.txt文件
      打開本實驗BSP下的CMakeLists.txt文件,其內(nèi)容如下所示:

      set(src_dirs
                 IIC
                 KEY
                 LCD
                 LED
                 QMA6100P
                 SPI
                 XL9555)
      set(include_dirs
                 IIC
                 KEY
                 LCD
                 LED
                 QMA6100P
                 SPI
                 XL9555)
      set(requires
                 driver
                 esp_adc)
      idf_component_register(SRC_DIRS ${src_dirs}
      INCLUDE_DIRS ${include_dirs} REQUIRES ${requires})
      component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)
      

      上述的紅色QMA6100P驅(qū)動以及esp_adc依賴庫需要由開發(fā)者自行添加,以確保QMA6100P驅(qū)動能夠順利集成到構(gòu)建系統(tǒng)中。這一步驟是必不可少的,它確保了QMA6100P驅(qū)動的正確性和可用性,為后續(xù)的開發(fā)工作提供了堅實的基礎(chǔ)。

      32.3.5 實驗應(yīng)用代碼
      打開main/main.c文件,該文件定義了工程入口函數(shù),名為app_main。該函數(shù)代碼如下。

      i2c_obj_t i2c0_master;
      /**
      * @brief       顯示原始數(shù)據(jù)
      * @param       x, y : 坐標(biāo)
      * @param       title: 標(biāo)題
      * @param       val : 值
      * @retval      無
      */
      void user_show_mag(uint16_t x, uint16_t y, char *title, float val)
      {
          char buf[20];
      sprintf(buf,"%s%3.1f", title, val);                   /* 格式化輸出 */
      /* 清除上次數(shù)據(jù)(最多顯示20個字符,20*8=160) */
         lcd_fill(x + 30, y + 16, x + 160, y + 16, WHITE);
          lcd_show_string(x, y, 160, 16, 16, buf, BLUE);      /* 顯示字符串 */
      }
      /**
      * @brief       程序入口
      * @param       無
      * @retval      無
      */
      void app_main(void)
      {
          uint8_t t;
         qma6100p_rawdata_t xyz_rawdata;
          esp_err_t ret;
         
          ret = nvs_flash_init();               /* 初始化NVS */
      if (ret ==ESP_ERR_NVS_NO_FREE_PAGES
      || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
          {
             ESP_ERROR_CHECK(nvs_flash_erase());
              ret = nvs_flash_init();
          }
          led_init();                             /* 初始化LED */
          i2c0_master = iic_init(I2C_NUM_0);  /* 初始化IIC0 */
          spi2_init();                            /* 初始化SPI2 */
          xl9555_init(i2c0_master);            /* 初始化XL9555 */
          lcd_init();                             /* 初始化LCD */
          qma6100p_init(i2c0_master);          /* 初始化三軸加速度計 */
         
          lcd_show_string(30, 50, 200, 16, 16, "ESP32", RED);
          lcd_show_string(30, 70, 200, 16, 16, "QMA6100P TEST", RED);
          lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
          lcd_show_string(30, 110, 200, 16, 16, " ACC_X :", RED);
          lcd_show_string(30, 130, 200, 16, 16, " ACC_Y :", RED);
          lcd_show_string(30, 150, 200, 16, 16, " ACC_Z :", RED);
          lcd_show_string(30, 170, 200, 16, 16, " Pitch :", RED);
          lcd_show_string(30, 190, 200, 16, 16, " Roll :", RED);
          while (1)
          {
              vTaskDelay(10);
              t++;
              if (t == 20)                   /* 0.2秒左右更新一次三軸原始值 */
              {   
                 qma6100p_read_rawdata(&xyz_rawdata);
                  
                 user_show_mag(30, 110, "ACC_X:", xyz_rawdata.acc_x);
                 user_show_mag(30, 130, "ACC_Y:", xyz_rawdata.acc_y);
                 user_show_mag(30, 150, "ACC_Z:", xyz_rawdata.acc_z);
                 user_show_mag(30, 170, "Pitch:", xyz_rawdata.pitch);
                 user_show_mag(30, 190, "Roll  :", xyz_rawdata.roll);
                  
                  t = 0;
                 LED_TOGGLE();
              }
          }
      }
      

      從上述源碼可知,我們首先初始化各個外設(shè),如IIC、SPI、XL9555、QMA6100P和LCD等驅(qū)動,然后調(diào)用qma6100.qma6100p_read函數(shù)測量數(shù)據(jù),最后調(diào)用qma6100p_acc_x等函數(shù)獲取XYZG、pitch俯仰角和roll翻滾角數(shù)據(jù),并在SPILCD上顯示。。LED燈每隔200毫秒狀態(tài)翻轉(zhuǎn),實現(xiàn)閃爍效果。
      32.4 下載驗證
      程序下載到開發(fā)板后,LCD不斷刷新三軸的原始數(shù)據(jù)、pitch俯仰角和roll翻滾角。當(dāng)用戶轉(zhuǎn)動或翻轉(zhuǎn)開發(fā)板時,pitch俯仰角和roll翻滾角會隨之變化,如下圖所示:

      image013
      圖32.4.1 QMA6100P實驗測試圖

      posted @ 2025-08-07 16:04  正點原子  閱讀(134)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲精品国产精品国在线| 色综合久久久久综合99| 久久精品国产一区二区三| 亚洲一区二区三区18禁| 一本色道久久加勒比综合 | 成人网站网址导航| 扬中市| 国产精品成人综合色在线| 国产精品爽爽va在线观看网站| 免费无码午夜理论电影| 日韩亚洲国产综合高清| 少妇午夜福利一区二区三区| 欧洲码亚洲码的区别入口| 亚洲一区在线观看青青蜜臀| 国产av一区二区不卡| 国产精品一码二码三码四码| 最新亚洲人成网站在线影院| 国产一区二区三区乱码| 九九热视频在线精品18| 99RE8这里有精品热视频| 久久青青草原国产精品最新片| 免费无码肉片在线观看| 亚洲成a人片在线观看日本| 色噜噜在线视频免费观看| 网友自拍视频一区二区三区| 老司机亚洲精品一区二区| 亚洲一本二区偷拍精品| 野花社区在线观看视频| 中文字幕第一页国产| 亚洲精品一区二区三区四区乱码| 色综合一本到久久亚洲91| 日韩有码中文字幕国产| 98日韩精品人妻一二区| 中文字幕成人精品久久不卡| 94人妻少妇偷人精品| 国产精品黄色片| 欧美日韩精品一区二区三区高清视频 | 67194熟妇人妻欧美日韩| 国产专区一线二线三线码| 久久久久久久一线毛片| 吉川爱美一区二区三区视频 |