四轴飞行器// Copyright (c) 2013
js200300953@qq.com All rights reserved.
// ==================================================
// ========圆点博士微型四轴飞行器配套软件声明========
// ==================================================
// 圆点博士微型四轴飞行器配套软件包括上位机程序、下位机Bootloader
// 、下位机App和遥控程序,及它们的源代码,以下总称“软件”。
// 软件仅提供参考,js200300953不对软件作任何担保,不对因使用该软件
// 而出现的损失负责。
// 软件可以以学习为目的修改和使用,但不允许以商业的目的使用该软件。
// 修改该软件时,必须保留原版权声明。
//
// 更多资料见:
//
http://blog.sina.com.cn/js200300953//
http://www.etootle.com///
http://www.eeboard.com/bbs/forum-98-1.html#separatorline// 圆点博士微型四轴飞行器QQ群:276721324
// app/attitude/accfilter.c
// 2013-1-8 15:51:54
// js200300953
//波: 此为加速度计 滤波 初始化 全部设置为0 然后 再读取
#include "accfilter.h"
#define ACCFILTER_AVG_NUM 16 //波:设置 滤波次数 样本数吧
static float accfilter_history[ACCFILTER_AVG_NUM][3]; //波:static 静态变量 不随函数的结束而结束 数值为上一次调用后修改的值
static float accfilter_current[3]; //波:此为静态变量 不释放
static uint8_t accfilter_index; //波: index指数 索引 指针
void accfilter_init(void); //波:加速度滤波 初始化
void accfilter_input(const float val[3]); //波:加速度 输入 记住 输入量为const 只读 不能修改
const float * accfilter_getCurrent(void); //波:const 只读模式 不能更改 只能在初始化处更改
//波:定义一个 指针 只读 量 也就是 对一个地址 取数据吧
void accfilter_init(void)
{
for(int i=0;i
{
for(int j=0;j<3;j++)
accfilter_history[i][j] = 0; //波:将历史数据 初始化 为全零
}
for(int i=0;i<3;i++)
accfilter_current[i] = 0; //波:当前数据 初始化 为全零
accfilter_index = 0; //波:指标数据 也为零
}
//波:加速度 滤波 过滤 valid 有效值
//波:输入为val[] 改变加速度计的值 三轴 故三次赋值 每次更新只占当前加计值的 1/16 其值赋给一个全局变量
//波:本来就是一个累加过程 然后 取平均
void accfilter_input(const float val[3])
{
for(int i=0;i<3;i++)
accfilter_history[accfilter_index][i] = val[i]; //波: 初始为val的三个值 读取一组 数组类型为 16*3 16为取样16次 3为 每次3个内容即变量或者数值
accfilter_index ++; //波:取样样本 变量加加
if(accfilter_index >= ACCFILTER_AVG_NUM) //波:此为 滤波处理的 样本值
accfilter_index = 0;
//
float sum[3] = {0,0,0}; //波:累加值 初始化为0
for(int i=0;i
{ //波:过程为 当前值 与几次历史值相加 累加取样次数 然后 再求取平均
sum[0] += accfilter_history[i][0]; //波:历史值 其实 就是 val输入的值
sum[1] += accfilter_history[i][1];
sum[2] += accfilter_history[i][2];
}
//
for(int i=0;i<3;i++)
accfilter_current[i] = sum[i] * (1.0f/ACCFILTER_AVG_NUM); //波:返回为浮点型 因为_index也为静态变量 函数结束 不释放
//波:故可以 多次调用此函数 满16次 清为零
//波:而val的输入值 我估计来自 mpu6050
//波:这个平均滤波 只跟最近的16次采样有关 初始化时 全为零
//
}
//波:为什么 非要用指针呢 不是随便一个函数 都行吗 意思不就是要返回一个当前 加计滤波值
//波:其实 在accfilter_input中直接返回 但是 这个函数 简单化 只处理返回当前加计值
const float * accfilter_getCurrent(void)
{
return accfilter_current; //波:返回值 为accfilter_current[0] 我认为是这样的 但是应该是
//波:三个值 因为对应着 三个轴的加速度
}
//波:说白了 此文件下函数 accfilter.c就是 将mpu6050 读取的数值 16*3(因为 读取的是三个姿态的哦!亲)个数相加 然后取平均
//波:没别的意思 之前卡住 完全是 没理解 const static 的内涵
//波:现在 还有疑问 为什么用指针 获取 当前姿态 (滤波后的) 普通函数不也行吗 还是 说 已经把此姿态放到一个 地址中以后读取该地址即可的
//波:当前滤波后的姿态