stm32f103ADC软件滤波
在STM32F103中使用ADC进行数据采集时,软件滤波是提高数据稳定性的常用方法。以下是几种常见的软件滤波方案及实现方法:
1. 均值滤波
- 原理:多次采样取平均值,抑制随机噪声。
-
实现:
#define SAMPLE_TIMES 10 // 采样次数 uint16_t ADC_GetAverageValue(ADC_HandleTypeDef *hadc) { uint32_t sum = 0; for (int i = 0; i < SAMPLE_TIMES; i++) { HAL_ADC_Start(hadc); HAL_ADC_PollForConversion(hadc, 10); sum += HAL_ADC_GetValue(hadc); } return (uint16_t)(sum / SAMPLE_TIMES); } - 注意:采样次数不宜过多,否则影响实时性。
2. 滑动平均滤波
- 原理:维护一个固定长度的队列,每次新采样值替换旧值,计算当前队列平均值。
-
实现:
#define WINDOW_SIZE 8 // 窗口大小 uint16_t buffer[WINDOW_SIZE]; uint8_t index = 0; uint32_t sum = 0; uint16_t ADC_GetMovingAverage(ADC_HandleTypeDef *hadc) { // 移除旧值 sum -= buffer[index]; // 获取新值 HAL_ADC_Start(hadc); HAL_ADC_PollForConversion(hadc, 10); buffer[index] = HAL_ADC_GetValue(hadc); // 更新总和和索引 sum += buffer[index]; index = (index + 1) % WINDOW_SIZE; return (uint16_t)(sum / WINDOW_SIZE); } - 优势:内存占用低,实时性好。
3. 中值滤波
- 原理:对一组采样值排序后取中间值,有效去除脉冲干扰。
-
实现:
#define MEDIAN_SAMPLES 5 // 奇数个样本 uint16_t ADC_GetMedianValue(ADC_HandleTypeDef *hadc) { uint16_t samples[MEDIAN_SAMPLES]; // 采集数据 for (int i = 0; i < MEDIAN_SAMPLES; i++) { HAL_ADC_Start(hadc); HAL_ADC_PollForConversion(hadc, 10); samples[i] = HAL_ADC_GetValue(hadc); } // 排序(冒泡排序) for (int i = 0; i < MEDIAN_SAMPLES - 1; i++) { for (int j = 0; j < MEDIAN_SAMPLES - i - 1; j++) { if (samples[j] > samples[j + 1]) { uint16_t temp = samples[j]; samples[j] = samples[j + 1]; samples[j + 1] = temp; } } } // 返回中间值 return samples[MEDIAN_SAMPLES / 2]; } - 适用场景:存在突发性干扰时。
4. 卡尔曼滤波
- 原理:基于系统模型的动态滤波算法,适合实时性要求高的场景。
-
简化实现:
float Q = 0.001; // 过程噪声 float R = 0.01; // 测量噪声 float x = 0.0; // 估计值 float P = 1.0; // 估计误差协方差 float KalmanFilter(float measurement) { // 预测 x = x; P = P + Q; // 更新 float K = P / (P + R); x = x + K * (measurement - x); P = (1 - K) * P; return x; } // 调用示例 float adc_value = (float)HAL_ADC_GetValue(hadc); float filtered_value = KalmanFilter(adc_value); - 优势:动态适应性强,但需调参(Q和R)。
5. 低通滤波
- 原理:抑制高频噪声,保留低频信号。
-
实现:
#define ALPHA 0.2 // 滤波系数(0~1,值越小滤波越强) float filtered_value = 0.0; float LowPassFilter(float raw_value) { filtered_value = ALPHA * raw_value + (1 - ALPHA) * filtered_value; return filtered_value; }
硬件优化建议
- 增加采样时间:通过配置ADC的
SMPx寄存器延长采样时间,可减少高频噪声。 - 稳定电源:为模拟部分使用独立LDO供电,并添加滤波电容(如100nF)。
- 合理布线:避免ADC信号线与高频信号线平行走线。
根据实际需求选择滤波方法:简单场景用均值滤波或滑动平均,抗突发干扰用中值滤波,高动态性能场景用卡尔曼滤波。
STM32F103VET6
1970-01-01 08:00:00 至 1970-01-01 08:00:00
STM32F103RCT6
1970-01-01 08:00:00 至 1970-01-01 08:00:00
GD32F103与STM32F103的区别 2021.6.2
GD32F103和STM32F103区别介绍关键词Key words:GD32F103、
资料下载
李杰
2021-12-08 11:06:03
STM32F103RC DMA ADC 温度,电压采样
STM32F103RC DMA ADC 温度,电压采样#include "stm32f10x.h"#include &quo
资料下载
刘满贵
2021-11-23 17:51:19
基于ARM的32位MCU芯片STM32F103x4/103x6
基于ARM的32位MCU芯片STM32F103x4/103x6
资料下载
jf_42320578
2021-05-21 15:32:12
STM32F103RCT6 一款STM32位微控制器MCU(ST意法)
1970-01-01 08:00:00 至 1970-01-01 08:00:00
学习STM32F103的ADC功能
三勺最近在学习STM32F103的ADC功能,居然连最简单的独立模式的单通道的电压采集都不能实现,这就不能忍了,这是对智商的侮辱。
2023-10-24 16:06:03
采用STM32F103硬件ADC功能进行光照强度采集
光照强度采集ADC方式采集,STM32F103本身自带有硬件ADC功能。将采集到的数据实时刷新到屏幕上即可完成波形显示。
2022-05-31 11:32:52
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- amoled屏幕和oled区别
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览