CW32数字电压电流表软件进阶教程-2.电压电流值做均值滤波

在实验运行7.1章节例程时CW32数字电压电流表软件进阶教程-1.电压电流同时显示,会发现实时显示更新的数据是当前采集值,并未做数据滤波处理。由于采集到的原始数据有一定的波动,因此在显示更新速度较快时,数字有跳动现象。

因此,在数据处理前,可以增加常见的均值滤波算法。均值滤波原理在实验七中已有讲述。

在7.1实验例程基础上,增加均值滤波的核心代码如下:

void Volt_Cal(void)
{   
  V_Buffer = Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE);; //使用均值滤波
  I_Buffer = Mean_Value_Filter(Curr_Buffer,ADC_SAMPLE_SIZE);; //使用均值滤波

  V_Buffer = (V_Buffer * ADC_REF_VALUE >> 12) * (R2 + R1)/R1;
  // 四舍五入
    if(V_Buffer % 10 >= 5)
    {
        V_Buffer = V_Buffer / 10 + 1;
    }
    else
    {
        V_Buffer = V_Buffer / 10;
    }

    I_Buffer=I_Buffer * ADC_REF_VALUE >> 12;
     /**
        mv =I_Buffer * ADC_REF_VALUE >> 12,
        R = 100mr,
        10ma = mv/R/10=mv/0.1/10 = mv
     */  
}  

在上述例程中,可以看到使用了均值滤波函数:

Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE);; //使用均值滤波

Mean_Value_Filter(Curr_Buffer,ADC_SAMPLE_SIZE);; //使用均值滤波

其中,原始数据为每1MS采集一个数据点,共采集100次,即100MS内的定时数据值。单点数据采集在定时器BTIM1中断函数中完成。

均值滤波函数定义如下:

uint32_t Mean_Value_Filter(uint16_t *value, uint32_t size)     //均值滤波
{
    uint32_t sum = 0;
    uint16_t max = 0;
    uint16_t min = 0xffff;
    int      i;

    for(i = 0; i < size; i++)
    {
        sum += value[i];
        if(value[i] > max)
        {
            max = value[i];
        }
        if(value[i] < min)
        {
            min = value[i];
        }
    }
    sum -= max + min;
    sum  = sum / (size - 2);
    //if(sum>1)sum+=4; 后期校准
    return sum;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值