4、ADC1配置:利用ADC1的通道IN1进行AD采样,保持独立模式;

5、时钟树配置:

6、工程配置:

四、滤波算法与效果
受限于MCU自身的ADC外设缺陷,其精度和稳定性通常较差,很多场景下需要采取滤波补偿。
滤波的作用就是减少噪声与干扰对数据测量的影响。
4.1 未添加滤波算法
重写printf函数:
#include "stdio.h"
//重定义
int fputc(int c,FILE *stream)
{
uint8_t ch[1]={c};
HAL_UART_Transmit(&huart1,ch,1,0xFFFF);
return c;
}
main函数:
while(1){
HAL_ADC_Start(&hadc1); //开启ADC1,放置在while循环中
ADC_value=HAL_ADC_GetValue(&hadc1); //获取ADC1的数值
HAL_Delay(10); //延迟函数,防止采样失效
printf("ADC_value:%d\n", ADC_value);
}
VOFA+读取到的数据:

上图借助VOFA+上位机可以清楚看出未使用滤波的ADC采样波动还是比较明显的,但是作者主观干啥F1系列的ADC确实好像比F4系列的ADC稳定些。(之所以不是4096可能是因为电源未达到3.3v)
4.2 一阶互补滤波
方法:取a=0~1,本次滤波结果=(1-a)本次采样值+a上次滤波结果
优点:对周期性干扰具有良好的抑制作用适用于波动频率较高的场合
缺点:相位滞后,灵敏度低滞后程度取决于a值大小不能消除滤波频率高于采样频率的1/2的干扰信号
//一阶互补滤波
int firstOrderFilter(int newValue, int oldValue, float a)
{
return a * newValue + (1-a) * oldValue;
}
ADC_value=HAL_ADC_GetValue(&hadc1); //获取ADC1的数值
//主函数
while(1){
HAL_ADC_Start(&hadc1); //开启ADC1,放置在while循环中
Filtering_Value = firstOrderFilter(HAL_ADC_GetValue(&hadc1),ADC_value,0.3); //滤波算法
HAL_Delay(10); //延迟函数,防止
本文详细介绍了在STM32嵌入式开发中,如何配置ADC、时钟树以及各种滤波算法如一阶互补、中位值、算术平均、滑动平均、限幅平均和卡尔曼滤波的应用。通过比较不同滤波器的效果,强调了根据实际工程需求选择合适滤波器的重要性。
最低0.47元/天 解锁文章
_数据采集滤波算法stm32&spm=1001.2101.3001.5002&articleId=137427865&d=1&t=3&u=2da753b484984297baf061234904a475)
1655

被折叠的 条评论
为什么被折叠?



