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

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

相关推荐
Severus_black26 分钟前
顺序表、单链表经典算法题分享(未完待续...)
c语言·数据结构·算法·链表
我不是懒洋洋33 分钟前
【经典题目】栈和队列面试题(括号匹配问题、用队列实现栈、设计循环队列、用栈实现队列)
c语言·开发语言·数据结构·算法·leetcode·链表·ecmascript
j_xxx404_1 小时前
用系统调用从零封装一个C语言标准I/O库 | 附源码
linux·c语言·开发语言·后端
Xiaoᴗo.1 小时前
C语言2.0---------
c语言·开发语言·数据结构
Brilliantwxx1 小时前
【数据结构】排序算法的神奇世界(下)
c语言·数据结构·笔记·算法·排序算法
wotaifuzao1 小时前
深度解析:NFC、UWB与BLE技术的演进、核心技术与“无感交互“融合应用展望
嵌入式硬件·交互·ble·uwb·nfc·数字钥匙
励志的小陈2 小时前
数据结构--二叉树(链式结构、C语言实现、层序遍历)
c语言·数据结构
玩转单片机与嵌入式8 小时前
一个成熟的嵌入式AI系统,是长什么样子的?
人工智能·单片机·嵌入式硬件·嵌入式ai
玩转单片机与嵌入式12 小时前
不会 Python、不会深度学习,也能在STM32上跑AI模型吗?
人工智能·单片机·嵌入式硬件·嵌入式ai
glimix12 小时前
Word-Pop:使用C语言开发打单词游戏
c语言·游戏