adc多通道滤波 hal库
时间: 2025-02-13 22:19:09 浏览: 26
使用STM32 HAL库实现ADC多通道滤波
配置环境与初始化设置
为了使用STM32 HAL库进行ADC多通道数据采集并应用滤波算法,首先需通过STM32CubeMX工具配置项目参数。具体而言,在STM32CubeMX中选择目标MCU型号(如STM32F103C8T6),开启ADC外设支持,并启用DMA功能用于高效传输采样数据[^1]。
编写ADC初始化函数
接下来定义一个自定义的ADC_Init()
函数来完成硬件资源分配以及必要的寄存器设定:
static void ADC_Init(void)
{
__HAL_RCC_ADC1_CLK_ENABLE(); // 启动ADC时钟
hadc1.Instance = ADC1;
/* 初始化ADC */
if (HAL_ADC_Init(&hadc1) != HAL_OK){
Error_Handler();
}
}
设置DMA模式下的连续转换序列
为了让多个通道能够被依次扫描到,需要指定哪些GPIO引脚作为输入端口参与测量过程;同时也要指明这些信号源对应的内部处理单元编号。此外还需激活DMA控制器以便自动搬运获取的结果至内存缓冲区等待后续分析计算。
/* 定义要使用的ADC通道数组 */
const uint8_t adc_channels[] = {ADC_CHANNEL_0, ADC_CHANNEL_1};
void MX_DMA_Init(void)
{
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR;
hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK){
Error_Handler();
}
__HAL_LINKDMA(&hadc1,DMA_Handle,hdma_adc1);
}
// 将上述通道加入到规则组内准备执行批量读取动作
if(HAL_ADC_ConfigChannel(&hadc1,&sConfig) != HAL_OK){
Error_Handler();
}
for(int i=0;i<sizeof(adc_channels)/sizeof(*adc_channels);i++){
sConfig.Channel = adc_channels[i];
if(HAL_ADC_ConfigChannel(&hadc1,&sConfig)!= HAL_OK){
Error_Handler();
}
}
应用平均值滤波算法于接收到的数据流上
当所有准备工作完成后就可以启动一次完整的周期性采集团队了——这会触发一系列快速而有序的操作直至全部样本都被妥善保存下来供进一步加工之用。这里展示了一个简单的基于滑动窗口机制实现的一维低通滤波器模型,它能有效减少随机噪声干扰的影响从而提高最终输出精度。
#define BUFFER_SIZE 8 // 设定缓存大小为8个元素长度
float filter_buffer[BUFFER_SIZE]; // 创建浮动型变量存储历史记录
uint8_t buffer_index = 0; // 当前位置索引标记
/**
* @brief 对新到达的数据实施均值平滑化处理.
*
* @param raw_data 输入未经修饰过的原始数值.
* @return float 返回经过加权求和后的估计结果.
*/
float apply_moving_average(float raw_data)
{
static int sum = 0;
sum -= filter_buffer[buffer_index];
filter_buffer[buffer_index++] = raw_data;
if(buffer_index >= BUFFER_SIZE) {
buffer_index = 0;
}
sum += raw_data;
return ((float)(sum)) / BUFFER_SIZE;
}
每当有新的ADC采样点到来时调用此函数即可获得较为稳定的反馈值。值得注意的是实际应用场景下可能还需要考虑更多因素比如温度补偿校正等措施以确保最佳性能表现[^2]。
相关推荐


















