【单片机】实现一个简单的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. 返回滤波后的信号。

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

相关推荐
SuperByteMaster9 小时前
allegro 布线规则管理器
嵌入式硬件
女神下凡10 小时前
芯参谋(41):DDR2_电路设计指南
arm开发·单片机·嵌入式硬件·设计规范
Escalating_xu11 小时前
【C 语言】深入理解指针(4):回调函数、qsort、void * 与泛型排序的模拟实现
java·c语言·开发语言
吠品11 小时前
GitHub 周榜拆解:决策小模型扎堆上位
c语言·开发语言·算法
Zhao1368245539112 小时前
国产替代DPE5500百兆以太网控制芯片兼容W5500
嵌入式硬件·物联网
小师兄吃牛肉12 小时前
C语言篇:内联函数
c语言·开发语言
yuehuaxin0113 小时前
LP20R100FN 同步整流|3C 认证适配器 CCM 工况倒灌、温升超标样机避坑解析
嵌入式硬件·智能家居·适配器模式·智能硬件
白山编程大哥13 小时前
C语言篇:语法进阶
c语言·数据结构·算法
国科安芯13 小时前
商业立方星平台中高集成度抗辐射MCU的功耗优化与批量化应用可行性探讨
单片机·嵌入式硬件·架构·risc-v·抗辐射·as32x601
女神下凡13 小时前
芯参谋(40):UFS 电路设计指南
arm开发·单片机·嵌入式硬件·设计规范