四旋翼飞控项目日志
½者:WZY
前言
大四下学期完成主½程序,大四毕业暑假加入操½系统,希望大家共同学习,共同进步。
2013.8
时间
2013
年
2
月
2
日
11:57:37
项目进展了这么久第一次写日志,
总结一下这一段时间的经验。
首先,
我通过李想的
stm32
教学视频对
stm32
进行了简单的了解,发现
stm32
用起来比
51
½方便,原来一直被“arm
难学”误导了,单片机只是工具,真正编算法才是难点,所以以后在做项目时不应该过分考
虑单片机是否½用这个问题,只要适合项目的单片机就应该拿来用。
李想视频里编译环境是
MDK,所以在编程时一直½用 MDK
编译,感觉和学
51
时用的
keil
一模一样,比较½上手。由于项目所要做的第一步是要做姿态解算,所以在初步了解
stm32
原理以后,就开始从
MPU6050
传感器读数据。MPU6050 是一个集成了加速度计和陀螺仪的
传感器,½用
I2C
和单片机进行通信,总½来说读取数据还是比较简单的。½是也遇到一些
比较烦人的问题,卡了½久。一个是变量类型搞错了
这是一段读取
MPU6050
陀螺仪
x
½数据的程序,先通过
I2C
½数把陀螺仪
X
½数据的½
8
½和高
8
½读取出来,
分别放入
BUF[0]和 BUF[1]中,
在通过移½把两个数据合成一个数据传
入
G_X
变量,G_X 是一个
short
型变量,而
imu_measure.gx
是一个
double
型变量,编译器
编译是自动把
G_X
½成
double
型除以
16.4
赋值给
imu_measure.gx。
曾经犯过一个错误就是
把
BUF
数组数据相合后直接除以
16.4
然后赋值给
imu_measure.gx,结果通过串口传回来的
数据就出现了错误。以后要避免这种错误。
在新添加文件后要记着把文件添加进工程,否则编译会出错。
至于为什么除以
16.4,参考《MPU-6050
寄存器映射》第
32
页
在
MPU6050
初始化时把
Full Scale Range
设½为 ±2000°/s,
所以灵敏度为
16.4 LSB/°/s,
所以在读出寄存器值的基础上除以
16.4
就是角速度。
而对于加速度,设½为±8g,灵敏度为
4096,所以在读出值的基础上除以 4096
就是加速
度,单½为
g,再乘以 9.8
单½就是
m/s^2,所以 8192/9.8=835.066,除以这个值就是加速度
(m/s^2)
。同理,在理解
MPU6050
初始化的设½时,参考这本手册即可。
要设½为+-4g 即
0000100=0x08
还有一个就是
extern
变量的½用。正确的用法是在初始化的地方定义(½数外定义,如
果在½数内则会是局部变量)然后在
External_Variable.h
文件中用
extern
关键字再定义一遍
,
(注意,这里不要赋值)
,告诉编译器,这个变量在其他地方已经定义过,直接½用即可。
然后需要用到全局变量的文件开头进行#Include
“External_Variable.h”,就可以了。
MPU6050
传感器初始化时,½用
I2C
总线½数即可,例如:
Single_Write(MPU6050_Addr,PWR_MGMT_1, 0x00);
//解除休眠状态
分别写入
MPU6050
地址,寄存器地址,和写入的值即可。出现一个问题就是
MPU6050
的
I2C
地址在手册上写的是
7
½固定,
0x68 1101000)
½有的例程上给的是直接写入
0x68,
为
(
,
实际在½用过程中写入
0xD0(11010000)才有反应,即 7
为固定½加一½硬件设½的地址
½(BIT0=0)。
在
MPU6050
初始化后就可以不停的读取传感器值进行姿态解算了。在姿态解算前,我先
对四元数进行了初始化,
即飞控板在静止状态下通过加速度计解算欧拉角,
再通过四元数公
式计算(即½数
quat_init())。其实感觉这里不初始化也可以,因为姿态解算速度很快,第
一次的值对以后½响并不大。
随后就开始真正的姿态解算了,首先要对读取的传感器值进行移动均值滤波。定义了
Filter_ACC
结构½,先把读取值加到这个结构½变量里,每加一次,积分标记½加
1。½定
时器中断触发。姿态解算周期到来时,进入
if(IMUupdate_flag == TRUE){}里面求平均值并对
变量清零,完成移动均值滤波。
滤波过后,就开始用
IMUupdate()½数进行解算,这个½数是参考
评论