【全志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
说明当前设备支持哪些数据通道。
五、实物图
