查看: 262|回复: 0

[经验] 飞凌嵌入式ElfBoard ELF 1板卡-运动追踪之编写程序

[复制链接]

该用户从未签到

发表于 2024-12-3 09:25:23 | 显示全部楼层 |阅读模式
分享到:
编程步骤
(一)打开设备
  1. #define ICM20607_DEV "/dev/icm20607"



  2.         fd = open(ICM20607_DEV, O_RDWR);

  3.         if(fd < 0) {

  4.                 printf("can't open file %s\r\n", ICM20607_DEV);

  5.                 return -1;

  6.         }
复制代码
宏定义板卡上的传感器节点为/dev/icm20607;
使用open()打开传感器,如果错误返回-1;
(二)读取数据
  1. ret = read(fd, databuf, sizeof(databuf));
复制代码
使用read将设备中的数据读取出来放入datebuf中。
(三)定义数组成员
  1. gyro_x_adc = databuf[0];

  2.                         gyro_y_adc = databuf[1];

  3.                         gyro_z_adc = databuf[2];

  4.                         accel_x_adc = databuf[3];

  5.                         accel_y_adc = databuf[4];

  6.                         accel_z_adc = databuf[5];

  7.                         temp_adc = databuf[6];
复制代码
把x、y、z轴的角速度,x、y、z轴的加速度和温度一共7个元素填入数组内,这些成员是从设备中读取出来的数据。
(四)数据类型转换
  1. gyro_x_act = (float)(gyro_x_adc)  / 16.4;

  2.                         gyro_y_act = (float)(gyro_y_adc)  / 16.4;

  3.                         gyro_z_act = (float)(gyro_z_adc)  / 16.4;

  4.                         accel_x_act = (float)(accel_x_adc) / 2048;

  5.                         accel_y_act = (float)(accel_y_adc) / 2048;

  6.                         accel_z_act = (float)(accel_z_adc) / 2048;

  7.                         temp_act = ((float)(temp_adc) - 25 ) / 326.8 + 25;
复制代码
因为角速度、加速度和温度这些都不能用常量表示,所以需要给他们转换成浮点量,并做相应数学计算,以转换成我们可读的数据。
(五)关闭设备
  1. close(fd);
复制代码
详细代码
elf1_cmd_icm20607:
  1. elf1_cmd_icm20607:

  2. #include "stdio.h"

  3. #include "unistd.h"

  4. #include "sys/types.h"

  5. #include "sys/stat.h"

  6. #include "sys/ioctl.h"

  7. #include "fcntl.h"

  8. #include "stdlib.h"

  9. #include "string.h"

  10. #include <poll.h>

  11. #include <sys/select.h>

  12. #include <sys/time.h>

  13. #include <signal.h>

  14. #include <fcntl.h>



  15. #define ICM20607_DEV "/dev/icm20607"



  16. int main(int argc, char *argv[])

  17. {

  18.         int fd;

  19.         signed int databuf[7];

  20.         unsigned char data[14];

  21.         signed int gyro_x_adc, gyro_y_adc, gyro_z_adc;

  22.         signed int accel_x_adc, accel_y_adc, accel_z_adc;

  23.         signed int temp_adc;



  24.         float gyro_x_act, gyro_y_act, gyro_z_act;

  25.         float accel_x_act, accel_y_act, accel_z_act;

  26.         float temp_act;



  27.         int ret = 0;



  28.         fd = open(ICM20607_DEV, O_RDWR);

  29.         if(fd < 0) {

  30.                 printf("can't open file %s\r\n", ICM20607_DEV);

  31.                 return -1;

  32.         }



  33.         while (1) {

  34.                 ret = read(fd, databuf, sizeof(databuf));

  35.                 if(ret == 0) {                         /* ?????? */

  36.                         gyro_x_adc = databuf[0];

  37.                         gyro_y_adc = databuf[1];

  38.                         gyro_z_adc = databuf[2];

  39.                         accel_x_adc = databuf[3];

  40.                         accel_y_adc = databuf[4];

  41.                         accel_z_adc = databuf[5];

  42.                         temp_adc = databuf[6];



  43.                         /* ????? */

  44.                         gyro_x_act = (float)(gyro_x_adc)  / 16.4;

  45.                         gyro_y_act = (float)(gyro_y_adc)  / 16.4;

  46.                         gyro_z_act = (float)(gyro_z_adc)  / 16.4;

  47.                         accel_x_act = (float)(accel_x_adc) / 2048;

  48.                         accel_y_act = (float)(accel_y_adc) / 2048;

  49.                         accel_z_act = (float)(accel_z_adc) / 2048;

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





  51.                         printf("\r\n");

  52.                         printf("raw value:\r\n");

  53.                         printf("gx = %d, gy = %d, gz = %d\r\n", gyro_x_adc, gyro_y_adc, gyro_z_adc);

  54.                         printf("ax = %d, ay = %d, az = %d\r\n", accel_x_adc, accel_y_adc, accel_z_adc);

  55.                         printf("temp = %d\r\n", temp_adc);



  56.                         printf("\r\n");

  57.                         printf("act value:\r\n");

  58.                         printf("act gx = %.2f度/S, act gy = %.2f度/S, act gz = %.2f度/S\r\n", gyro_x_act, gyro_y_act, gyro_z_act);

  59.                         printf("act ax = %.2fg, act ay = %.2fg, act az = %.2fg\r\n", accel_x_act, accel_y_act, accel_z_act);

  60.                         printf("act temp = %.2f摄氏度\r\n", temp_act);

  61.                 }

  62.                 sleep(1); /*1s */

  63.         }

  64.         close(fd);       

  65.         return 0;

  66. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条



手机版|小黑屋|与非网

GMT+8, 2024-12-18 20:41 , Processed in 0.115609 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.