搜索
bottom↓
回复: 0

《DNESP32S3使用指南-IDF版_V1.6》第三十二章 IIC_QMA6100P实验

[复制链接]

出0入234汤圆

发表于 昨天 10:03 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2024-7-26 10:03 编辑

2.jpg
1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729
1.png
3.png

第三十二章 IIC_QMA6100P实验

       前面,我们介绍了IIC驱动XL9555、AP3216C、AT24C02等器件,本章我们将向大家介绍如何使用IIC来驱动QMA6100P三轴加速度计,获取X,Y,Z的原始数据,并把原始数据转化为pitch俯仰角和roll翻滚角并把数据显示在LCD上。
       本章分为如下几个小节:
       32.1 IIC简介
       32.2 硬件设计
       32.3 程序设计
       32.4 下载验证

       32.1 QMA6100P介绍
       QMA6100P是一款三轴加速度传感器,具有高集成、小尺寸封装的特点。它集成了信号调节ASIC的加速度传感器,可以感知倾斜、运动、冲击和振动。QMA6100P基于先进的高分辨率单晶硅MEMS技术,配合定制设计的14位ADC专用集成电路,具有低噪声、高精度、低功耗、偏置微调等优点。它支持数字接口I2C和SPI,内置硬件计步器,支持多种不同中断模式。QMA6100P的最大可支持64级FIFO,待机电流为5μA,计步器工作电流为44μA。主要应用市场与优势是手机,手环,手表,各类低功耗IOT设备,集成各类应用算法,计步器,抬手亮屏,垂手亮屏,久坐提醒,跌倒报警,跌落报警,睡眠检测,平衡检测,倾斜检测,睡眠唤醒等超过20种不同应用。QMA6100P还具有低成本和与市场主流传感器兼容的优点,以及超低功耗、可靠性高的特点。下图是QMA6100P内部框图。

第三十二章 IIC595.png
图32.1.1 QMA6100P框图

       根据上文,QMA6100P三轴加速度计支持SPI和IIC两种通信接口。接口的实现流程可参考《13-52-20 QMA6100P Datasheet Rev. D.pdf》数据手册。本章节以ESP32-S3开发板电路为基准,该开发板使用IIC通信接口来获取QMA6100P三轴加速度计的相关参数。
       QMA6100P的引脚说明如下表所示。

1.png
图32.1.1 QMA6100P管脚描述

       32.1.1 QMA6100P寻址
       从规格书的章节5.4所示,QMA6100P在IIC通信下,具有两种设备地址设置,它们分别为0x12和0x13(7位串行地址)。这两个设备地址的选择是根据QMA6100P的第1号管脚确定,如下图所示:

第三十二章 IIC1163.png
图32.1.2 设备地址的选择

       从上图可知,当第1号管脚(AD0)拉低时,QMA6100P设备地址被设置为0x12,反次,该设备地址为0x13。本开发板是把AD0管脚拉低,所以在QMA6100P设备地址为0x12。

       32.1.2 QMA6100P寄存器介绍
       QMA6100P有一些列寄存器,由这些寄存器来控制QMA6100P的工作模式,以及中断配置和数据输出等。这里我们仅介绍我们在本章需要用到的一些寄存器,其他寄存器的描述和说明,请大家参考QMA6100P的数据手册。
       本章需要用到QMA6100P的寄存器如下表所示:

2.png
表32.1.2.1 QMA6100P相关寄存器及其说明

       其余的寄存器可在数据手册下找到相关描述和配置信息。

       32.1.3 QMA6100P时序介绍

       写寄存器
       QMA6100P的写寄存器时序如下图所示。

第三十二章 IIC1743.png
图32.1.3.1 QMA6100P写寄存器时序

       图中,先发送QMA6100P的地址(7位,0X12,左移一位后为:0X24),最低位W=0表示写数据,随后发送8位寄存器地址,最后发送8位寄存器值。其中:START,表示IIC起始信号;R/W,表示读/写标志位(R/W =0表示写,R/W =1表示读);SACK,表示应答信号;STOP,表示IIC停止信号。

       读寄存器
       QMA6100P的读寄存器时序如下图所示。

第三十二章 IIC1952.png
图32.1.3.2 QMA6100P读寄存器时序

       图中,同样是先发送7位地址+写操作,然后再发送寄存器地址,随后,重新发送起始信号(Sr),再次发送7位地址+读操作,然后读取寄存器值。其中:SA,表示重新发送IIC起始信号;MACK,表示MCU应答;NACK,表示设备应答;其他简写同上。

       32.2 硬件设计

       32.2.1 例程功能
       在LCD显示屏上,我们能够看到XYZ的数据。当我们翻转开发板时,这些数据会根据开发板的翻转角度来计算出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原理图,如下图所示。

第三十二章 IIC2444.png
图32.2.3.1 QMA6100P原理图

       这里说明一下,QMA6100P的QMA_INT脚是连接在XL9555器件的IO0_1脚上,如果大家要使用QMA6100P的中断输出功能,必须先初始化XL9555器件并配置IO0_1为输入功能,监测XL9555中断引脚是否有中断产生。若发现有中断产生,则判断是否是IO0_1导致的,从而检测到QMA6100P的中断。在本章中,并没有用到QMA6100P中断功能,所以没有对XL9555器件的IO0_1做设置。

       32.3 程序设计

       32.3.1 程序流程图
       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:


第三十二章 IIC2782.png
图32.3.1.1 QMA6100P实验程序流程图

       32.3.2 QMA6100P函数解析
       这一章节除了涉及到GPIO、IIC的API函数,便没有再涉及到其他API函数。因此,有关GPIO和IIC的API函数介绍,请读者回顾此前的第十章与第十九章的内容。接下来,笔者将直接介绍QMA6100P的驱动代码。

       32.3.3 QMA6100P驱动解析
       在IDF版22_qma6100p例程中,作者在22_qma6100p\components\BSP路径下新增了一个QMA6100P文件夹,分别用于存放qma6100p.c、qma6100p.h这两个文件。其中,qma6100p.h文件负责声明QMA6100P相关的函数和变量,而qma6100p.c文件则实现了QMA6100P的驱动代码。下面,我们将详细解析这两个文件的实现内容。

       1,qma6100p.h文件
       该文件下包含了对QMA6100P的命令配置以及寄存器地址的相关定义。
  1. #define QMA6100P_ADDR                     0x12      /* QMA6100P地址 */

  2. /* QMA6100P命令 */

  3. /* 获取ID,默认值为0x9x */
  4. #define QMA6100P_REG_CHIP_ID              0x00

  5. /* 数据寄存器,三轴数据,默认值为0x00 */
  6. #define QMA6100P_REG_XOUTL                0x01
  7. #define QMA6100P_REG_XOUTH                0x02
  8. #define QMA6100P_REG_YOUTL                0x03
  9. #define QMA6100P_REG_YOUTH                0x04
  10. #define QMA6100P_REG_ZOUTL                0x05
  11. #define QMA6100P_REG_ZOUTH                0x06

  12. /* 带宽寄存器 */
  13. #define QMA6100P_REG_BW_ODR               0x10
  14. /* 电源管理寄存器 */
  15. #define QMA6100P_REG_POWER_MANAGE        0x11
  16. /* 加速度范围,设置加速度计的满刻度 */
  17. #define QMA6100P_REG_RANGE                0x0f
  18. /* 软件复位 */  
  19. #define QMA6100P_REG_RESET                0x36

  20. #define QMA6100P_REG_ACC_VAL(lsb, msb)  ((int16_t)(((uint16_t)msb << 8) |
  21.                                                 ((uint16_t)lsb & 0xFC)) >> 2)

  22. typedef struct {
  23.     uint8_t data[2];
  24.     float  acc_x;
  25.     float  acc_y;
  26.     float  acc_z;
  27.     float  acc_g;
  28.     float  pitch;                       /* 围绕X轴旋转,也叫做俯仰角 */
  29.     float  roll;                        /* 围绕Z轴旋转,也叫翻滚角 */
  30. }qma6100p_rawdata_t;

  31. /* 设置量程寄存器 */
  32. typedef enum
  33. {
  34.     QMA6100P_BW_100 =   0,
  35.     QMA6100P_BW_200 =   1,
  36.     QMA6100P_BW_400 =   2,
  37.     QMA6100P_BW_800 =   3,
  38.     QMA6100P_BW_1600 =  4,
  39.     QMA6100P_BW_50 =    5,
  40.     QMA6100P_BW_25 =    6,
  41.     QMA6100P_BW_12_5 =  7,
  42.     QMA6100P_BW_OTHER = 8
  43. }qma6100p_bw;

  44. /* 设置加速度寄存器 */
  45. typedef enum
  46. {
  47.     QMA6100P_RANGE_2G =  0x01,
  48.     QMA6100P_RANGE_4G =  0x02,
  49.     QMA6100P_RANGE_8G =  0x04,
  50.     QMA6100P_RANGE_16G = 0x08,
  51.     QMA6100P_RANGE_32G = 0x0f
  52. }qma6100p_range;

  53. /* 设置复位寄存器 */
  54. typedef enum
  55. {
  56.     QMA6100P_RESET =     0xB6,
  57.     QMA6100P_RESET_END = 0x00,
  58. }qma6100p_reset;

  59. /* 设置中断 */
  60. typedef enum
  61. {
  62.     QMA6100P_MAP_INT1,
  63.     QMA6100P_MAP_INT2,
  64.     QMA6100P_MAP_INT_NONE
  65. }qma6100p_int_map;

  66. /* 设置管理寄存器 */
  67. typedef enum
  68. {
  69.     QMA6100P_ACTIVE =         0x80,
  70.     QMA6100P_ACTIVE_DIGITAL = 0x84,
  71.     QMA6100P_STANDBY =        0x00,
  72. }qma6100p_power;

  73. typedef enum
  74. {
  75.     QMA6100P_MCLK_102_4K =   0x03,
  76.     QMA6100P_MCLK_51_2K  =   0x04,
  77.     QMA6100P_MCLK_25_6K  =   0x05,
  78.     QMA6100P_MCLK_12_8K  =           0x06,
  79.     QMA6100P_MCLK_6_4K   =           0x07,
  80.     QMA6100P_MCLK_RESERVED = 0xff
  81. }qma6100p_mclk;

  82. typedef enum
  83. {
  84.     QMA6100P_SENSITITY_2G =  244,
  85.     QMA6100P_SENSITITY_4G =  488,
  86.     QMA6100P_SENSITITY_8G =  977,
  87.     QMA6100P_SENSITITY_16G = 1950,
  88.     QMA6100P_SENSITITY_32G = 3910
  89. }qma6100p_sensitity;
复制代码

       2,qma6100p.c文件
  1. /**
  2. * @brief       qma6100p初始化
  3. * @param       无
  4. * @retval      无
  5. */
  6. void qma6100p_init(i2c_obj_t self)
  7. {
  8.     if (self.init_flag == ESP_FAIL)
  9.     {
  10.         iic_init(I2C_NUM_0);    /* 初始化IIC */
  11.     }

  12.     qma6100p_i2c_master = self;
  13.    
  14.     while (qma6100p_config())   /* 检测不到qma6100p */
  15.     {
  16.         ESP_LOGE("qma6100p", "qma6100p init fail!!!");
  17.         vTaskDelay(500);
  18.     }
  19. }

  20. /**
  21. * @brief       初始化qma6100p
  22. * @param       无
  23. * @retval      0, 成功;
  24.                   1, 失败;
  25. */
  26. uint8_t qma6100p_config(void)
  27. {
  28. static uint8_t id_data[2];

  29. /* 读取设备ID,正常是0x90 */
  30.     qma6100p_register_read(QMA6100P_REG_CHIP_ID, id_data, 1);
  31.    
  32.     /* qma6100p的初始化序列,请看手册“6.3 Initial sequence”章节 */
  33.     qma6100p_register_write_byte(QMA6100P_REG_RESET, QMA6100P_RESET);
  34.     vTaskDelay(5);
  35.     qma6100p_register_write_byte(QMA6100P_REG_RESET, QMA6100P_RESET_END);
  36. vTaskDelay(10);

  37.     /* 读取设备ID,正常是0x90 */
  38.     qma6100p_register_read(QMA6100P_REG_CHIP_ID, id_data, 1);
  39.    
  40.     qma6100p_register_write_byte(0x11, 0x80);
  41.     qma6100p_register_write_byte(0x11, 0x84);
  42.     qma6100p_register_write_byte(0x4a, 0x20);
  43.     qma6100p_register_write_byte(0x56, 0x01);
  44.     qma6100p_register_write_byte(0x5f, 0x80);
  45.     vTaskDelay(1);
  46.     qma6100p_register_write_byte(0x5f, 0x00);
  47.     vTaskDelay(10);

  48.     qma6100p_register_write_byte(QMA6100P_REG_RANGE, QMA6100P_RANGE_8G);
  49.     qma6100p_register_write_byte(QMA6100P_REG_BW_ODR, QMA6100P_BW_100);
  50. qma6100p_register_write_byte(QMA6100P_REG_POWER_MANAGE,
  51.                                                                  QMA6100P_MCLK_51_2K | 0x80);

  52.     qma6100p_register_write_byte(0x21, 0x03);/* default 0x1c, step latch mode */
  53.    
  54.     qma6100p_step_int_config(QMA6100P_MAP_INT1, 1);
  55.    
  56.     if (id_data[0] == 0x90)
  57.     {
  58.         ESP_LOGE("qma6100p", "qma6100p success!!!");
  59.         return 0;        /* qma6100p正常 */
  60.     }
  61.     else
  62.     {
  63.         ESP_LOGE("qma6100p", "qma6100p fail!!!");
  64.         return 1;        /* qma6100p失败 */
  65.     }
  66. }
复制代码
       在qma6100_init()函数中,通过判断IIC初始化标志位,确认IIC是否已经初始化,如果没有则进行IIC初始化,已经初始化了则跳过。然后把IIC_SDA引脚和IIC_SCL引脚作为I2C_NUM_0的数据线和时钟线使用。然后调用了qma6100p_config函数,用于初始化和配置QMA6100P传感器模块。在qma6100p_config函数中,我们首先读取0x00寄存器来获取设备ID。然后,我们复位该设备并执行初始化序列(请参考规格书的6.3小节)。接下来,我们配置量程刻度、带宽、中断等参数。最后,我们检查读取的ID是否为0x90。如果是,则设备通信成功;否则,通信失败。
       接下来我们来讲解一下对QMA6100P的IIC写时序函数,我们编写QMA6100P的IIC写时序函数,如下所示:
  1. /**
  2. * @brief       向qma6100p寄存器写数据
  3. * @param       reg_addr                : 要写入的寄存器地址
  4. * @param       data                     : 要写入的数据
  5. * @retval      错误值                :0成功,其他值:错误
  6. */
  7. static esp_err_t qma6100p_register_write_byte(uint8_t reg, uint8_t data)
  8. {
  9.     uint8_t memaddr_buf[1];
  10.     memaddr_buf[0]  = reg;

  11.     i2c_buf_t bufs[2] = {
  12.         {.len = 1, .buf = memaddr_buf},
  13.         {.len = 1, .buf = &data},
  14.     };

  15.     i2c_transfer(&qma6100p_i2c_master, QMA6100P_ADDR, 2, bufs,I2C_FLAG_STOP);
  16.     return ESP_OK;
  17. }
复制代码
       在上述源代码中,作者根据传入的IIC控制块,调用了IIC收发函数来发送QMA6100P的命令和数据。发送完成后,函数返回了ESP_OK状态。
       接下来我们来讲解一下对QMA6100P的IIC读时序函数,我们编写QMA6100P的IIC读时序函数,如下所示:
  1. /**
  2. * @brief       读取qma6100p寄存器的数据
  3. * @param       reg_addr           : 要读取的寄存器地址
  4. * @param       data                 : 读取的数据
  5. * @param       len                   : 数据大小
  6. * @retval      错误值                :0成功,其他值:错误
  7. */
  8. esp_err_t qma6100p_register_read(const uint8_t reg, uint8_t *data, const size_t len)
  9. {
  10.     uint8_t memaddr_buf[1];
  11.     memaddr_buf[0]  = reg;

  12.     i2c_buf_t bufs[2] = {
  13.         {.len = 1, .buf = memaddr_buf},
  14.         {.len = len, .buf = data},
  15.     };

  16. i2c_transfer(&qma6100p_i2c_master,
  17.                                  QMA6100P_ADDR,
  18.                                  2,
  19.                                  bufs,
  20.                                  I2C_FLAG_WRITE | I2C_FLAG_READ | I2C_FLAG_STOP);
  21.     return ESP_OK;
  22. }
复制代码
       同样地,QMA6100P的读时序也是利用IIC收发函数来实现的。写时序和读时序的唯一区别在于最后的flag标志位不同,从而导致发送流程有所不同。
       下面是根据XYZ原始数据,使用特定的算法来计算pitch俯仰角和roll翻滚角,如下所示:
  1. /**
  2. * @brief          从QMA6100P寄存器中读取原始x,y,z轴数据
  3. * @param          data  : 3轴数据存储数组
  4. * @retval         无
  5. */
  6. void qma6100p_read_raw_xyz(int16_t data[3])
  7. {
  8.     uint8_t databuf[6] = {0};
  9.     int16_t raw_data[3];

  10.     qma6100p_read_reg(QMA6100P_XOUTL, databuf, 6);

  11.     raw_data[0] = (int16_t)(((databuf[1] << 8)) | (databuf[0]));
  12.     raw_data[1] = (int16_t)(((databuf[3] << 8)) | (databuf[2]));
  13.     raw_data[2] = (int16_t)(((databuf[5] << 8)) | (databuf[4]));

  14.     data[0] = raw_data[0] >> 2;
  15.     data[1] = raw_data[1] >> 2;
  16.     data[2] = raw_data[2] >> 2;
  17. }

  18. /**
  19. * @brief          计算得到加速度计的x,y,z轴数据
  20. * @param           accdata  : 3轴数据存储数组
  21. * @retval         无
  22. */
  23. void qma6100p_read_acc_xyz(float accdata[3])
  24. {
  25.     int16_t rawdata[3];

  26.     qma6100p_read_raw_xyz(rawdata);

  27.     accdata[0] = (float)(rawdata[0] * M_G) / 1024;
  28.     accdata[1] = (float)(rawdata[1] * M_G) / 1024;
  29.     accdata[2] = (float)(rawdata[2] * M_G) / 1024;
  30. }
复制代码
       上述源码中,作者先读取三轴的XYZ原始数据,然后经过特定的算法计算出pitch俯仰角和roll翻滚角。

       32.3.4 CMakeLists.txt文件
       打开本实验BSP下的CMakeLists.txt文件,其内容如下所示:
  1. set(src_dirs
  2.             IIC
  3.             KEY
  4.             LCD
  5.             LED
  6.             QMA6100P
  7.             SPI
  8.             XL9555)

  9. set(include_dirs
  10.             IIC
  11.             KEY
  12.             LCD
  13.             LED
  14.             QMA6100P
  15.             SPI
  16.             XL9555)

  17. set(requires
  18.             driver
  19.             esp_adc)

  20. idf_component_register(SRC_DIRS ${src_dirs}
  21. INCLUDE_DIRS ${include_dirs} REQUIRES ${requires})

  22. component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)
复制代码
       上述的红色QMA6100P驱动以及esp_adc依赖库需要由开发者自行添加,以确保QMA6100P驱动能够顺利集成到构建系统中。这一步骤是必不可少的,它确保了QMA6100P驱动的正确性和可用性,为后续的开发工作提供了坚实的基础。

       32.3.5 实验应用代码
       打开main/main.c文件,该文件定义了工程入口函数,名为app_main。该函数代码如下。
  1. i2c_obj_t i2c0_master;

  2. /**
  3. * @brief       显示原始数据
  4. * @param       x, y : 坐标
  5. * @param       title: 标题
  6. * @param       val  : 值
  7. * @retval      无
  8. */
  9. void user_show_mag(uint16_t x, uint16_t y, char *title, float val)
  10. {
  11.     char buf[20];

  12. sprintf(buf,"%s%3.1f", title, val);                         /* 格式化输出 */

  13. /* 清除上次数据(最多显示20个字符,20*8=160) */
  14.     lcd_fill(x + 30, y + 16, x + 160, y + 16, WHITE);
  15.     lcd_show_string(x, y, 160, 16, 16, buf, BLUE);      /* 显示字符串 */
  16. }

  17. /**
  18. * @brief       程序入口
  19. * @param       无
  20. * @retval      无
  21. */
  22. void app_main(void)
  23. {
  24.     uint8_t t;
  25.     qma6100p_rawdata_t xyz_rawdata;
  26.     esp_err_t ret;
  27.    
  28.     ret = nvs_flash_init();                     /* 初始化NVS */

  29. if (ret == ESP_ERR_NVS_NO_FREE_PAGES
  30. || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
  31.     {
  32.         ESP_ERROR_CHECK(nvs_flash_erase());
  33.         ret = nvs_flash_init();
  34.     }

  35.     led_init();                                 /* 初始化LED */
  36.     i2c0_master = iic_init(I2C_NUM_0);  /* 初始化IIC0 */
  37.     spi2_init();                                /* 初始化SPI2 */
  38.     xl9555_init(i2c0_master);                   /* 初始化XL9555 */
  39.     lcd_init();                                 /* 初始化LCD */
  40.     qma6100p_init(i2c0_master);                 /* 初始化三轴加速度计 */
  41.    
  42.     lcd_show_string(30, 50, 200, 16, 16, "ESP32", RED);
  43.     lcd_show_string(30, 70, 200, 16, 16, "QMA6100P TEST", RED);
  44.     lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
  45.     lcd_show_string(30, 110, 200, 16, 16, " ACC_X :", RED);
  46.     lcd_show_string(30, 130, 200, 16, 16, " ACC_Y :", RED);
  47.     lcd_show_string(30, 150, 200, 16, 16, " ACC_Z :", RED);
  48.     lcd_show_string(30, 170, 200, 16, 16, " Pitch :", RED);
  49.     lcd_show_string(30, 190, 200, 16, 16, " Roll  :", RED);

  50.     while (1)
  51.     {
  52.         vTaskDelay(10);
  53.         t++;

  54.         if (t == 20)                    /* 0.2秒左右更新一次三轴原始值 */
  55.         {   
  56.             qma6100p_read_rawdata(&xyz_rawdata);
  57.             
  58.             user_show_mag(30, 110, "ACC_X :", xyz_rawdata.acc_x);
  59.             user_show_mag(30, 130, "ACC_Y :", xyz_rawdata.acc_y);
  60.             user_show_mag(30, 150, "ACC_Z :", xyz_rawdata.acc_z);
  61.             user_show_mag(30, 170, "Pitch :", xyz_rawdata.pitch);
  62.             user_show_mag(30, 190, "Roll  :", xyz_rawdata.roll);
  63.             
  64.             t = 0;
  65.             LED_TOGGLE();
  66.         }
  67.     }
  68. }
复制代码
       从上述源码可知,我们首先初始化各个外设,如IIC、SPI、XL9555、QMA6100P和LCD等驱动,然后调用qma6100.qma6100p_read函数测量数据,最后调用qma6100p_acc_x等函数获取XYZG、pitch俯仰角和roll翻滚角数据,并在SPILCD上显示。。LED灯每隔200毫秒状态翻转,实现闪烁效果。

       32.4 下载验证
       程序下载到开发板后,LCD不断刷新三轴的原始数据、pitch俯仰角和roll翻滚角。当用户转动或翻转开发板时,pitch俯仰角和roll翻滚角会随之变化,如下图所示:

第三十二章 IIC13456.png
图32.4.1 QMA6100P实验测试图

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-27 20:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表