OpenEdv-开源电子网

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

《I.MX6U 嵌入式Qt开发指南》第二十三章 ICM20608

[复制链接]

1070

主题

1081

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4443
金钱
4443
注册时间
2019-5-8
在线时间
1199 小时
发表于 2022-8-31 10:00:03 | 显示全部楼层 |阅读模式
1)实验平台:正点原子阿尔法Linux开发板
2)  章节摘自【正点原子】《I.MX6U 嵌入式Qt开发指南》

3)购买链接:https://detail.tmall.com/item.htm?id=609033604451
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子阿尔法Linux交流群:1027879335




第二十三章 ICM20608

本章是ICM20608实验,与上一章类似,都是获取传感器的数据,ICM20608是一款六轴MEMS传感器,包括三轴加速度和三轴陀螺仪。因为与上一章类似,故本章只提供获取ICM20608的接口,不再重复设计界面程序。
更多ICM20608的信息请看【正点原子】I.MX6U用户快速体验V1.x.pdf的第3.21小节。

23.1 资源简介
在正点原子I.MX6ULL ALPHA开发板底板上有一个6轴MEMS传感器,也就是在底板上晶振旁边的传感器,采用的是spi接口。(注意:I.MX6ULL MINI开发板没有这个传器)。下图为I.MX6ULL ALPHA开发板的6轴MEMS传感器原理图。
image002.jpg
       开发板底板实物图。
image004.jpg


23.2
应用接口
本实验提供ICM20608的Qt访问出厂系统ICM20608驱动设备文件/dev/icm20608的接口。接口类Icm20608根据【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.x.pdf第六十二章 Linux SPI 驱动实验编写,想要理解原理请看【正点原子】I.MX6U 嵌入式Linux驱动开发指南,第六十二章,已经写得很详细。对于Qt访问底层驱动接口,我们需要对驱动有一点了解,否则学习起来是比较难的!建议读者全方面学习一下正点原子的I.MX6U配套教程。
源码路径为Qt/3/09_spi_icm20608_sensor。
“icm20608.h”,头文件如下。
  1. /******************************************************************

  2.     Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.

  3.     * @projectName   sensor

  4.     * @brief         icm20608.h

  5.     * [url=home.php?mod=space&uid=90321]@Author[/url]        Deng Zhimao

  6.     * [url=home.php?mod=space&uid=55957]@EMAIL[/url]         1252699831@qq.com

  7.     * [url=home.php?mod=space&uid=28414]@net[/url]            www.openedv.com

  8.     * @date           2020-07-10

  9.     *******************************************************************/

  10. 1   #ifndef ICM20608_H

  11. 2   #define ICM20608_H

  12. 3

  13. 4   #include <QObject>

  14. 5   #include <QTimer>

  15. 6

  16. 7   class Icm20608 : public QObject

  17. 8   {

  18. 9       Q_OBJECT

  19. 10

  20. 11  public:

  21. 12      explicit Icm20608(QObject *parent = 0);

  22. 13      ~Icm20608();

  23. 14

  24. 15      Q_INVOKABLE void setCapture(bool str);

  25. 16

  26. 17  private:

  27. 18      QTimer *timer;

  28. 19      QString gxdata;

  29. 20      QString gydata;

  30. 21      QString gzdata;

  31. 22      QString axdata;

  32. 23      QString aydata;

  33. 24      QString azdata;

  34. 25      QString tempdata;

  35. 26

  36. 27      QString gxData();

  37. 28      QString gyData();

  38. 29      QString gzData();

  39. 30      QString axData();

  40. 31      QString ayData();

  41. 32      QString azData();

  42. 33      QString tempData();

  43. 34

  44. 35      void icm20608ReadData();

  45. 36

  46. 37      Q_PROPERTY(QString gxData READ gxData NOTIFY icm20608DataChanged)

  47. 38      Q_PROPERTY(QString gyData READ gyData NOTIFY icm20608DataChanged)

  48. 39      Q_PROPERTY(QString gzData READ gzData NOTIFY icm20608DataChanged)

  49. 40      Q_PROPERTY(QString axData READ axData NOTIFY icm20608DataChanged)

  50. 41      Q_PROPERTY(QString ayData READ ayData NOTIFY icm20608DataChanged)

  51. 42      Q_PROPERTY(QString azData READ azData NOTIFY icm20608DataChanged)

  52. 43      Q_PROPERTY(QString tempData READ tempData NOTIFY icm20608DataChanged)

  53. 44

  54. 45  public slots:

  55. 46      void timer_timeout();

  56. 47

  57. 48

  58. 49  signals:

  59. 50      void icm20608DataChanged();

  60. 51  };

  61. 52

  62. 53  #endif // ICM20608_H
复制代码
“icm20608.h”,源文件如下。
  1. /******************************************************************

  2.     Copyright &#169; Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.

  3.     * @projectName   sensor

  4.     * @brief         icm20608.cpp

  5.     * @author        Deng Zhimao

  6.     * @email         1252699831@qq.com

  7.     * @net            www.openedv.com

  8.     * @date           2020-07-10

  9.     *******************************************************************/

  10. 1   #include "icm20608.h"

  11. 2   #include <stdio.h>

  12. 3   #include <string.h>

  13. 4   #include <sys/types.h>

  14. 5   #include <sys/stat.h>

  15. 6   #include <fcntl.h>

  16. 7   #include <unistd.h>

  17. 8   #include <QDebug>

  18. 9

  19. 10  Icm20608::Icm20608(QObject *parent) : QObject (parent)

  20. 11  {

  21. 12      timer = new QTimer();

  22. 13  #if __arm__

  23. 14      system("insmod /home/root/driver/icm20608/icm20608.ko");

  24. 15  #endif

  25. 16      connect(timer,SIGNAL(timeout()),this,SLOT(timer_timeout()));

  26. 17  }

  27. 18

  28. 19  Icm20608::~Icm20608()

  29. 20  {

  30. 21

  31. 22  }

  32. 23

  33. 24  void Icm20608::icm20608ReadData()

  34. 25  {

  35. 26      int fd;

  36. 27      char const *filename = "/dev/icm20608";

  37. 28      signed int databuf[7];

  38. 29      unsigned char data[14];

  39. 30      signed int gyro_x_adc, gyro_y_adc, gyro_z_adc;

  40. 31      signed int accel_x_adc, accel_y_adc, accel_z_adc;

  41. 32      signed int temp_adc;

  42. 33

  43. 34      float gyro_x_act, gyro_y_act, gyro_z_act;

  44. 35      float accel_x_act, accel_y_act, accel_z_act;

  45. 36      float temp_act;

  46. 37

  47. 38      int ret = 0;

  48. 39

  49. 40      fd = open(filename, O_RDWR);

  50. 41      if(fd < 0) {

  51. 42          printf("can't open file %s\r\n", filename);

  52. 43          return;

  53. 44      }

  54. 45

  55. 46      ret = read(fd, databuf, sizeof(databuf));

  56. 47      /* 若读取成功 */

  57. 48      if (ret == 0) {

  58. 49          gyro_x_adc = databuf[0];

  59. 50          gyro_y_adc = databuf[1];

  60. 51          gyro_z_adc = databuf[2];

  61. 52          accel_x_adc = databuf[3];

  62. 53          accel_y_adc = databuf[4];

  63. 54          accel_z_adc = databuf[5];

  64. 55          temp_adc = databuf[6];

  65. 56

  66. 57          /* 实际值 */

  67. 58          gyro_x_act = (float)(gyro_x_adc)  / 16.4;

  68. 59          gyro_y_act = (float)(gyro_y_adc)  / 16.4;

  69. 60          gyro_z_act = (float)(gyro_z_adc)  / 16.4;

  70. 61          accel_x_act = (float)(accel_x_adc) / 2048;

  71. 62          accel_y_act = (float)(accel_y_adc) / 2048;

  72. 63          accel_z_act = (float)(accel_z_adc) / 2048;

  73. 64          temp_act = ((float)(temp_adc) - 25 ) / 326.8 + 25;

  74. 65

  75. 66          gxdata = QString::number(gyro_x_act, 'f', 2);

  76. 67          gydata = QString::number(gyro_y_act, 'f', 2);

  77. 68          gzdata = QString::number(gyro_z_act, 'f', 2);

  78. 69          axdata = QString::number(accel_x_act, 'f', 2);

  79. 70          aydata = QString::number(accel_y_act, 'f', 2);

  80. 71          azdata = QString::number(accel_z_act, 'f', 2);

  81. 72          tempdata = QString::number(temp_act, 'f', 2);

  82. 73      }

  83. 74      close(fd);

  84. 75      emit icm20608DataChanged();

  85. 76  }

  86. 77

  87. 78  QString Icm20608::gxData()

  88. 79  {

  89. 80      return  gxdata;

  90. 81  }

  91. 82

  92. 83  QString Icm20608::gyData()

  93. 84  {

  94. 85      return  gydata;

  95. 86  }

  96. 87

  97. 88  QString Icm20608::gzData()

  98. 89  {

  99. 90      return  gzdata;

  100. 91  }

  101. 92

  102. 93  QString Icm20608::axData()

  103. 94  {

  104. 95      return  axdata;

  105. 96  }

  106. 97

  107. 98  QString Icm20608::ayData()

  108. 99  {

  109. 100     return  aydata;

  110. 101 }

  111. 102

  112. 103 QString Icm20608::azData()

  113. 104 {

  114. 105     return  azdata;

  115. 106 }

  116. 107

  117. 108 QString Icm20608::tempData()

  118. 109 {

  119. 110     return  tempdata;

  120. 111 }

  121. 112

  122. 113

  123. 114 void Icm20608::timer_timeout()

  124. 115 {

  125. 116     icm20608ReadData();

  126. 117 }

  127. 118

  128. 119 void Icm20608::setCapture(bool str)

  129. 120 {

  130. 121     if(str)

  131. 122         timer->start(500);

  132. 123     else

  133. 124         timer->stop();

  134. 125 }
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-8 15:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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