stm32f103 实现高通滤波
时间: 2023-09-20 08:13:53 浏览: 110
高通低通带通滤波器_STM32F103_高通_
5星 · 资源好评率100%
高通滤波是一种常用的信号处理技术,它可以滤除低频信号,保留高频信号。在STM32F103单片机中,可以通过使用定时器和中断来实现高通滤波。
首先,需要设置一个定时器,将其配置为自动重载模式,设置一个适当的计数值和分频系数,使得定时器的计数周期可以适应信号频率。然后,开启定时器中断,在中断处理函数中,将采样值传入高通滤波器中进行处理,将处理后的结果输出。
具体的代码实现如下:
```c
#include "stm32f10x.h"
#define SAMPLE_FREQ 1000 //采样频率
#define CUTOFF_FREQ 50 //截止频率
#define TIMER_PRESCALER 72 //定时器分频系数
volatile uint16_t adc_value = 0; //采样值
volatile float filtered_value = 0; //滤波后的值
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
//取得ADC采样值
adc_value = ADC_GetConversionValue(ADC1);
//高通滤波器处理
float RC = 1 / (2 * 3.14 * CUTOFF_FREQ);
float dt = 1.0 / SAMPLE_FREQ;
float alpha = RC / (RC + dt);
filtered_value = alpha * filtered_value + alpha * (adc_value - filtered_value);
//清除中断标志位
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
int main(void)
{
//初始化ADC
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//初始化定时器2
TIM_TimeBaseInitTypeDef TIM_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_InitStructure.TIM_Period = (SystemCoreClock / TIMER_PRESCALER) / SAMPLE_FREQ - 1;
TIM_InitStructure.TIM_Prescaler = TIMER_PRESCALER - 1;
TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_InitStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
//初始化NVIC
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
while(1)
{
//处理滤波后的值
//...
}
}
```
需要注意的是,高通滤波器的截止频率和采样频率需要根据具体的应用场景进行调整,以达到最佳的滤波效果。同时,在采样值和滤波后的值之间的处理过程也需要根据具体的应用场景进行设计。
阅读全文