专栏名称: CW32生态社区
以开放、共享、互助为理念,致力于构建武汉芯源半导体CW32系列MCU生态社区。无论是嵌入式MCU小白还是想要攻破技术难题的工程师,亦或是需求解决方案的产品经理,都可在CW32生态社区汲取营养、共同成长。
目录
相关文章推荐
51好读  ›  专栏  ›  CW32生态社区

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

CW32生态社区  · 公众号  ·  · 2024-05-12 19:12

正文

请到「今天看啥」查看全文


在实验运行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;}

END


往期回顾

REVIEW

【产品应用】CW32电动工具产品开源

【产品应用】基于CW32的智能充电宝(方案开源)

【产品应用】CW-W88水泵通用控制板设计方案(已开源)

【产品应用】基于CW32的角磨机控制器产品方案

【产品方案】基于CW32F030C8的低压无刷风机无感控制器

【产品方案】基于CW32的无刷直流空心杯电机有感控制驱动方案

【产品方案】基于CW32的无刷直流空心杯电机无感方波控制驱动方案

从0到1,开启产品级智能硬件设计之路!

CW32生态社区(WX)群



扫码加入QQ群

3群| 610403240

获取资料及 “开发者扶持计划” 第一手资讯









请到「今天看啥」查看全文