在实验运行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;
}
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !