OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 30|回复: 0

《STM32H7R7开发指南 V1.1 》第四十五章 QMI8658A六轴传感器实验

[复制链接]

1332

主题

1348

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
5691
金钱
5691
注册时间
2019-5-8
在线时间
1532 小时
发表于 6 小时前 | 显示全部楼层 |阅读模式
第四十五章 QMI8658A六轴传感器实验

1)实验平台:正点原子STM32H7R7开发板

2)章节摘自【正点原子】STM32H7R7开发指南 V1.1

3)购买链接: https://detail.tmall.com/item.htm?id=820823382459

4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/stm32/zdyz_stm32h7rx.html

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

6)正点原子STM32开发板技术交流群:756580169


2.jpg

3.png

本章,我们将介绍一款高性价比六轴(三轴角速度(陀螺仪)+三轴加速度)传感器:QMI8658A,该传感器可广泛用于四轴、平衡车和空中鼠标等设计,性价比极高,具有非常广泛的应用范围。正点原子STM32H7R7开发板自带了QMI8658A传感器。本章我们将使用STM32H7R7来驱动QMI8658A,读取其原始数据,并利用MPL库实现姿态解算,结合匿名四轴上位机软件和LCD显示,教大家如何使用这款功能强大的六轴传感器。
本章分为如下几个小节:
45.1 QMI8658A介绍
45.2 硬件设计
45.3 软件设计
45.4 下载验证


45.1 QMI8658A介绍

45.1.1 QMI8658A简介
QMI8658A是一款针对大众市场,高性价比的六轴传感器,具有:功耗低、噪声低、封装小的特点。
QMI8658A内部集成有3轴陀螺仪和3轴加速度计;可以通过I3C、I2C和3线或4线SPI的接口和单片机进行数据交互,传输速率可达400kHZ/s。陀螺仪的角速度测量范围最高达±2048°/s,具有良好的动态响应特性。加速度计的测量范围最大为±16g(g为重力加速度),静态测量精度高。广泛应用于智能手机、游戏控制器、遥控器和汽车安全系统等场景。
QMI8658A的特点包括:
① 陀螺仪13 mdps/Hz的低噪声,低延迟,宽带宽
②150μg/Hz的加速度计噪声
③自带一个温度数字传感器
④可编程数字滤波器
⑤集成计步器,轻拍,任意运动,移动,显著运动检测
⑥自带1536字节FIFO可用于缓冲传感器数据,降低系统功耗
⑦超小封装尺寸:2.5×3.0×0.86mm(LGA)
QMI8658A传感器的检测轴如图45.1.1.1所示:


第四十五章 QMI8658A六轴传感器实验740.png
图45.1.1.1QMI8658A检测轴及其方向

QMI8658A的内部框图如图45.1.1.2所示:

第四十五章 QMI8658A六轴传感器实验794.png
图45.1.1.2 QMI8658A框图

其中,SCL和SDA可以连接MCU的I2C、I3C和SPI接口,MCU通过这些接口来控制QMI8658A,我们例程中用的就是IIC接口。另外,SA0是从IIC接口(接MCU)的地址控制引脚,该引脚控制IIC地址的最低位。如果接GND,则QMI8658A的IIC地址是:0X6B,如果接VDD,则是0X6A,注意:这里的地址是不包含数据传输的最低位的(最低位用来表示读写)!!
在STM32开发板上,SA0是接VCC的,所以QMI8658A的IIC地址是0X6A(不含最低位),IIC通信的时序我们在之前已经介绍过(第三十六章,IIC实验),这里就不再细说了。


45.1.2 QMI8658A寄存器
在这里简单介绍一下本实验用到的QMI8658A比较重要的寄存器。
陀螺仪配置寄存器(Gyroscope Settings)
该寄存器地址为:0X04,各位描述如表45.1.2.1所示:


1.png
表45.1.2.1 陀螺仪配置寄存器

该寄存器我们关心gFS[2:0]和gODR[3:0]这些位,gFS[2:0]用于设置陀螺仪的满量程范围:000,±16dps;001,±32dps;010,±64dps;011,±128dps;100,±256dps;101,±512dps;110,±1024dps;111,±2048dps;我们一般设置为011,即±128dps,因为陀螺仪的ADC为16位分辨率,所以得到灵敏度为:65536/256=256LSB(dps)。
gODR[3:0]位用于设置陀螺仪输出数据速率,我们例程中设置为0100,即约500Hz的速率。
加速度传感器配置寄存器(Accelerometer Settings)
该寄存器地址为:0X03,各位描述如下表所示:


2.png
表45.1.2.2 加速度传感器配置寄存器

该寄存器我们关心aFS[2:0]和aODR[3:0]这些位,aFS[2:0]用于设置加速度计的满量程范围:000,±2g;001,±4g;010,±8g;011,±16g;我们一般设置为011,即±16g,因为加速度传感器的ADC也是16位分辨率,所以得到灵敏度为:65536/32=2048LSB/g。
aODR[3:0]位用于设置加速度计输出数据速率,我们例程中设置为0100,即约500Hz的速率。
传感器数据处理寄存器(Sensor Data Processing Settings)
该寄存器的地址为:0X06,各位描述如表45.1.2.3所示:


3.png
表45.1.2.3 传感器数据处理寄存器

这里,我们主要关心数字低通滤波器(LPF_MODE)的设置位,即:gLPF_MODE[1:0]和aLPF_MODE[1:0],陀螺仪和加速度传感器分别根据这两个位的配置进行过滤。首先看陀螺仪gLPF_MODE[1:0]不同配置对应的过滤情况如表45.1.2.4所示:

4.png
表45.1.2.4 gLPF_MODE配置表

再看加速度aLPF_MODE[1:0]对应的过滤情况如表45.1.2.5所示:

5.png
表45.1.2.5 aLPF_MODE配置表

在例程中,我们将加速度传感器和陀螺仪的低通过滤器模式选择位:gLPF_MODE[1:0]和aLPF_MODE[1:0]都设置为11,即ODR的13.37%。
温度传感器数据输出寄存器(Temp Sensor Output)
该寄存器地址为:0X33-0X34,各位描述如表45.1.2.6所示:


6.png
表45.1.2.6 温度传感器数据输出寄存器

这个寄存器可以读取温度传感器的值,可以通过读取0X33(高8位)和0X34(低8位)寄存器得到,温度换算公式为:
T= TEMP_H + (TEMP_L/256)
其中,T为计算得到的温度值,单位为℃,TEMP_H(L)为从0X33和0X34读到的温度传感器值。
接下来,加速度传感器数据输出寄存器,也有6个,地址为:0X35~0X3A,通过读取这6个寄存器,就可以读到加速度传感器x/y/z轴的值,比如读x轴的数据,可以通过读取0X35(高8位)和0X36(低8位)寄存器得到,其他轴以此类推。
同样,我们看看陀螺仪数据输出寄存器,总共由6个寄存器组成,地址为:0X3B~0X40,通过读取0X3B(高8位)和0X3C(低8位)寄存器得到,其他轴以此类推。
关于QMI8658A的基础介绍,我们就介绍到这。QMI8658A的详细资料和相关寄存器介绍,请参考光盘:7,硬件资料→2,芯片资料→C3021082_姿态传感器-陀螺仪_QMI8658A_规格书_WJ411228.pdf这个文档,供大家参考学习。


45.2 硬件设计

1. 例程功能
本实验采用STM32H7R7的2个普通IO连接QMI8658A(IIC),本章实验功能简介:程序先初始化QMI8658A,然后利用imu姿态解算的计算,最后,在死循环里面不停读取:温度传感器、加速度传感器、陀螺仪、姿态解算后的欧拉角等数据,通过串口上报给上位机(温度不上报),利用上位机软件(ANO_TC匿名科创地面站v4.exe),可以实时显示QMI8658A的传感器状态曲线,并显示3D姿态,可以通过KEY0按键开启/关闭数据上传功能。同时,在LCD模块上面显示温度和欧拉角等信息。DS0来指示程序正在运行。

2. 硬件资源
1)LED灯  
       LED0 – PD14
2 ) 独立按键  
KEY0 – PE9
3)串口1 (波特率:500000,PB14/PB15连接在板载USB转串口芯片CH340上面)
4)正点原子2.8/3.5/4.3/7/10寸TFTLCD模块(包括MCU屏和RGB屏,都支持)
5)QMI8658A传感器

3. 原理图
QMI8658A与STM32的连接关系,如下图所示:


第四十五章 QMI8658A六轴传感器实验3705.png
图45.2.1 QMI8658A与STM32连接原理图

从上图可以看出,QMI8658A的SCL和SDA与STM32H7R7开发板的PF1和PF0连接。图中,SA0接的VCC,所以QMI8658A的器件地址是:0X6A。

45.3 程序设计

45.3.1 程序解析
1. QMI8658A驱动代码
这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。QMI8658A驱动源码包括两个文件:qmi8658.c和qmi8658.h。
qmi8658.h的文件是一些函数的定义,我们直接看qmi8658.c文件。
下面来看一下qmi8658_read_nbytes函数,实现QMI8658A芯片指定地址读取N字节数据,代码如下:

  1. /**
  2. * @brief   从QMI8568读取N字节数据
  3. * [url=home.php?mod=space&uid=271674]@param[/url]   reg:        寄存器地址
  4. * @param   date:       数据存储buf
  5. * @param   len:        数据长度
  6. * @retval  读出结果
  7. * @retval  0, 操作成功
  8. *          其他, 操作失败
  9. */
  10. int qmi8568_read_nbytes(uint8_t reg, uint8_t *date, uint8_t len)
  11. {
  12.     uint8_t i;
  13.    
  14.     iic_start();
  15.     iic_send_byte((QMI8658_ADDR << 1) | 0x00);
  16.     if (iic_wait_ack() != 0)
  17.     {
  18.         iic_stop();
  19.         return 1;
  20.     }
  21.     iic_send_byte(reg);
  22.     if (iic_wait_ack() != 0)
  23.     {
  24.         iic_stop();
  25.         return 1;
  26.     }
  27.    
  28.     iic_start();
  29.     iic_send_byte((QMI8658_ADDR << 1) | 0x01);
  30.     if (iic_wait_ack() != 0)
  31.     {
  32.         iic_stop();
  33.         return 1;
  34.     }
  35.     for (i = 0; i < len; i++)
  36.     {
  37.         date[i] = iic_read_byte((i == (len - 1)) ? 0 : 1);
  38.     }
  39.     iic_stop();
  40.    
  41.     return 0;
  42. }
复制代码
该函数首先调用iic_start函数产生起始信号,然后调用iic_send_byte函数发送第1个字节数据设备写地址,等待QMI8658A设备返回应答信号;收到应答信号后,继续发送第2个1字节数据内存地址reg;等待接收应答后,发送第3个1字节数据设备读地址;最后QMI8658A最先收到的是状态字节(一个字节),随后是读取的数据(数据都是两个字节),返回应答信号,主机调用iic_stop函数产生停止信号终止数据传输,等待QMI8658A读取完毕。
接下来看一下qmi8658_write_nbytes函数,实现从QMI8658A芯片指定地址写入数据,其定义如下:

  1. /**
  2. * @brief   QMI8568写入N字节数据
  3. * @param   reg:        寄存器地址
  4. * @param   data:       写入数据
  5. * @param   len:        数据长度
  6. * @retval  写入结果
  7. * @arg     0:          成功
  8. * @arg     1:          失败
  9. */
  10. uint8_t qmi8658_write_nbytes(uint8_t reg, uint8_t* data, uint8_t len)
  11. {
  12.     uint8_t i;
  13.    
  14.     iic_start();
  15.     iic_send_byte((QMI8658_ADDR << 1) | 0x00);
  16.     if (iic_wait_ack() != 0)
  17.     {
  18.         iic_stop();
  19.         return 1;
  20.     }
  21.     iic_send_byte(reg);
  22.     if (iic_wait_ack() != 0)
  23.     {
  24.         iic_stop();
  25.         return 1;
  26.     }
  27.     for (i = 0; i < len; i++)
  28.     {
  29.         iic_send_byte(data[i]);
  30.         if (iic_wait_ack() != 0)
  31.         {
  32.             iic_stop();
  33.             return 1;
  34.         }
  35.     }
  36.     iic_stop();
  37.    
  38.     return 0;
  39. }
复制代码
该函数首先调用iic_start函数产生起始信号,然后调用iic_send_byte函数发送第1个字节数据设备写地址,等待QMI8658A设备返回应答信号;收到应答信号后,继续发送第2个1字节写入数据内存地址reg;等待接收应答后,发送第3个1字节数据设备写地址;QMI8658A设备写完数据,返回应答信号,主机调用iic_stop函数产生停止信号终止数据传输,等待QMI8658A写入完毕。
最后,我们介绍一下读取数据函数,代码如下:

  1. /**
  2. * @brief   获取传感器温度
  3. * @param   无
  4. * @retval  温度值,单位为℃
  5. */
  6. float qmi8658_get_temperature(void)
  7. {
  8.     short temp = 0;
  9.     float temp_f = 0;
  10.     uint8_t buf[2];

  11.     qmi8568_read_nbytes(Register_Tempearture_L, buf, 2);    /* 读取温度数据 */   
  12.     temp = ((short)buf[1] << 8) | buf[0];
  13.     temp_f = (float)temp / 256.0f;
  14.     return temp_f;
  15. }


  16. /**
  17. * @brief   判断数据更新后,在读取补偿后QMI8658陀螺仪和加速度的数据(推荐使用)
  18. * @param   acc  : 加速度计 X,Y,Z缓存区;
  19. * @param   gyro : 陀螺仪 X,Y,Z缓存区;
  20. * @retval  无
  21. */
  22. void qmi8658_read_xyz(float *acc, float *gyro)
  23. {
  24.     unsigned char status = 0;
  25.     unsigned char data_ready = 0;
  26.     int retry = 0;

  27.     while (retry++ < 3)
  28.     {
  29. #if defined(QMI8658_SYNC_SAMPLE_MODE)
  30.         qmi8568_read_nbytes(Register_StatusInt, &status, 1);

  31.         if (status & 0x01)
  32.         {
  33.             delay_us(12);       /* delay 12us <=500Hz */
  34.         }
  35.         if ((status & 0x01) || (status & 0x03))
  36.         {
  37.             data_ready = 1;
  38.             break;
  39.         }
  40. #else
  41.         /* 检查加速度计和陀螺仪数据是否可用 */
  42.         qmi8568_read_nbytes(Register_Status0, &status, 1);
  43.         if (status & 0x03)
  44.         {
  45.             data_ready = 1;
  46.             break;
  47.         }
  48. #endif
  49.     }
  50.     if (data_ready)
  51.     {
  52.         qmi8658_read_sensor_data(acc, gyro);

  53.         g_imu.imu[0] = acc[0];
  54.         g_imu.imu[1] = acc[1];
  55.         g_imu.imu[2] = acc[2];
  56.         g_imu.imu[3] = gyro[0];
  57.         g_imu.imu[4] = gyro[1];
  58.         g_imu.imu[5] = gyro[2];
  59.     }
  60.     else
  61.     {
  62.         acc[0] = g_imu.imu[0];
  63.         acc[1] = g_imu.imu[1];
  64.         acc[2] = g_imu.imu[2];
  65.         gyro[0] = g_imu.imu[3];
  66.         gyro[1] = g_imu.imu[4];
  67.         gyro[2] = g_imu.imu[5];
  68. //      printf("数据还未准备好\r\n");    /* 调试使用 */
  69.     }
  70. }
复制代码
qmi8658_get_temperature函数:读取温度数据。
qmi8658_read_sensor_data函数:读取补偿后加速度计和陀螺仪的x,y,z轴原始数据。
下面看一下QMI8658A的初始化函数,其定义如下:

  1. /**
  2. * @brief   初始化QMI8658
  3. * @param   无
  4. * @retval  初始化结果
  5. * @arg     0: 成功
  6. * @arg     1: 失败
  7. */
  8. uint8_t qmi8658_init(void)
  9. {
  10.     iic_init();

  11.     qmi8658_reset();                                /* 复位传感器 */
  12.    
  13.     if(qmi8658_check_whoami())                      /* 检查设备ID是否正确 */
  14.     {
  15.         return 1;
  16.     }
  17.     if(qmi8658_calibration())
  18.     {
  19.         return 1;
  20.     }
  21.     printf("校准成功!!\r\n");

  22.     qmi8658_write_one_byte(Register_Ctrl1, 0x60);   /* I2C驱动 */
  23.     qmi8658_write_one_byte(Register_Ctrl7, 0x00);   /* 关闭陀螺仪、加速度计 */
  24.    
  25. qmi8658_config_reg(0);                          
  26. /* 配置陀螺仪和加速度计的量程和数据输出速率等参数 */
  27.     qmi8658_enablesensors(g_imu.cfg.ensensors);     /* 使能陀螺仪、加速度计 */

  28.     return 0;
  29. }
复制代码
在初始化函数中,我们主要对该模块的加速度、陀螺仪,还有温度传感器的使能和设置。

2. main.c代码

  1. /**
  2. * @brief    通过串口1上报结算后的姿态数据给电脑
  3. * @param    roll  : 横滚角.单位0.1度。 -9000 -> 9000 对应 -90.00  ->  90.00度
  4. * @param    pitch : 俯仰角.单位 0.1度。-18000 -> 18000 对应 -180.00 -> 180.00 度
  5. * @param    yaw   : 航向角.单位为0.1度 -18000 -> 18000  对应 -180.00 -> 180.00度
  6. * @param    prs   : 气压计高度,单位:cm
  7. * @param    fly_mode : 飞行模式
  8. * @param    armed    : 锁定状态
  9. * @retval   无
  10. */
  11. void usart1_report_imu(short roll, short pitch, short yaw, int prs, uint8_t fly_mode, uint8_t armed)
  12. {
  13.     uint8_t tbuf[12];
  14.   
  15.     tbuf[0] = (roll >> 8) & 0XFF;
  16.     tbuf[1] = roll & 0XFF;
  17.     tbuf[2] = (pitch >> 8) & 0XFF;
  18.     tbuf[3] = pitch & 0XFF;
  19.     tbuf[4] = (yaw >> 8) & 0XFF;
  20.     tbuf[5] = yaw & 0XFF;
  21.     tbuf[6] = (prs >> 24) & 0XFF;
  22.     tbuf[7] = (prs >> 16) & 0XFF;
  23.     tbuf[8] = (prs >> 8) & 0XFF;
  24.     tbuf[9] = prs & 0XFF;
  25.     tbuf[10] = fly_mode;
  26.     tbuf[11] = armed;
  27.     usart1_niming_report(0X01, tbuf, 12);   /* 状态帧,0X01 */
  28. }

  29. int main(void)
  30. {
  31.     uint8_t t = 0;
  32.     uint8_t key;
  33.     uint8_t report = 0;
  34.     float temperature;
  35.     float gyro[3];
  36.     float accel[3];
  37.     float euler_angle[3] = {0, 0, 0};
  38.    
  39.     sys_mpu_config();                   /* 配置MPU */
  40.     sys_cache_enable();                 /* 使能Cache */
  41.     HAL_Init();                         /* 初始化HAL库 */
  42.     sys_stm32_clock_init(300, 6, 2);    /* 配置时钟,600MHz */
  43.     delay_init(600);                    /* 初始化延时 */
  44.     usart_init(500000);                 /* 初始化串口 */
  45.     led_init();                         /* 初始化LED */
  46.     key_init();                         /* 初始化按键 */
  47.     hyperram_init();                    /* 初始化HyperRAM */
  48.     lcd_init();                         /* 初始化LCD */
  49.    
  50.     lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
  51.     lcd_show_string(30, 70, 200, 16, 16, "QMI8658A TEST", RED);
  52.     lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
  53.     lcd_show_string(30, 110, 200, 16, 16, "KEY0:UPLOAD ON/OFF", RED);
  54.    
  55.     while (qmi8658_init() != 0)        /* 初始化QMI8658A */
  56.     {
  57.         lcd_show_string(30, 130, 200, 16, 16, "QMI8658A Error!", RED);
  58.         delay_ms(500);
  59.         lcd_show_string(30, 130, 200, 16, 16, "Please Check!  ", RED);
  60.         delay_ms(500);
  61.         LED0_TOGGLE();
  62.     }
  63.    
  64.     lcd_show_string(30, 130, 200, 16, 16, "QMI8658A Ready!", RED);
  65.     lcd_show_string(30, 150, 200, 16, 16, "UPLOAD OFF", BLUE);
  66.     lcd_show_string(30, 170, 200, 16, 16, "Temp :    . C", BLUE);
  67.     lcd_show_string(30, 190, 200, 16, 16, "Pitch:    . C", BLUE);
  68.     lcd_show_string(30, 210, 200, 16, 16, "Roll :    . C", BLUE);
  69.     lcd_show_string(30, 230, 200, 16, 16, "Yaw  :    . C", BLUE);

  70.     while (1)
  71.     {
  72.         qmi8658_read_xyz(accel, gyro);
  73.         key = key_scan(0);
  74.         if (key == KEY0_PRES)
  75.         {
  76.             /* 切换匿名数据上报开关 */
  77.             report = !report;
  78.             if (report == 0)
  79.             {
  80.                 lcd_show_string(30, 150, 200, 16, 16, "UPLOAD OFF", BLUE);
  81.             }
  82.             else
  83.             {
  84.                 lcd_show_string(30, 150, 200, 16, 16, "UPLOAD ON ", BLUE);
  85.             }
  86.         }
  87.         
  88.         /* 获取并显示温度 */
  89.         show_data(30, 170, qmi8658_get_temperature());
  90.         
  91.         /* 获取并显示欧拉角 */
  92.         if (g_imu_init)
  93.         {
  94.             imu_get_eulerian_angles(accel, gyro, euler_angle, IMU_DELTA_T);
  95.             show_data(30, 190, euler_angle[0]);
  96.             show_data(30, 210, euler_angle[1]);
  97.             show_data(30, 230, euler_angle[2]);
  98.             
  99.             if (report != 0)
  100.             {
  101.                 /* 上报匿名状态帧 */
  102.                 qmi8658_send_data(accel[0], accel[1], accel[2], gyro[0],
  103. gyro[1], gyro[2]);  /* 发送加速度+陀螺仪原始数据 */
  104.                 usart1_report_imu((int)(euler_angle[1] * 100),
  105. (int)(euler_angle[0] * 100), (int)(euler_angle[2] * 100),
  106. 0, 0, 0);          /* Pitch和Roll角位置调换 */
  107.             }
  108.         }
  109.         if (++t == 100)
  110.         {
  111.             t = 0;
  112.             LED0_TOGGLE();
  113.         }
  114.         
  115.         delay_ms(10);
  116.     }
  117. }
复制代码
此部分代码除了main函数,还有几个函数,用于上报数据给上位机软件,可以通过上位机软件显示六轴传感器波形,以及3D姿态显示,有助于更好的调试QMI8658A。上位机软件使用ANO_TC匿名科创地面站v4.exe,该软件在:开发板光盘→6,软件资料→软件→5,其他软件→匿名地面站文件夹里可以找到,该软件的使用方法,见该文件夹下的:飞控通信协议v1.3-0720.pdf,这里我们不做介绍。其中,usart1_niming_report函数用于将数据打包、计算校验和,然后上报给匿名地面站上位机软件。qmi8658_send_data函数用于上报加速度和陀螺仪的原始数据,可用于波形显示传感器数据,通过传感器帧(0X02)发送。而uasrt1_report_imu函数,则用于发送匿名状态帧,可以实时3D显示QMI8658A的姿态,传感器数据等,通过状态帧(0X01)发送。
下面我们来看main函数,利用上位机软件(ANO_TC匿名科创地面站v4.exe),可以实时显示QMI8658A的传感器状态曲线,并显示3D姿态,可以通过KEY0按键开启/关闭数据上传功能。同时,在LCD模块上面显示温度和欧拉角等信息。


45.4 下载验证
将程序下载到开发板后,可以看到LCD显示的内容如图45.4.1所示:

第四十五章 QMI8658A六轴传感器实验13092.png
图45.4.1  程序运行效果

屏幕显示了QMI8658A的温度、俯仰角(Pitch)、横滚角(Roll)和航向角(Yaw)的数值。然后,我们可以晃动开发板,看看各角度的变化。
另外,模块默认是关闭状态,通过按下KEY0可以开启或关闭数据上报,在开启状态下,我们可以打开:ANO_TC匿名科创地面站v4.exe这个软件,接收STM32H7R7上传的数据,从而图形化显示飞行姿态,如图45.4.2所示:


第四十五章 QMI8658A六轴传感器实验13295.png
图45.4.2 飞控状态显示
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-5-20 15:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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