单片机ADC采样算法----一阶低通滤波

  关于低通滤波,先看一下百度百科上的定义。

算法实现的公式如下:

 y(n) = q*x(n) + (1-q)*y(n-1)    

其中Y(n)为输出,x(n)为输入,y(n-1)为上一次输出值,其中q为滤波系数。取值范围为0--1.

也就是说若q=0.5时,这个公式代表的意思就是取本次采样值的50%,加上上一次采样值的50%,做为本次的采样结果。也就是说每次的采样结果都和上一次的采样结果相关。

看一下在单片机中C代码的实现

//参数:com 为采样的原始数值
//返回值:iData 经过一阶滤波后的采样值
unsigned int lowV( unsigned int com )
{
    static unsigned int iLastData;    //上一次值
    unsigned int iData;               //本次计算值
    float dPower = 0.1;               //滤波系数
    iData = ( com * dPower ) + ( 1 - dPower ) * iLastData; //计算
    iLastData = iData;                                     //存贮本次数据
    return iData;                                         //返回数据
}

//主函数
void main( void )
{
  while( 1 )
    {
        val1 = ReadVol_CH3() ;         //   读取AD采样值   
        val3 = lowV( val1 );           //   采样值经过一阶滤波算法
        printf("A%d\r\n",val1);        //   打印采样值
        printf("B%d\r\n",val3);        //   打印经过滤波算法后的采样值
    }
}

通过ADC采样输入电压,然后将采样值经过一阶滤波运算,通过串口分别打印采样值和经过一阶滤波运算后的值。

通过串口波形显示软件可以看到采样的结果为:

      当滤波系数q=0.1时,本次采样数据占采样结果的10%,上一次采样数据占采样结果的90%,也就是说采样数据突变时对采样结果影响不大,采样的波形比较平滑。

        由上面的波形也可以看出,蓝色波形为原始数据波形,波动范围比较大,橙色波形为经过一阶滤波算法后的波形,波形比较平稳。

  将q值改为0.5时,看看采样情况。

可以看到当滤波系数增大到0.5时,本次采样数据和上次采样数据对结果的影响分别占50%。通过波形可以看到,经过滤波后的波形也出现了波动,但是波动范围相对于原始波形来说小了一点。

将q值继续增大,改为0.9时,看看采样情况。

通过波形可以看到将采样系数增大后,本次采样数据对采样结果影响占到了90%,经过一阶滤波后的波形基本和原始波形保持了同步,实时性比较好,但是稳定性会差一点。

通过不同滤波系数的对比发现:

  滤波系数越小,滤波结果越平稳,但是灵敏度越低;

  滤波系数越大,灵敏度越高,但是滤波结果越不稳定。

在实际应用中根据不同的需求,选择合适的滤波系数,以满足系统要求。

### 单片机实现低通滤波算法 #### 低通滤波器简介 在低通滤波器中,过调整滤波系数可以有效抑制高频噪声并平滑信号。该方法特别适用于单片机中的ADC采样数据处理,在保持响应速度的同时减少毛刺噪声的影响[^2]。 #### 滤波系数定义 滤波系数决定了系统的动态特性以及对输入变化的敏感度。常表示为`α=Ts/(Ts+T)`的形式,其中`Ts`代表采样周期,而`T`则是时间常数。当`0<α≤1`时,较小的`α`意味着更强的滤波效果但更慢的时间响应;反之则更快响应于快速变动却可能引入更多残留噪音[^1]。 #### C语言实例代码解释 下面给出了段基于上述理论的低通滤波程序片段: ```c #include <stdio.h> // 定义全局变量用于存储上次计算的结果 float last_filtered_value; void init_filter(void){ // 初始化过滤器状态, 可以设置成初始测量值或其他合理估计 last_filtered_value = read_adc(); } float apply_low_pass(float raw_input,float alpha){ float filtered_output; /* 应用差分方程 */ filtered_output = (alpha * raw_input) + ((1 - alpha)*last_filtered_value); // 更新历史记录以便下次调用使用 last_filtered_value = filtered_output; return filtered_output; } ``` 此代码实现了简单的IIR无限脉冲响应型数字滤波功能。每次接收到新的原始读数(`raw_input`)之后都会按照指定的比例混合新旧两个样本从而得到最终输出(`filtered_output`)。参数`alpha`即为之前提到过的滤波因子,其取值范围应在(0,1]之间。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值