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

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

五、实物图

相关推荐
A小辣椒2 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao3 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush44 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5204 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩4 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言