7.I2C子系统(下)

本文详细介绍了如何编写MPU6050的I2C驱动,包括驱动模块的基本框架搭建、I2C驱动注册与注销、设备号申请与释放、自定义read/write方法。同时讲解了陀螺仪和加速度计的工作原理以及MPU6050的操作寄存器配置。在应用程序中,通过ioctl命令读取并上报重力加速度和陀螺仪的值。
摘要由CSDN通过智能技术生成

MPU6050的I2C driver驱动框架编写

1.搭建驱动模块基本框架
2.在init函数中构建i2c driver,并注册到i2c总线i2c_add_driver(struct i2c_driver *driver)
并且在exit函数中释放i2c_del_driver(struct i2c_driver *driver)
在这里插入图片描述
3.在i2c_driver中实现方法probe、remove,给driver结构体赋值
在这里插入图片描述在这里插入图片描述

4.在probe方法中申请设备号,实现fops,创建设备文件,通过i2c的接口去初始化i2c从设备
register_chrdev()
class_create()
device_create()
在remove方法中释放:
device_destroy()
class_destroy()
unregister_chrdev()
kfree()
在这里插入图片描述在这里插入图片描述

5.自己写write、read方法
在这里插入图片描述在这里插入图片描述

MPU6050操作寄存器

5,陀螺仪和加速度工作原理,它们的应用
陀螺仪的作用:
原理:
小时候玩过陀螺,如果给它一定的旋转速度,陀螺会竖立旋转起来而不会倒,
主要因为高速旋转有抗拒方向改变的趋向

		陀螺仪就是内部的转子高速旋转,形成一个固定的初始化的参考平面,
		这样就可以通过测量初始的参考平面偏差计算出物体的旋转情况
		陀螺仪的强项在于测量设备自身的旋转运动

	陀螺仪的产生:
		1850年法国的物理学家福柯(J.Foucault)为了研究地球自转,首先发现高速转动中的转子(rotor),
		由于惯性作用它的旋转轴永远指向一固定方向,他用希腊字gyro(旋转)和skopein(看)
		两字合为gyro scopei一字来命名这种仪表

	陀螺仪的基本部件:
		(1) 陀螺转子,转子装在一支架内
		(2)内、外环,它是使陀螺自转轴获得所需角转动自由度的结构
			内环可环绕平面两轴作自由运动
			在内环架外加上一外环架,可以环绕平面做三轴作自由运动
		(3) 附件(是指力矩马达、信号传感器等)。

	陀螺仪的数据获取:		
		XYZ分别代表设备围绕XYZ三个轴旋转的角速度,陀螺仪可以捕捉很微小的运动轨迹变化,
		因此可以做高分辨率和快速反应的旋转检测,但不能测量当前的运行方向

	应用:
		1,陀螺仪用于飞行体运动的自动控制系统中,作为水平、垂直、俯仰、航向和角速度传感器
		2,手机上的摄像头配合使用,比如防抖
		3,各类手机游戏的传感器,包括一些第一视角类射击游戏,陀螺仪完整监测游戏者手的位移
		   手机中的陀螺仪最早被iphone4应用,所以被大家所熟知
		4,导航,手机配合GPS,导航能力已经可以达到专用的gps导航仪

重力加速度:
	原理:
		重力施加在物体上,使它产生一个加速度,重力大小和此物体的质量成正比
		物体在不同的运行中,会产生不同的重力,从而可以测量出物体的运动情况

	重力加速度的数据获取:
		加速度测量传感器有x、y、z三轴,注意在手机上屏幕的坐标,以左上角作为原点的,而且Y向下。
		注意区分这两个不同的坐标系。
		加速传感器的单位是加速度m/s2。如果手机平放好,x,y在位置为0,
		而z轴方向加速度=当前z方向加速度-g。由于g(重力加速度)垂直向下,
		则g=-9.81m/s2,即z轴 a=0-(-9.81)=9.81m/s2
	应用:
		1,图像自动翻转
		2,游戏控制
		3,计步器功能

6,寄存器:
#define SMPLRT_DIV 0x19 //采样频率寄存器-25 典型值:0x07(125Hz)
//寄存器集合里的数据根据采样频率更新
#define CONFIG 0x1A //配置寄存器-26-典型值:0x06(5Hz)
//DLPF is disabled(DLPF_CFG=0 or 7)
#define GYRO_CONFIG 0x1B//陀螺仪配置-27,可以配置自检和满量程范围
//典型值:0x18(不自检,2000deg/s)
#define ACCEL_CONFIG 0x1C //加速度配置-28 可以配置自检和满量程范围及高通滤波频率
//典型值:0x01(不自检,2G,5Hz)
#define ACCEL_XOUT_H 0x3B //59-65,加速度计测量值 XOUT_H
#define ACCEL_XOUT_L 0x3C // XOUT_L
#define ACCEL_YOUT_H 0x3D //YOUT_H
#define ACCEL_YOUT_L 0x3E //YOUT_L
#define ACCEL_ZOUT_H 0x3F //ZOUT_H
#define ACCEL_ZOUT_L 0x40 //ZOUT_L—64
#define TEMP_OUT_H 0x41 //温度测量值–65
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43 //陀螺仪值–67,采样频率(由寄存器 25 定义)写入到这些寄存器
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48 //陀螺仪值–72
#define PWR_MGMT_1 0x6B //电源管理 典型值:0x00(正常启用)

在probe方法中通过i2c的接口去初始化i2c从设备
在这里插入图片描述

读取MPU6050数据寄存器并上报给用户

在这里插入图片描述
实现fops
在这里插入图片描述
7, ioctl: 给驱动发送不同指令
应用程序:
ioctl(fd, cmd, args);
========================================
驱动中:xxx_ioctl()
{
switch(cmd){

		}
}

如何定义命令:
	1, 直接定义一个数字
		#define IOC_GET_ACCEL  0x9999
	2, 通过系统的接口
		_IO(x,y)
		_IOR(x,y,z)
		_IOW(x,y,z)

		参数1:表示magic,字符
		参数2:区分不同命令,整数 
		参数3:传给驱动数据类型

在这里插入图片描述在这里插入图片描述

应用程序读取重力加速度和陀螺仪的值

8,mpu6050的数据
陀螺仪可测范围为 欧拉角格式±250,±500,±1000,±2000°/秒(dps) ,加速度计可测范围为±2,±4,±8,±16g
加速度读取的值为:
AFS_SEL Full scale rang LSB Sensitivy
0 ±2g -----------------------16384 LSB/g
1 ±4g -----------------------8192 LSB/g
2 ±8g -----------------------4096 LSB/g
3 ±16g------------------------2048 LSB/g

	温度值:
			C = (TEMP_OUT Register Value )/340 + 36.53
		
	陀螺仪值:
		FS_SEL      Full scale rang                  LSB  Sensitivy
		0				+-250 度/s ------------------131 LSB 度/s
		1				+-500 度/s ------------------65.5 LSB 度/s
		2				+-1000 度/s -----------------32.8 LSB 度/s
		3				+-2000 度/s ------------------16.4 LSB 度/s
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>


#include "mpu6050.h"


int main(int argc, char *argv[])
{
   
	int fd;
	
	union mpu6050_data data;
	
	fd = open("/dev/mpu_sensor", O_RDWR);
	if(fd < 0)
	{
   
		perror("open");
		exit(1);
	}

	while(1)
	{
   
		ioctl(fd, IOC_GET_ACCEL, &data);
		printf("accel data :  x = %d, y=%d, z=%d\n", data.accel.x, data.accel.y, data.accel.z);

	
		ioctl(fd, IOC_GET_GYRO, &data);
		printf("gyro data :  x = %d, y=%d, z=%d\n", data.gyro.x, data.gyro.y, data.gyro.z)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值