【全志V821_FoxPi】9-2 Linux IIC驱动MPU6050
- 一、背景
 - 二、MPU6050介绍
 - 
- [2-1 模块实物图](#2-1 模块实物图)
 - [2-2 基本介绍](#2-2 基本介绍)
 - [2-3 加速度计性能参数](#2-3 加速度计性能参数)
 - [2-4 陀螺仪性能参数](#2-4 陀螺仪性能参数)
 - [2-5 其他参数](#2-5 其他参数)
 - [2-6 工作原理](#2-6 工作原理)
 - 
- [2-6-1 加速度计工作原理](#2-6-1 加速度计工作原理)
 - [2-6-2 陀螺仪工作原理](#2-6-2 陀螺仪工作原理)
 
 - [2-7 常见电路](#2-7 常见电路)
 
 - 三、驱动适配
 - 
- [3-1 查看内核配置文档](#3-1 查看内核配置文档)
 - [3-2 内核配置](#3-2 内核配置)
 
 - 四、测试
 - 
- [4-1 系统启动](#4-1 系统启动)
 - [4-2 读取数据](#4-2 读取数据)
 
 - 五、实物图
 
一、背景
我们继续来折腾一下常见的传感器:MPU6050
二、MPU6050介绍
2-1 模块实物图

2-2 基本介绍
MPU6050 是一款六轴运动处理传感器,由 InvenSense 公司生产。它集成了三轴陀螺仪和三轴加速度计,并通过 I2C 接口与外部通信。该传感器广泛应用于无人机、智能手机、机器人等需要姿态检测的设备中。
MPU6050 的性能参数
2-3 加速度计性能参数
测量范围:±2g、±4g、±8g、±16g(可编程选择)
灵敏度:16,384 LSB/g(±2g 范围)
非线性度:±0.5% FS(全量程)
噪声密度:400 μg/√Hz
2-4 陀螺仪性能参数
测量范围:±250°/s、±500°/s、±1000°/s、±2000°/s(可编程选择)
灵敏度:131 LSB/(°/s)(±250°/s 范围)
非线性度:±0.2% FS
噪声密度:0.005°/s/√Hz
2-5 其他参数
工作电压:2.375V ~ 3.46V
通信接口:I2C(标准模式 100kHz,快速模式 400kHz)
内置数字运动处理器(DMP),可直接输出四元数姿态数据
2-6 工作原理
2-6-1 加速度计工作原理
基于电容式 MEMS 结构,当加速度作用在质量块上时,电容值变化,通过测量电容变化量计算加速度。
2-6-2 陀螺仪工作原理
基于科里奥利效应,振动质量块在旋转时产生位移,通过检测位移量计算角速度。
2-7 常见电路

三、驱动适配
该芯片是在Linux内核中支持的了,所以比较简单了
3-1 查看内核配置文档
kernel/linux-5.4-ansc/Documentation/devicetree/bindings/iio/imu/inv_mpu6050.txt
            
            
              c
              
              
            
          
          InvenSense MPU-6050 Six-Axis (Gyro + Accelerometer) MEMS MotionTracking Device
http://www.invensense.com/mems/gyro/mpu6050.html
Required properties:
 - compatible : should be one of
                "invensense,mpu6050"
                "invensense,mpu6500"
                "invensense,mpu6515"
                "invensense,mpu9150"
                "invensense,mpu9250"
                "invensense,mpu9255"
                "invensense,icm20608"
                "invensense,icm20602"
 - reg : the I2C address of the sensor
 - interrupts: interrupt mapping for IRQ. It should be configured with flags
   IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_EDGE_RISING, IRQ_TYPE_LEVEL_LOW or
   IRQ_TYPE_EDGE_FALLING.
  Refer to interrupt-controller/interrupts.txt for generic interrupt client node
  bindings.
Optional properties:
 - vddio-supply: regulator phandle for VDDIO supply
 - mount-matrix: an optional 3x3 mounting rotation matrix
 - i2c-gate node.  These devices also support an auxiliary i2c bus.  This is
   simple enough to be described using the i2c-gate binding. See
   i2c/i2c-gate.txt for more details.
Example:
        mpu6050@68 {
                compatible = "invensense,mpu6050";
                reg = <0x68>;
                interrupt-parent = <&gpio1>;
                interrupts = <18 IRQ_TYPE_EDGE_RISING>;
                mount-matrix = "-0.984807753012208",  /* x0 */
                               "0",                   /* y0 */
                               "-0.173648177666930",  /* z0 */
                               "0",                   /* x1 */
                               "-1",                  /* y1 */
                               "0",                   /* z1 */
                               "-0.173648177666930",  /* x2 */
                               "0",                   /* y2 */
                               "0.984807753012208";   /* z2 */
        };
        mpu9250@68 {
                compatible = "invensense,mpu9250";
                reg = <0x68>;
                interrupt-parent = <&gpio3>;
                interrupts = <21 IRQ_TYPE_LEVEL_HIGH>;
                i2c-gate {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ax8975@c {
                                compatible = "ak,ak8975";
                                reg = <0x0c>;
                        };
                };
        };
        以下是我的设备树配置,使用的是PD9和PD10,TWI2,中断使用PL1,IIC速率400k
            
            
              c
              
              
            
          
          &twi2 {
	clock-frequency = <400000>;
	pinctrl-0 = <&twi2_pins_default_ts>;
	pinctrl-1 = <&twi2_pins_sleep_ts>;
	pinctrl-names = "default", "sleep";
	/* For stability and backwards compatibility, we recommend setting 'twi_drv_used' to 1 */
	twi_drv_used = <1>;
	status = "okay";
	mpu6050@68 {
		compatible = "invensense,mpu6050";
		reg = <0x68>;
		interrupt-parent = <&pio>;
		interrupts = <PL 1 IRQ_TYPE_EDGE_RISING>;
		mount-matrix = "-0.984807753012208",  /* x0 */
						"0",                   /* y0 */
						"-0.173648177666930",  /* z0 */
						"0",                   /* x1 */
						"-1",                  /* y1 */
						"0",                   /* z1 */
						"-0.173648177666930",  /* x2 */
						"0",                   /* y2 */
						"0.984807753012208";   /* z2 */
	};
}
        3-2 内核配置
搜索 MPU6050


然后编译烧录即可
四、测试
4-1 系统启动
在/dev/下,我们可以看到有i2c节点以及一个 iio设备 iio:device0,这里就好是成功注册了

4-2 读取数据
            
            
              c
              
              
            
          
          cd /sys/bus/iio/devices/iio\:device0/
        
            
            
              c
              
              
            
          
          root@TinaLinux:/sys/devices/platform/soc@2002000/42502800.twi2/i2c-2/2-0068/iio:device0# ls
buffer                        in_anglvel_y_calibbias
current_timestamp_clock       in_anglvel_y_raw
dev                           in_anglvel_z_calibbias
in_accel_matrix               in_anglvel_z_raw
in_accel_mount_matrix         in_gyro_matrix
in_accel_scale                in_temp_offset
in_accel_scale_available      in_temp_raw
in_accel_x_calibbias          in_temp_scale
in_accel_x_raw                name
in_accel_y_calibbias          of_node
in_accel_y_raw                power
in_accel_z_calibbias          sampling_frequency
in_accel_z_raw                sampling_frequency_available
in_anglvel_mount_matrix       scan_elements
in_anglvel_scale              subsystem
in_anglvel_scale_available    trigger
in_anglvel_x_calibbias        uevent
in_anglvel_x_raw
        这里有大量可导出的数据,其中:
in_accel_x_raw, in_accel_y_raw, in_accel_z_raw
MPU6050的加速度计在X、Y、Z轴上的原始数据(未经处理的原始传感器读数)。
in_anglvel_x_raw, in_anglvel_y_raw, in_anglvel_z_raw
陀螺仪(角速度传感器)在X、Y、Z轴上的原始数据。
in_temp_raw
温度传感器的原始数据。
in_accel_x_calibbias, in_accel_y_calibbias, in_accel_z_calibbias
加速度计的校准偏置值。
in_anglvel_x_calibbias, in_anglvel_y_calibbias, in_anglvel_z_calibbias
陀螺仪的校准偏置值。
in_accel_scale, in_anglvel_scale, in_temp_scale
缩放因子,用于将原始数据转换成物理单位(如g,°/s,摄氏度等)。
sampling_frequency, sampling_frequency_available
当前采样频率和支持的采样频率列表。
buffer
用于开启缓冲区采样,支持批量读取数据。
trigger
触发器相关文件,用于同步采样。
name
设备名称。
scan_elements
说明当前设备支持哪些数据通道。
五、实物图
