​​​​​​目的

练习对加速度传感器的原始数据进行滤波算法的实验,学习使用平滑滤波、FIR、IIR等的滤波算法。

原理

滤波器:选择所需的某一或某些频带的信号而抑制不需要的其它频带的信号。

通带:滤波器中能使信号通过的频带,通带边缘所对应的频率称为通带截止频率。

阻带:抑制噪声通过的频带。

过渡带:从通带到阻带的过渡频率范围。

滤波器分类

输入输出信号:模拟和数字滤波器;

DF按照单位取样响应或实现网络结构又分为:IIR DF和FIR DF,又称递归型和非递归型;

低通滤波器:只允许低频信号通过而抑制高频信号。例如,可用低通滤波器消除旧音乐录音带中的背景噪声。

高通滤波器:只允许高频信号通过而抑制低频信号。例如,声纳系统可用高通滤波器消除信号中的船和海浪的低频噪声,保留目标特征。

带通滤波器:允许某一频带的信号通过。例如,数字电话双音多频(DTMF)信号的解码,每个电话键产生一对音频信号,其中一个信号对按键的行编码,另一个对列编码,接收端通过一组带通滤波器来识别每个按键。

带阻滤波器:抑制某一频带的信号。例如,从复合电视信号中滤除频分复用的色度信号,以便得到亮度信号。

本实验对加速度传感器的原始数据进行平滑滤波,旨在学会使用平滑滤波。如图1.1为本次实验滑动滤波流程,对当前20组数据求和取平均值作为当前传感器测得的数据,程序实现见代码。

步骤

  • 以上一个MPU6050传感器驱动实验为基础,打开MPU6050传感器驱动工程。
  • 在bsp_mpu6050.c文件中添加MPU6050_newValue()滑动滤波函数,通过调用此函数进行传感器数据滑动滤波处理。
float AVG_Filter[ITEMS] [(FILTER_NUM + 1)];
//平滑滤波
void MPU6050_SMO_Filter()
{uint8_t i;float FILT_TMP[ITEMS] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f};static uint8_t flt_idx = 0;if( ++flt_idx > FILTER_NUM )  {flt_idx = 0;}//更新滑动滤波窗口数据AVG_Filter[A_X][flt_idx] =  (mpu6050.acc_raw.x - mpu6050.acc_offset.x);//填值AVG_Filter[A_Y][flt_idx] =  (mpu6050.acc_raw.y - mpu6050.acc_offset.y);AVG_Filter[A_Z][flt_idx] =  (mpu6050.acc_raw.z - mpu6050.acc_offset.z);AVG_Filter[G_X][flt_idx] =  (mpu6050.gyro_raw.x - mpu6050.gyro_offset.x);AVG_Filter[G_Y][flt_idx] =  (mpu6050.gyro_raw.y - mpu6050.gyro_offset.y);AVG_Filter[G_Z][flt_idx] =  (mpu6050.gyro_raw.z - mpu6050.gyro_offset.z);for(i=0;i<FILTER_NUM;i++){FILT_TMP[A_X] += AVG_Filter[A_X][i];//累加FILT_TMP[A_Y] += AVG_Filter[A_Y][i];FILT_TMP[A_Z] += AVG_Filter[A_Z][i];FILT_TMP[G_X] += AVG_Filter[G_X][i];FILT_TMP[G_Y] += AVG_Filter[G_Y][i];FILT_TMP[G_Z] += AVG_Filter[G_Z][i];}mpu6050.acc.x = (float)( FILT_TMP[A_X] )/(float)FILTER_NUM ;//求均值mpu6050.acc.y = (float)( FILT_TMP[A_Y] )/(float)FILTER_NUM ;mpu6050.acc.z = (float)( FILT_TMP[A_Z] )/(float)FILTER_NUM ;mpu6050.gyro.x = ((float)( FILT_TMP[G_X] )/(float)FILTER_NUM )*GYRO_SCALE;mpu6050.gyro.y = ((float)( FILT_TMP[G_Y] )/(float)FILTER_NUM )*GYRO_SCALE;mpu6050.gyro.z = ((float)( FILT_TMP[G_Z] )/(float)FILTER_NUM )*GYRO_SCALE;
}
  • 在bsp_mpu6050.c文件中,修改mems_data()函数,加入滑动滤波函数。具体修改后如下所示:
//采集原始值,并进行滤波
void mems_data(void)
{MPU6050_Read(mpu6050_buffer);  //读取mpu6轴传感器/*解析原始数据,并且进行坐标转换*/mpu6050.acc_raw.x =(int16_t)(mpu6050_buffer[0] << 8 | mpu6050_buffer[1]);mpu6050.acc_raw.y =(int16_t)(mpu6050_buffer[2] << 8 | mpu6050_buffer[3]);  mpu6050.acc_raw.z =    (int16_t)(mpu6050_buffer[4] << 8 | mpu6050_buffer[5]);    //陀螺仪读取mpu6050.gyro_raw.x  =(int16_t)(mpu6050_buffer[8] << 8 | mpu6050_buffer[9]);mpu6050.gyro_raw.y =(int16_t)(mpu6050_buffer[10] << 8 | mpu6050_buffer[11]);mpu6050.gyro_raw.z  =(int16_t)(mpu6050_buffer[12] << 8 | mpu6050_buffer[13]);//数据滤波MPU6050_SMO_Filter();
}

编译并下载,接下来将使用“STM-studio”进行数据的查看,安装并配置好环境。安装以后打开软件,找到“File”->“Import variables from executable”。STM-studio下载链接。

第二步,添加文件。

在我们工程目录下,“Project\MDK-ARM(uV5)\Flash\Obj”找到“output.axf”文件,并“Select executable file”添加。

第三步,将我们需要看的变量添加到软件中。

第四步,添加我们想要看到的线形图的变量,并运行。

现象

我们看到,灰色滤波后的线条,明显比蓝色初始值波动性小。

更多交流欢迎关注作者抖音号:81849645041​​​​​​

MPU6050传感器数据滤波相关推荐

  1. STM32CubeIDE自平衡小车教程7.MPU6050传感器数据读取

    MPU6050简介: MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件,内带3轴陀螺仪和3轴加速度传感器,并且含有一个第二IIC接口,可用于连接外部磁力传感器. 那如何通过 ...

  2. Arduino读取HC-SR04超声波测距传感器数据附带滤波

    目录 前言 程序 1.无滤波程序 2.低通滤波器滤波程序 3.低通滤波器滤波程序(弃掉高幅噪声) 4.中位值滤波 5.中位值平均滤波 总结 前言 传感器的接线非常简单,一共四根线 vcc和gnd按照要 ...

  3. 基于树莓派4b的传感器数据可视化实现

    概述 实验的第二部分将5个传感器同时搭建在面包板,每一个模块建立一个文件,并且为每一个模块创建一个类.另外创建一个利用QT Designer设计生成的一个界面类.在主文件中实例化5个传感器的类,并且创 ...

  4. 第44章 MPU6050传感器—姿态检测—零死角玩转STM32-F429系列

    第44章     MPU6050传感器-姿态检测 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  5. 基于uFUN开发板的心率计(一)DMA方式获取传感器数据

    前言 从3月8号收到板子,到今天算起来,uFUN到手也有两周的时间了,最近利用下班后的时间,做了个心率计,从单片机程序到上位机开发,到现在为止完成的差不多了,实现很简单,uFUN开发板外加一个Puls ...

  6. Pixhawk的传感器数据(陀螺、加计等)流程

    一.总体流程 先由驱动层drive,再到中间层sensor,再到应用层ekf2,最后发布数据给其他应用.控制系统最重要的是带宽,位置环的带宽,到速度环的带宽,再到传感器的更新率,所以,做控制,看程序的 ...

  7. 点云平面提取_基于LiDAR点云数据滤波方法

    基于LiDAR点云数据滤波方法 机载激光雷达所获取的数据被称为"点云(points cloud)"它在三维空间中呈现出随机分布的形状.在点云中,有些点属于真实的地形表面的点,有些点 ...

  8. 多速率多传感器数据融合估计(二)

    问题描述 首先单模型多速率同步动态模型已知. 对上述模型进行改写可以得到 由于是分布式滤波所以每个传感器独立进行滤波,其实上篇文章中的状态分块滤波个人认为也属于分布式滤波,只不过是滤波并不在最细尺度上 ...

  9. 多速率多传感器数据融合估计(一)

    多速率多传感器数据融合估计(一) 对于多速率多传感器数据融合问题此处给出三种方法: 1.状态分块线性模型的建立 2.分布式无反馈数据融合算法 3.分布式有反馈数据融合算法 分两章阐述. 问题描述 设同 ...

最新文章

  1. wait跟sleep的区别
  2. csv文件与字典,列表等之间的转换小结【Python】
  3. spring-data-jpa 二、多对一结构、Repository
  4. 【LeetCode笔记】11.盛最多水的容器(Java、双指针法)
  5. linux 游戏 黑白,黑白迭代官方版游戏-黑白迭代下载v0.5-Linux公社
  6. day18【前台】订单
  7. Matlab条形图bar误差棒绘制errorbar
  8. 搭建本地LNMP开发环境(6)-配置nginx和PHP
  9. php startup memcache,centos php 安装memcache模块
  10. jpegNPP编译为so
  11. python中formatter的用法_python中 logging的使用详解
  12. 华为手机怎么使用读卡器_华为G7手机OTG功能详细使用教程
  13. 程序员如何看待实力与运气
  14. log函数的表达-求一个数的位数
  15. Android基于opencv4.6.0实现人脸识别功能
  16. Android5.1-s5p6818平台adb push 、adb install/uninstall的疑问
  17. Python 数据相关性分析
  18. python创建excel新的表格_python创建Excel表格并添加工作表
  19. 《需求工程--软件建模与分析》笔记
  20. 修水管问题 计算几何 投影

热门文章

  1. 视频号助手:微信视频号怎么变现,视频号变现注意事项
  2. 微信小程序之简易网易云音乐
  3. 用H5实现四宫格切换九宫格,再切换十六宫格
  4. 别说996,就是9-12-6我都能干…
  5. 名悦集团:购买纯电动汽车有哪些方面需要考虑?
  6. 微信小程序-动态设置图片的高度
  7. SSDB可视化界面管理工具
  8. 德邦快递接口开发-java(问题简集)
  9. 如何让GPT写出高质量小红书文案 ?
  10. 两步U盘 win10 操作系统安装 特简单