OpenEdv-开源电子网

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

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

[复制链接]

1118

主题

1129

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4672
金钱
4672
注册时间
2019-5-8
在线时间
1224 小时
发表于 2021-7-20 10:36:21 | 显示全部楼层 |阅读模式
1)实验平台:正点原子阿尔法Linux开发板
2)  章节摘自【正点原子】《I.MX6U嵌入式Qt开发指南 V1.0》
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   QQ群.png

原子哥.jpg

微信公众号.png


第二十三章 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传感器原理图。
第二十三章 ICM20608412.png
        开发板底板实物图。
第二十三章 ICM20608425.png
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]         <a href="mailto:1252699831@qq.com">1252699831@qq.com</a>
  7.     * [url=home.php?mod=space&uid=28414]@net[/url]            <a href="www.openedv.com" target="_blank">www.openedv.com</a>
  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         <a href="mailto:1252699831@qq.com">1252699831@qq.com</a>
  7.     * @net            <a href="www.openedv.com" target="_blank">www.openedv.com</a>
  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-11-25 18:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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