后天要去公司实习了,带着些许担忧,终于从学校走出去了,不知江湖的水有多深,一切都是待定!
把程序移植之后,发现我还没真正研究过MPU6050这个传感器,结合程序我大概了解了下,先看下图
上图是与加速度传感器有关的寄存器参数,采集到的三轴方向上的值都是16位的,选用的满量程范围是正负8g,4096/g的意思就是说当某一方向上的重力加速度为1g时,该寄存器的值就是4096。采集到的陀螺仪的值也是类似的,如图所示:
当某一方向的每秒钟转1度的时候,采集到的值就是16.4。比之前的有些传感器使用电压值然后再计算角度容易多了,数字传感器就是直接。
在程序中,关于传感器的数值用了一个结构体定义:
typedef struct
{
// 参数信息,pos=0。
uint8_t version; // 参数结构的版本。
uint8_t length; // 参数总长度,单位:字,即字节数/4。
uint16_t reserve_zero_0;
//
// 传感器校正参数,pos=[1,18]。
float acc_offset[3];
float acc_gain[3];
float gyr_offset[3];
float gyr_gain[3];
float mag_offset[3];
float mag_gain[3];
//
// 四元数表示的水平面,pos=[19,22]。
quaternion horizon;
//
// 控制参数,[xyz][pid],pos=[23,31]。
struct
{
float p,i,d; // 顺序严格按P、I、D。
}xyz_pid[3];
//
uint32_t crc;
} param_t;
其中,float acc_offset[3];float acc_gain[3];float gyr_offset[3];float gyr_gain[3];是本次需要关心的,再从初始化函数
得到些端倪,分为增益和偏移量,初始偏移量都是零,没问题,加速度最终量化成个g/LSB,陀螺仪量化成rad/s(弧度每秒):
param->acc_gain[i] = 9.7883 / 4096.0;//加速度传感器8g,灵敏度是4096LSB/g
param->acc_offset[i] = 0;
param->gyr_gain[i] = (3.1415926/180.0) / 16.4;//陀螺仪满刻度范围2000°/s,灵敏度是16.4LSB/°/s
param->gyr_offset[i] = 0;
前期的参数都已经确定了,当采集到实时传感器的数据后,通过以下公式将数据量化
acc[i] = (p->acc_offset[i] + mpu6050_rawData.acc[i]) * p->acc_gain[i];-----加速度
gyr[i] = (p->gyr_offset[i] + mpu6050_rawData.gyr[i]) * p->gyr_gain[i];----陀螺仪
然后在对量化后的acc和gyr的值做平均,最终叉积法融合陀螺和加速度。