姿态传感器数据采集
姿态传感器可以说是整个无人机飞控系统的核心部件,我们在使用姿态传感器的时候mpu6050时通过I2C对模块的相对寄存器进行初始化和读取,根据精度设置对读取出来的各个轴电压值进行单位转换便可以得到各个轴的角速度和加速度。
I2C通讯总线
Mpu6050是一种运动传感器,他集成了加速度计和陀螺仪,MCU通过I2C协议和模块通信进行数据采集,I2C协议是一种双线、半双工的串行通信总线。
I2C有两根信号线:数据线SDA和时钟线SCL,根据SDA和SCL的状态组合进行信号的实现。包括起始、停止、发送数据、接收数据信号、等待应答、发送应答等信号。这些信号根据通信协议时序进行组合实现了I2C主从设备的通信。开始信号是时钟线SCL为高电平状态时数据线SDA由高变低,结束信号则是时钟线SCL为高电平状态时数据线由低变高。应答信号为主从机在正确接收一字节数据后下一个周期时钟线SCL为低时要将数据线SDA拉低表示信息收到的确认,等待应答便是等待数据线的拉低,等待一段时间没有应答便视作非应答,非应答便是一个周期内数据线SDA保持高电平状态。数据的接收和发送则是分为三部分:关于是读还是写的命令、目标寄存器地址、数据数据大小则是每个周期信号线SCL为低电平时SDA的高低电平状态反应出的二进制8bit数据。
I2C是一主多从的总线,想要确定写入对象就必须根据设备的地址,I2C从机地址为7bit,一般最后一位可以根据引脚状态进行控制为1或者0,那么就表示每一个从机可以选择两个地址,这就意味着同样的模块在同一个端口可以挂载两个。
I2C应用操作的核心便是通信时序,MCU作为主机操作和作为从机的传感器模块进行通讯:写操作为发送起始位、发送7bit设备地址加1bit的写操作位0、发送寄存器地址、发送写入数据,每次都要等待应答,发送停止位。发送寄存器和数据的操作可以进行多次,依次向传感器写入数据。
而主机读数据的流程则是主机发送7bit设备地址加1bit的写操作位0(后等待应答)、发送寄存器地址(后等待应答)、发送起始位、发送7bit设备地址加1bit的读操作位1(后等待应答)、读取数据、未完毕发送应答,完毕非应答,发送停止信号。由于公认STM32的硬件I2C有一些问题,所以I2C的信号、基本时序函数和读写操作都由软件IO口的模拟完成。
MPU6050配置及数据读取
操作MPU6050我们必须先了解它的设备地址和各个寄存器地址的作用。设备地址WHO I AM为7bit的0X68或者0X69(由引脚可改变地址),但是在实际操作中是左移一位0XD0并加上读写位。作为8bit数据的写入。MPU6050采用16位的ADC进行陀螺仪和加速度计的模数转换。
MPU6050的初始化主要包括启动时钟PWR_MGMT_1(解除休眠),SMPLRT_DIV设置陀螺仪采样率,CONFIG设置低通滤波频率、FS_SEL陀螺仪自检和测量范围、AFS_SEL加速度计自检和测量范围位FS_SEL和AFS_SEL 。传感器的数据是16位ADC值,而寄存器地址只有8位,所以有高位寄存器和低位寄存器,从两个寄存器中读取两个8位字节后使用高位强制转化16位后右移8位并和低8位数据与运算,合成16位完整数据。
此数据为ADC值,要将其转化为物理量必须根据之前设置的测量范围FS_SEL和AFS_SEL进行单位转换,陀螺仪单位为度/秒,0对应±250度/秒,1对应±500度/秒,2对应±1000度/秒,3对应±2000度/秒。我选择FS_SEL=3,则意味着读出的16进制数字(有符号)的最大值32767对应着的物理元素为2000度/秒,所以灵敏度是32767/2000=16.40,也就是一度反应出的数字是16.4,读出的数字除以灵敏度便是度/秒为单位的角速度数值。同理加速度计AFS_SEL的0,1,2,3对应着±2,±4,±8,±16,我使用±2G,32767/2=16384,便是灵敏度,数据/16384得出加速度数值,单位为重力加速度g,即9.8m/s²(赤道位置,不同位置重力加速度不同),所以此值要乘以当地的重力加速度就可以表示加速度了。
校准则是水平校准和加速度计校准,水平校准是默认校准时的状态是水平,即roll pitch值为0,将校准时的角度进行记录赋值给offset,然后存入FLASH,后面确定的姿态值是读取的角度数据都减掉offset后的值。加速度校准可简单地将六个面的最大值和最小值取出标定,或者使用椭圆模型法标定。