标题: 关于ADC滤波算法讨论 [打印本页]

作者: Y_G_G    时间: 2025-6-26 00:02
标题: 关于ADC滤波算法讨论
最近在做一个USB充电显示电流和电压测试仪,主要是显示输入电压和充电电流的ADC全部采用算术平均算法,怎么说呢,反正能用,也正常,但有点强迫症
电压总是会5.06v,5.05V,5.03V之类的之间跳动,电流总是会在506mA,500mA,503mA之类的来回跳动,虽然知道这是正常现象,但总感觉不爽
请问各位有没有一个比较好的算法,就是能在精确度,显示稳定度之间相对均衡的算法,是否可以分享一下,不要代码,我自己撸就行,就是单纯的讨论一下算法问题

作者: szb314    时间: 2025-6-26 08:42
综艺节目,去掉一个最高分,一个最低分。。。当然还可以统计相同的数值出现最多的,第二多的。。。。然后看着办吧
作者: zyftank    时间: 2025-6-26 09:26
换个测量工具,用TI的INA3221测量
作者: zhuls    时间: 2025-6-26 09:41
我也曾做过类同的,采用的的“算法”就是采样20次,去掉2个高值、2个低值,余下平均即可。

记得有个大佬写的一本书《匠人手记》,其中有介绍10多种滤波算法,你可以找来借鉴一下。
作者: hi等你    时间: 2025-6-26 09:56
别人怎么做我不知道,我会在单片机ad那个脚加个小电容,隔半秒或一秒读取一次再去显示
作者: cyi8    时间: 2025-6-26 09:57
不知道,听说算法都很烧脑,大学学过的什么傅立叶算法等等我现在看着就感觉脑子里有个搅拌机,搅得一团混乱
作者: zyftank    时间: 2025-6-26 10:52
用软件的方法基本是在做无用功
作者: powerdruy    时间: 2025-6-26 10:55
可以试试一阶低通滤波,但是影响响应速度,想要响应和收敛都有比较好的表现,还是卡尔曼滤波
作者: powerdruy    时间: 2025-6-26 10:56
hi等你 发表于 2025-6-26 09:56
别人怎么做我不知道,我会在单片机ad那个脚加个小电容,隔半秒或一秒读取一次再去显示

你这个,只适合低速变化的信号,对于需要高速实时采样比如无人机,就不适用了
作者: angmall    时间: 2025-6-26 11:04
注意接地,注意VREF电压和噪声,有独立AVCC的注意AVCC电压和噪声
10位的ADC和12位的ADC的不同。5V下10位的ADC分辨率一位是4.88mV,12位是1.22mV,有可能你的电路有大于1mV小于4mV的纹波或者噪声,导致10位的结果不跳动而12位的跳动。
可以观察一下ADC数值跳动的范围,看看峰峰值大概多大。
看一下只采集一个通道数据跳不跳,也有可能是通道切换的时候采样保持电容串扰了。
增加 ADC 的采样时间,转换时间是固定的 12个 ADC 时钟
先检查自己的硬件,STC的ADC本身是很小跳动的,你有大跳动,检查你的电源纹波、参考电压纹波、输入信号纹波。12位ADC、2.5V参考,分辨率是0.61mV,你示波器看看你的电路上述参数的纹波,就会明白为什么跳动。
使用1/16 IIR滤波: v= ((v << 4) - v + v_new) >> 4;

作者: chfmx    时间: 2025-6-27 14:12
angmall 发表于 2025-6-26 11:04
注意接地,注意VREF电压和噪声,有独立AVCC的注意AVCC电压和噪声
10位的ADC和12位的ADC的不同。5V下10位的 ...

你好,可以问下1/16 IIR滤波: v= ((v << 4) - v + v_new) >> 4,具体是怎么得到的?

作者: dalaoshi    时间: 2025-6-27 23:36
采用大于还是小于来平滑,大于就加一点,小于就小一点,一次加减多少自己决定。
作者: wannenggong    时间: 2025-6-28 10:47
对于单片机ADC的各种滤波算法在AI软件中提问可以获得很多资料,个人感觉ADC采集端口串联1K电阻后加104电容滤波的方法挺有效的,建议楼主试试看。
作者: coody_sz    时间: 2025-6-28 18:00
使用一阶数字低通滤波,可以极大抑制波动、
作者: m182892    时间: 2025-6-28 19:54
chfmx 发表于 2025-6-27 14:12
你好,可以问下1/16 IIR滤波: v= ((v > 4,具体是怎么得到的?

将变量v左移 4 位(相当于乘以 16),然后减去自身v,再加上新值v_new,最后将结果右移 4 位(相当于除以 16),并将最终结果重新赋值给v 。例如,假设v初始值为 5,v_new为 3,v左移 4 位变为 80,80 减去 5 得 75,75 加上 3 为 78,78 右移 4 位约为 4.875,取整后v最终变为 4 。
作者: 风158    时间: 2025-6-28 22:01
我以前做adc的时候,也遇到过adc输出结果变化较大的情况。上网查了一下可能与输入阻抗不匹配有关,于是减小信号输入端电阻,输入端增加滤波电容,再经8次算术平均后就能得到较稳定的输出结果。
作者: aayon1979    时间: 2025-6-29 21:56
取一定次数采集,去掉最高和最低,其余的取平均值
作者: jianuli    时间: 2025-6-30 18:31
同问,我用电池供电电压也跳来跳去
作者: glinfei    时间: 2025-7-1 08:39
算数平均有好多种算法,可以用加权平均或移动平均等等
作者: 622323wjl    时间: 2025-7-1 10:02
注意接地,注意VREF电压和噪声,有独立AVCC的注意AVCC电压和噪声 10位的ADC和12位的ADC的不同。5V下10位的ADC分辨率一位是4.88mV,12位是1.22mV,有可能你的电路有大于1mV小于4mV的纹波或者噪声,导致10位的结果不跳动而12位的跳动。 可以观察一下ADC数值跳动的范围,看看峰峰值大概多大。 看一下只采集一个通道数据跳不跳,也有可能是通道切换的时候采样保持电容串扰了。 增加 ADC 的采样时间,转换时间是固定的 12个 ADC 时钟 先检查自己的硬件,STC的ADC本身是很小跳动的,你有大跳动,检查你的电源纹波、参考电压纹波、输入信号纹波。12位ADC、2.5V参考,分辨率是0.61mV,你示波器看看你的电路上述参数的纹波,就会明白为什么跳动。 使用1/16 IIR滤波: v= ((v << 4) - v + v_new) >> 4;
作者: GlenXu    时间: 2025-7-4 18:11
一阶惯性最简单使用,特别是用作显示。
我90%的场合都用这个。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1