【单片机】实现一个简单的ADC滤波器

实现一个 ADC的滤波器,PT1 滤波器(也称为一阶低通滤波器),用于对输入信号进行滤波处理。

c 复制代码
typedef struct PT1FilterSettings PT1FilterSettings;
struct PT1FilterSettings
{
 //! last Filter output value
 uint32_t filtValOld;
 
 //! Tn..FilterTimeConstant, Ts...Sampletime, F Faktor =2^F
 uint32_t filtConst1; //! (Ts+Tn)*F in 2^n
 uint32_t filtConst2; //! Ts*F
 uint32_t filtConst3; //! Tn*F
 uint8_t filtFactor; 	//! 2^F
};

/*************************************************************************************************/
/*! \brief   PT1 filter for all channels, setting are used from the observers
 \param   uint16_t uiSignalFiltIn ... input value
					PT1FilterSettings *filterSettings ... filter instance of observer
 \return  uint16_t filtert value
 \callgraph -
 **************************************************************************************************/
uint16_t pt1Filter(uint16_t uiSignalFiltIn, PT1FilterSettings *filterSettings)
{ 
  // -------- info ----------------
  // 32Bit PT1 Filter (Euler Forward)

  uint32_t signalFiltOut;


  // ------ Filter initialization to first signal sample ----
  if (!filterSettings->filtValOld)  
  {
    filterSettings->filtValOld = (uint32_t)uiSignalFiltIn << filterSettings->filtFactor; //load first value
  }
  
  signalFiltOut  = (uint32_t)uiSignalFiltIn << filterSettings->filtFactor; 	//scale value with factor
  signalFiltOut  = (filterSettings->filtConst2*signalFiltOut); 							//multiply with sample time
	signalFiltOut  = signalFiltOut + (filterSettings->filtConst3*filterSettings->filtValOld); //add old value multiplied with the time constant
  signalFiltOut >>= filterSettings->filtConst1;															//scale down the sum 
  filterSettings->filtValOld = signalFiltOut;																//save value for next sample

  return (signalFiltOut >> filterSettings->filtFactor);											//return value devided by the factor
}

下面逐行解释这段代码的功能和工作原理。

函数定义

c 复制代码
uint16_t pt1Filter(uint16_t uiSignalFiltIn, PT1FilterSettings *filterSettings)
  • 参数

    • uiSignalFiltIn:输入信号,类型为 uint16_t(16 位无符号整数)。
    • filterSettings:指向 PT1FilterSettings 结构体的指针,包含滤波器的设置参数。
  • 返回值 :返回滤波后的信号,类型为 uint16_t

代码解析

c 复制代码
uint32_t signalFiltOut;
  • 定义一个 32 位无符号整数 signalFiltOut,用于存储滤波后的信号。
滤波器初始化
c 复制代码
if (!filterSettings->filtValOld)  
{
    filterSettings->filtValOld = (uint32_t)uiSignalFiltIn << filterSettings->filtFactor; //load first value
}
  • 检查 filtValOld 是否为零(即滤波器是否未初始化)。
  • 如果是,则将输入信号左移 filtFactor 位并赋值给 filtValOld,这相当于初始化滤波器的状态。
滤波计算
c 复制代码
signalFiltOut  = (uint32_t)uiSignalFiltIn << filterSettings->filtFactor; 	//scale value with factor
  • 将输入信号左移 filtFactor 位,进行缩放。
c 复制代码
signalFiltOut  = (filterSettings->filtConst2 * signalFiltOut); 							//multiply with sample time
  • 将缩放后的信号乘以 filtConst2,通常用于与采样时间相关的计算。
c 复制代码
signalFiltOut  = signalFiltOut + (filterSettings->filtConst3 * filterSettings->filtValOld); //add old value multiplied with the time constant
  • filtValOld(上一个滤波输出值)乘以 filtConst3,并与当前信号相加。这一部分实现了滤波器的递归特性。
c 复制代码
signalFiltOut >>= filterSettings->filtConst1; //scale down the sum 
  • signalFiltOut 右移 filtConst1 位,进行缩放,通常用于调整输出信号的范围。
c 复制代码
filterSettings->filtValOld = signalFiltOut; //save value for next sample
  • 将当前的滤波输出值保存到 filtValOld,以便在下一个采样时使用。
返回值
c 复制代码
return (signalFiltOut >> filterSettings->filtFactor); //return value divided by the factor
  • 返回滤波后的信号,右移 filtFactor 位以恢复到原始范围。

总结

这段代码实现了一个 PT1 滤波器,使用了简单的递归公式来平滑输入信号。主要步骤包括:

  1. 初始化滤波器状态。
  2. 对输入信号进行缩放。
  3. 结合当前信号和上一个滤波输出值进行加权计算。
  4. 更新滤波器状态以备下次使用。
  5. 返回滤波后的信号。

这种滤波器常用于信号处理,能够有效去除高频噪声,平滑信号变化。

相关推荐
程序员与背包客_CoderZ2 小时前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb
william_yangshun2 小时前
【大模型部署实战】kimi-k3-in-c 中文版:用 176KB 纯 C99 引擎在 CPU 上跑 Kimi K3 上手指南
c语言·开发语言
深圳市宝华视联3 小时前
Python 读取 IP 视频流简单 Demo
python·嵌入式硬件·opencv·网络协议·tcp/ip·实时音视频·嵌入式实时数据库
恒锐丰科技韩生4 小时前
RB6005A|晶准 单节锂电池内置 MOS 保护芯片 DFN2×3‑8
嵌入式硬件·硬件工程
youshi66684 小时前
stm32-PWR、低功耗模式
stm32·单片机·嵌入式硬件
ACP广源盛139246256734 小时前
Qwen3.8‑2.4T 开源落地@ACP#国产 Serdes 长距离视频传输芯片 GSV5800 在私有化 AI 服务中的价值与应用场景
大数据·数据库·人工智能·嵌入式硬件·矩阵·开源·音视频
Funing74 小时前
STM32 电机动态 PI 控制:从编码器反馈、增量式 PI 到 Matlab 参数拟合与 PWM 输出
stm32·嵌入式硬件·matlab·pi控制算法
Yyyyyy~4 小时前
【C语言】数据类型和变量【下】
c语言
云泽8085 小时前
深入浅出 STM32(十八):时钟树、总线与寄存器的底层联动机制
stm32·单片机·嵌入式硬件
米饭不加菜5 小时前
C51 语言参考手册
经验分享·笔记·单片机·嵌入式硬件