当前位置: 首页 > news >正文

Linux 外设驱动 应用 6 陀螺仪实验

Linux 外设驱动 应用

文章目录

  • Linux 外设驱动 应用
  • 1 陀螺仪实验
    • 1.1 背景介绍
    • 1.2 硬件接口
    • 1.3 MPU6050 寄存器的数据格式
  • 2 代码展示
  • 3 现实效果
  • 4 数据融合

1 陀螺仪实验

1.1 背景介绍

螺旋仪是一种用来传感与维持方向的装置,基于角动量守恒的理论设计出来的。陀螺仪主要是由一个位于轴心且可旋转的转子构成。陀螺仪一旦开始旋转,由于转子的角动量,陀螺仪有抗拒方向改变的趋向。

陀螺仪多用于导航、定位等系统常用实例如手机GPS定位导航、卫星三轴陀螺仪定位。陀螺仪基本上就是运用物体高速旋转时,角动量很大,旋转轴会一直稳定指向一个方向的性质,所制造出来的定向仪器。不过它必需转得够快,或者惯量够大(也可以说是角动量要够大)。不然,只要一个很小的力矩,就会严重影响到它的稳定性。

1.2 硬件接口

采用I2C通讯接口,
在这里插入图片描述

1.3 MPU6050 寄存器的数据格式

MPU-60X0 是全球首例9 轴运动处理传感器。它集成了3 轴MEMS 陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其I2C 或SPI 接口输出一个9 轴的信号(SPI 接口仅在MPU-6000 可用)。MPU-60X0 也可以通过其I2C 接口连接非惯性的数字传感器,比如压力传感器。

MPU-60X0 对陀螺仪和加速度计分别用了三个16 位的ADC,将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±500,±1000,±2000°/秒(dps),加速度计可测范围为2,±4,±8,±16g。
一个片上1024 字节的FIFO,有助于降低系统功耗。和所有设备寄存器之间的通信采用400kHz 的I2C 接口或1MHz 的SPI 接口(SPI 仅MPU-6000 可用)。对于需要高速传输的应用,对寄存器的读取和中断可用20MHz 的SPI。

数据位于 0x3B 到 0x48 这 14 个字节的寄存器中。这些数据会被动态更新,更新频率最高可达 1000HZ。

下面列出相关寄存器的地址,数据的名称。注意,每个数据都是 2 个字节。

0x3B,加速度计的 X 轴分量 ACC_X
0x3D,加速度计的 Y 轴分量 ACC_Y
0x3F,加速度计的 Z 轴分量 ACC_Z
0x41,当前温度 TEMP
0x43,绕 X 轴旋转的角速度 GYR_X
0x45,绕 Y 轴旋转的角速度 GYR_Y
0x47,绕 Z 轴旋转的角速度 GYR_Z

MPU6050 芯片的座标系是这样定义的:令芯片表面朝向自己,将其表面文字转至正确角度,此时,以芯片内部中心为原点,水平向右的为 X 轴,竖直向上的为 Y 轴,指向自己的为 Z 轴。

在这里插入图片描述

2 代码展示

int main(int argc, char *argv[])
{
	int fd_accx;
	int fd_accy;
	int fd_accz;
	int fd_angx;
	int fd_angy;
	int fd_angz;
	int fd_temp;
	char buff[10];
	while(1)
	{
		/*******open***********/
		if ((fd_accx = open(in_accel_x_raw, O_RDONLY)) < 0) 
		{
			perror("open error in_accel_x_raw\n");
			return 1;
		}
		if ((fd_accy = open(in_accel_y_raw, O_RDONLY)) < 0) 
		{
			perror("open error in_accel_y_raw\n");
			return 1;
		}
		if ((fd_accz = open(in_accel_z_raw, O_RDONLY)) < 0) 
		{
			perror("open error in_accel_z_raw\n");
			return 1;
		}
		if ((fd_angx = open(in_anglvel_x_raw, O_RDONLY)) < 0) 
		{
			perror("open error in_anglvel_x_raw\n");
			return 1;
		}
		if ((fd_angy = open(in_anglvel_y_raw, O_RDONLY)) < 0) 
		{
			perror("open error in_anglvel_y_raw\n");
			return 1;
		}
		if ((fd_angz = open(in_anglvel_z_raw, O_RDONLY)) < 0) 
		{
			perror("open error in_anglvel_z_raw\n");
			return 1;
		}
		if ((fd_temp = open(in_temp_raw, O_RDONLY)) < 0) 
		{
			perror("open error in_temp_raw\n");
			return 1;
		}
		
        /**********read**************/
		if (read(fd_accx, buff, 10)) {
			g_mpu6050.Accel_X=atoi(buff);
		}
		if (read(fd_accy,buff,10)) {
			g_mpu6050.Accel_Y=atoi(buff);
		}
		if (read(fd_accz,buff,10)) {
			g_mpu6050.Accel_Z=atoi(buff);
		}

		if (read(fd_angx,buff,10)) {
			g_mpu6050.GYRO_X=atoi(buff);
		}
		if (read(fd_angy,buff,10)) {
			g_mpu6050.GYRO_Y=atoi(buff);
		}
		if (read(fd_angz,buff,10)) {
			g_mpu6050.GYRO_Z=atoi(buff);
		}

		if (read(fd_temp,buff,10)) {
			g_mpu6050.Temp=atoi(buff);
		}
		accel_to_angle();//У׼ֵ
		printf("\033[10A");
		printf("\033[K");
		usleep(100000);
		/**********close*******************/
		close(fd_accx);
		close(fd_accy);
		close(fd_accz);
		close(fd_angx);
		close(fd_angy);
		close(fd_angz);
		close(fd_temp);
	}
}

3 现实效果

4 数据融合

后期加入数据融合算法,计算偏转的角度

相关文章:

  • 【算法】链表
  • Unity Shader学习6:多盏平行光+点光源 ( 逐像素 ) 前向渲染 (Built-In)
  • Word中接入大模型教程
  • 深度学习框架探秘|Keras:深度学习的魔法钥匙
  • 最新智能优化算法: 贪婪个体优化算法(Greedy Man Optimization Algorithm,GMOA)求解23个经典函数测试集,MATLAB代码
  • Vivado生成edif网表及其使用
  • 高效学习方法分享
  • Python学习心得常见的异常
  • Redis 主从复制
  • Mybatis后端数据库查询多对多查询解决方案
  • Lombok注解@EqualsAndHashCode
  • apache artemis安装
  • Git 使用指南:避免使用 merge 的完整流程
  • python学opencv|读取图像(六十七)使用cv2.convexHull()函数实现图像轮廓凸包标注
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_create_pool函数
  • 《第三代大语言模型Grok 3:闪亮登场》
  • OpenCV(1):简介、安装、入门案例、基础模块
  • Qt 中使用 SQLite 数据库的完整指南
  • DeepSeek 的创新融合:多行业应用实践探索
  • 网络安全攻防演练——RT实战技巧篇
  • 特朗普与普京通话前夕,英美法德意领导人通话讨论俄乌问题
  • 广西北流出现强降雨,1人被洪水冲走已无生命体征
  • 林诗栋/蒯曼混双取胜,国乒赢得多哈世乒赛开门红
  • 第十届曹禺剧本奖上海揭晓,首次开放个人申报渠道
  • 赡养纠纷个案推动类案监督,检察机关保障特殊群体胜诉权
  • 恒生银行回应裁员传闻:受影响的员工数目占银行核心业务员工总数约1%