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); //延迟函数,防止