1. STM32F103C8T6 ADC采集基础配置
在开始讨论滤波算法之前,我们需要先建立ADC采集的基础环境。STM32F103C8T6作为经典的Cortex-M3内核微控制器,内置了12位精度的ADC模块,最高采样率可达1MHz。
1.1 硬件连接与初始化
对于ADC采集,首先需要正确配置硬件引脚。以PA1作为ADC输入通道为例,CubeMX中的配置步骤如下:
- 在Pinout视图中将PA1配置为ADC1_IN1
- 在Configuration选项卡中配置ADC参数:
- Resolution: 12位
- Scan Conversion Mode: Disabled(单通道时)
- Continuous Conversion Mode: Enabled(连续采样)
- DMA Continuous Requests: Enabled(如果使用DMA)
- End of Conversion Selection: EOC flag at the end of single conversion
对应的HAL库初始化代码如下:
c复制ADC_HandleTypeDef hadc1;
void ADC_Init(void) {
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK) {
Error_Handler();
}
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
Error_Handler();
}
}
1.2 采样时间的选择
采样时间的选择直接影响ADC的精度和抗干扰能力。STM32F103C8T6的ADC采样时间可配置为1.5~239.5个ADC时钟周期。对于不同的信号源阻抗,建议的采样时间如下:
| 信号源阻抗 | 推荐采样时间 | 适用场景 |
|---|---|---|
| <1kΩ | 1.5周期 | 低阻抗信号源 |
| 1kΩ~10kΩ | 7.5~28.5周期 | 普通传感器 |
| >10kΩ | 41.5~239.5周期 | 高阻抗电路 |
实际项目中,我通常先用28.5周期作为起点,然后根据信号质量调整。过长的采样时间会限制最大采样率,需要在速度和精度间权衡。
1.3 参考电压配置
STM32F103C8T6的ADC参考电压默认使用VDDA(通常3.3V)。对于精度要求高的应用,建议:
- 确保VDDA和VSSA引脚有适当的去耦电容(0.1μF+1μF组合)
- 避免在VDDA上连接大电流负载
- 必要时可使用外部精密基准源
2. 常见ADC噪声来源与滤波需求
在实际工程中,ADC采集到的原始数据往往包含各种噪声,理解这些噪声的来源是选择合适滤波算法的基础。
2.1 主要噪声类型
- 高频噪声:通常来自开关电源、数字电路等,表现为采样值快速随机波动
- 低频干扰:如50Hz工频干扰,表现为周期性缓慢变化
- 脉冲干扰:突发性的尖峰干扰,可能由静电放电、继电器动作等引起
- 量化误差:ADC固有的离散化误差,12位ADC的理论最小分辨率为Vref/4096
2.2 噪声影响评估方法
评估ADC噪声水平的实用方法:
c复制#define SAMPLE_COUNT 100
uint32_t calculate_noise_level(void) {
uint16_t samples[SAMPLE_COUNT];
uint32_t sum = 0;
u
