ADC的计算策略.针对ADC值经常跳变的电路获取正确结果

本文探讨了如何处理多台ADC设备的不稳定输出,提出三种策略:一是设定阈值并处理临界区跳变,二是利用微分判断扭动停止,三是简化操作,固定无效区间结果。重点在于实时性和抗干扰能力的提高。

一、问题描述

        -有多台adc检测不稳定的设备,每一台设备计算出来的adc最大值不等、最小值不等,相差在-3到3之间。设置200个格子,计算当前adc值落在那个格子里以用来控制另一个功能。

二、解决思路

        -策略1:设置adc采样的最小值否则一律看作0,设置adc采样的最大值否则一律设置为最大。格子中设置有效触发区间,若落入有效触发区间则直接出结果,若落在无效区域就要分情况讨论-----adc值就在格子的临界处、adc值不在格子的临界处。 

                -adc值就在格子的临界处:跳变的adc值随时在两个格子a、b的无效触发区间跳动,若只是简单的设置为:触发在格子a的临界处就直接认为格子a有效,触发在格子b的临界处就直接认为格子a有效,这会导致每一次计算结果时哪怕不扭动旋钮等器件控制adc值改变,单单adc值的跳变以及不稳定就概率让计算的结果为:落在格子a、落在格子b,但这是显然没有扭动器件。而且这种情况下使用平均值的方式消抖不总是有用的,平均值消抖的本质是:采样一周期的周期变化的adc值,让波峰掩盖波谷。但是这平均值方式在面对周期长的是需要长时间采样,在实时性要求比较高的应用,这简直是灾难,可以想象每次扭动旋钮结果要采样几秒种才能出结果,这很离谱。当然也可以说直接保存之前记录的值就好了,新得出的校验值与之前的做平均就能保证实时性,这也是一个好办法。但值得一提,设置过长的记录数据长度其实是带来一种延迟响应的问题,人去扭动旋钮但经过平均值一计算的值与所想要的值相比总会滞后,这是平均所带来的。设置过短的长度又会直接没效果。实在是太难了。

                        -正确方式:

                                .当adc值落在临界段,计算第一次落入临界段的值是更偏向格子a还是格子b,记录该值,但下一次adc值继续落入临界段,无论更偏向格子a还是格子b一律以记录的值为准并将当前结果设置为记录的值,并与之前保存的adc采样值做平均以得出结果。当然值得指出,这种方式不是万能的,临界段的设置利用了adc值的概率变化更多落在设置的临界段这个规律。当临界段选取得不好,那么adc值有可能直接在临界段以及无效区间徘徊,而由此计算的结果就仍有可能在格子a以及b跳动。

                 -adc值不在格子的临界处

                        -adc值落在无效段:直接记录当前adc值,与之前记录的adc值做平均得出结果,平均的结果不讨论如果继续落入临界区的情况,直接得结果。

                        -adc值落入有效段:直接记录当前adc值,不参与平均值计算,直接更新记录的adc值全部设置为该值。

        -策略2:策略1也太tm麻烦了,为难程序员写这玩意?我只想说:艹,我搬砖的。策略1是仅仅考虑值本身,每一个记录的值当成独立的。但想想都不可能,相邻的值怎么可能没有相关性。将采样adc的值丢经保存的数组里,计算这次采样值与之前的采样值的微分,观察微分值起伏从大到小就有足够的理由认为:旋钮扭动停止了,这次采样的值不是更改输出结果的理由,选定相邻的最小值作为结果输出,若观察到微分值一直都很小,那么应当认为:没有扭动旋钮,不输出结果。这个所谓的“观察”在数学上就是算方差。

见上图所示,快速变化的切线最终平缓,这是旋钮的随时间微分变化图。 

        -策略3:参考策略1,但是不再存在临界区,当adc值落入有效区间直接出结果,当落入无效区间输出上一次输出的结果。例如上一次输出的结果为格子a,但之后落入了格子b的无效区间,那么仍旧输出结果为a,若之后由于adc的采样不稳落入了格子b的有效区间,输出结果为b,哪怕之后采样的值落入了格子a的无效区间,仍旧输出为结果为b。这种方式下,扭动旋钮不一定是实际上最靠近的结果,但肯定是很好写代码的策略。

<think>好的,我现在需要解决用户关于STM32使用线性电位器时ADC算法导致中间数据不稳定的问题。首先,我需要理解用户的问题场景。他们可能在使用STM32的ADC模块读取线性电位器的电压时,发现中间区域的数波动较大,不够稳定。这可能影响应用的精度,比如在音量控制或位置检测中导致抖动。 接下来,我要回忆STM32的ADC工作原理和相关特性。根据引用[1]和[2],ADC的功能框图和输入通道是关键。可能存在输入阻抗不匹配的问题,因为STM32的ADC输入阻抗较高,而电位器的输出阻抗可能较大,导致采样时电压不稳定。此外,ADC的采样时间设置不足可能导致无法准确捕获信号。 然后,考虑硬件因素。引用[3]提到使用的电位器型号,可能需要检查电位器的质量。劣质电位器可能存在接触不良或线性度差的问题,尤其是在中间区域频繁使用时磨损更严重。此外,电路设计中的滤波是否足够,比如是否有添加RC低通滤波来抑制噪声。 软件方面,ADC的采样次数和数据处理方法也很重要。多次采样取平均或使用中滤波可以减少噪声影响。此外,检查ADC的参考电压是否稳定,电源噪声可能通过参考电压引入波动。 可能的解决方案包括: 1. 调整ADC采样时间,确保充分充电采样电容。 2. 添加硬件滤波电路,如RC滤波。 3. 软件滤波算法,如滑动平均、中滤波或卡尔曼滤波。 4. 检查电位器质量,必要时更换高精度型号。 5. 校准ADC,特别是在非线性区域进行多点校准。 还需要注意引用[4]中提到的非线性问题,可能需要用户采集更详细的数据曲线,分析不稳定的具体表现,从而针对性调整算法或硬件。 最后,验证这些方案的有效性,比如通过示波器观察信号波形,或监控处理后的ADC数据是否稳定。可能需要用户逐步排查,从硬件到软件,逐一优化。</think>针对STM32使用线性电位器时ADC数据不稳定的问题,以下是分步解决方案: ### 一、硬件优化 1. **增加RC低通滤波电路** 在电位器输出端与ADC引脚之间添加RC滤波(如$R=1k\Omega$,$C=100nF$),截止频率计算为: $$f_c = \frac{1}{2\pi RC} \approx 1.6kHz$$ 可有效抑制高频噪声[^3][^4]。 2. **优化电位器选型** 选择线性度误差小于±1%的导电塑料电位器(如WDD35D-4),降低接触电阻变化的影响。 3. **稳定参考电压** 使用独立基准电压芯片(如REF3030)为ADC提供$V_{REF}$,并在电源引脚添加去耦电容(10μF+100nF组合)。 ### 二、ADC配置调整 1. **延长采样时间** 根据STM32F103的ADC时钟配置(例如12MHz),设置采样时间为239.5周期: ```c ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); ``` 确保采样电容充分充电[^2]。 2. **启用过采样功能** 通过硬件过采样提升分辨率: ```c ADC_OverrunModeCmd(ADC1, ENABLE); ADC_OverSamplingCmd(ADC1, ENABLE); ADC_OverSamplingRatioConfig(ADC1, ADC_OVERSAMPLING_RATIO_256); ``` ### 三、软件算法优化 1. **动态加权滑动平均滤波** ```c #define FILTER_SIZE 16 uint16_t adc_filter(uint16_t new_val) { static uint16_t buf[FILTER_SIZE] = {0}; static uint8_t idx = 0; uint32_t sum = 0; buf[idx++] = new_val; idx %= FILTER_SIZE; // 加权系数:最新数据权重更高 for(uint8_t i=0; i<FILTER_SIZE; i++){ sum += buf[i] * (i+1); } return sum / (FILTER_SIZE*(FILTER_SIZE+1)/2); } ``` 2. **非线性区域校准** 针对中间区域(如0x200-0x300)建立补偿表: | 原始 | 补偿 | |-------|-------| | 0x200 | 0x210 | | 0x250 | 0x25F | | ... | ... | ### 四、抗干扰设计 1. **PCB布局优化** - ADC走线远离数字信号线 - 模拟地(AGND)与数字地(DGND)单点连接 - 在ADC引脚串联100Ω电阻并并联10pF电容 2. **电源隔离** 使用LC滤波电路为模拟部分供电: $$L=10\mu H,\ C=10\mu F+0.1\mu F$$ ### 五、验证方法 1. 通过DMA连续采集1024个样本,计算标准差: $$\sigma = \sqrt{\frac{1}{N-1}\sum_{i=1}^{N}(x_i - \bar{x})^2}$$ 优化后应满足$\sigma < 3$(12位ADC) 2. 绘制全量程特性曲线时,使用三次样条插修正非线性: $$V_{out} = a_0 + a_1D + a_2D^2 + a_3D^3$$ 其中$D$为ADC数字量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值