登录/注册

stm32f103滤波adc

更多

在STM32F103中实现ADC滤波可以通过硬件和软件两种方式优化采样数据的稳定性。以下是具体方法和示例:

一、硬件滤波

  1. RC低通滤波

    • 在ADC输入引脚与信号源之间添加RC电路(如1kΩ电阻 + 100nF电容),截止频率计算公式:( f_c = \frac{1}{2\pi RC} )
    • 适用于高频噪声抑制,注意避免影响信号响应速度。
  2. 参考电压稳定

    • 使用独立的低噪声LDO(如AMS1117)为VDDA和VSSA供电,确保模拟电源与数字电源隔离。
    • 添加10μF和100nF电容并联到地,滤除电源纹波。

二、软件滤波

  1. 滑动平均滤波(实时性强)

    #define SAMPLE_SIZE 16
    uint16_t adc_buffer[SAMPLE_SIZE];
    uint8_t index = 0;
    uint32_t sum = 0;
    
    uint16_t sliding_average_filter(uint16_t new_sample) {
       sum -= adc_buffer[index];       // 移除旧样本
       sum += new_sample;              // 添加新样本
       adc_buffer[index] = new_sample; // 更新缓冲区
       index = (index + 1) % SAMPLE_SIZE;
       return (uint16_t)(sum / SAMPLE_SIZE);
    }
  2. 中值滤波(抗脉冲噪声)

    int compare(const void *a, const void *b) {
       return (*(uint16_t*)a - *(uint16_t*)b);
    }
    
    uint16_t median_filter(uint16_t *samples, uint8_t size) {
       uint16_t temp[size];
       memcpy(temp, samples, size*sizeof(uint16_t));
       qsort(temp, size, sizeof(uint16_t), compare);
       return temp[size/2];  // 取中间值
    }
  3. 混合滤波策略

    uint16_t hybrid_filter() {
       uint16_t raw_samples[5];
       for(uint8_t i=0; i<5; i++){
           raw_samples[i] = ADC_GetValue();  // 连续采集5次
       }
       uint16_t median = median_filter(raw_samples, 5);  // 先中值滤波
       return sliding_average_filter(median);           // 再滑动平均
    }

三、ADC配置优化

  1. 校准与配置

    void ADC_Config(void) {
       RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;  // 使能ADC时钟
       ADC1->CR2 = ADC_CR2_ADON;            // 开启ADC
       delay_ms(1);                         // 等待电源稳定
       ADC1->CR2 |= ADC_CR2_RSTCAL;         // 启动校准
       while(ADC1->CR2 & ADC_CR2_RSTCAL);   // 等待校准完成
       ADC1->CR2 |= ADC_CR2_CAL;            
       while(ADC1->CR2 & ADC_CR2_CAL);      // 等待校准结束
       ADC1->SQR1 = 0;                      // 单次转换模式
       ADC1->SMPR2 = ADC_SMPR2_SMP0_1 | ADC_SMPR2_SMP0_0; // 通道0采样时间71.5周期
    }
  2. 采样时间调整

    • 根据信号源阻抗调整SMPx[2:0]位(在ADC_SMPR寄存器),阻抗较高时选择更长采样时间:
    • 示例:1.5kΩ阻抗建议使用239.5周期采样(SMPx=111)

四、注意事项

  1. 噪声抑制

    • 避免在ADC转换期间切换GPIO状态,特别是高电流引脚(如PWM输出)
    • 使用独立的模拟地平面,与数字地单点连接
  2. 动态性能优化

    • 在连续采样模式下,适当降低ADC时钟(PCLK2分频),建议保持时钟≤14MHz
    • 使用DMA传输减少CPU中断开销,提高采样效率
  3. 数据后处理

    • 对于缓慢变化的信号(如温度),可结合软件低通滤波:
      float alpha = 0.2;  // 滤波系数(0.1~0.3)
      float adc_lowpass(float new_val, float old_val) {
      return old_val + alpha * (new_val - old_val);
      }

通过组合硬件滤波和软件算法,可显著提升STM32F103的ADC测量精度。建议先通过示波器观察原始信号特征,再针对性选择滤波方案。对于50Hz工频干扰,可考虑同步采样或软件数字陷波器实现。

stm32f302和stm32f103ADC区别是什么?

请问stm32f302和stm32f103的ADC除了stm32f103

2024-05-15 08:03:36

请问adxrs620输出范围怎么调理到适合stm32f103adc量程?

adxrs620输出范围怎么调理到适合stm32f103的adc量程了?stm32f103是3.3v供电的。620输出我想加一级rc的

2024-01-02 07:23:00

学习STM32F103ADC功能

三勺最近在学习STM32F103的ADC功能,居然连最简单的独立模式的单通道的电压采集都不能实现,这就不能忍了,这是对智商的侮辱。

2023-10-24 16:06:03

基于STM32F103的SVPWM算法实现

基于STM32F103的SVPWM算法实现

资料下载 jinyi7016 2022-03-22 12:12:17

GD32F103STM32F103的区别 2021.6.2

GD32F103和STM32F103区别介绍关键词Key words:GD32F103、

资料下载 李杰 2021-12-08 11:06:03

基于STM32f103的输入捕获测频率和占空比

基于STM32f103的输入捕获测频率和占空比

资料下载 shyshyshy 2021-08-02 10:10:24

基于STM32f103的FFT频率测试程序下载

基于STM32f103的FFT频率测试程序下载

资料下载 shyshyshy 2021-08-02 10:07:20

基于STM32f103使用的DAC正弦波

基于STM32f103使用的DAC正弦波

资料下载 shyshyshy 2021-08-02 10:05:00

ARM系列STM32F103芯片的解密方法

破解STM32F103芯片的方法

2023-09-19 09:03:40

ch32v103stm32f103的区别

ch32v103与stm32f103的区别  Ch32v103与STM32f103

2023-08-22 15:49:00

STM32F103 GPIO内部电路图讲解

STM32F103 GPIO内部电路图讲解

2023-02-01 16:32:14

基于STM32F103单片机的矩阵按键设计

本实验使用STM32F103单片机,主题代码通用的。

2022-12-09 17:18:46

采用STM32F103硬件ADC功能进行光照强度采集

光照强度采集ADC方式采集,STM32F103本身自带有硬件ADC功能。将采集到的数据实时刷新到屏幕上即可完成波形显示。

2022-05-31 11:32:52

如何对STM32F103 ADC寄存器进行配置

STM32F103系列有几个ADC?STM32F103系列的ADC主要特

2021-09-27 09:08:10

stm32f030和stm32f103功能差异

stm32f030和stm32f103功能差异主要表现在哪?

2021-07-22 09:35:47

7天热门专题 换一换
相关标签