【全志V821_FoxPi】9-2 Linux IIC驱动MPU6050

【全志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

说明当前设备支持哪些数据通道。

五、实物图

相关推荐
mjx65303 小时前
PyTorch快速入门
linux
DeeplyMind5 小时前
AMD KFD的BO设计分析系列6-1: VRAM BO的显存分配分析
linux·驱动开发·amdgpu·rocm·kfd
我言秋日胜春朝★5 小时前
【Linux网络编程】多路转接reactor——ET模式的epoll
linux·服务器·网络
Hell_Yrz6 小时前
Golang信号处理实战
linux
四桑.6 小时前
uniapp运行微信小程序uni为什么是undefined
linux
用户31187945592186 小时前
perl-Test-Simple-1.302195-5.fc39.noarch.rpm 怎么安装?Fedora 39 安装步骤讲解
linux
焦思懿--19期--工职大6 小时前
VMWare和物理机之间文件传输
linux·服务器·网络·电脑
四桑.6 小时前
echarts6.0.0版本,平行坐标图形,series为多组时,横线溢出绘图区域,如何解决
linux
qq_323429717 小时前
银河麒麟V10高级服务器版Bash快捷键经常失效
linux