动态传感器校准:嵌入式场景下旋转测量电感传感器的校准方案咨询
旋转电感式传感器动态校准解决方案
前置逻辑:信号活动性判别
先做旋转状态判定,避免停转阶段的无效值干扰校准参数:
- 取最近20~50个采样点计算峰峰值,若峰峰值低于预设阈值(可根据传感器正常旋转时的最小输出幅值调整,参考值为10),判定为停转状态,冻结所有校准参数不更新。
- 峰峰值超过阈值时判定为旋转状态,仅在该状态下执行后续校准逻辑。
该逻辑可彻底解决停转阶段移动平均偏离真实值的问题。
可向内收缩的动态极值校准机制
放弃全局极值统计逻辑,选用以下两种嵌入式友好的实现方案:
方案1:带衰减的极值更新(内存占用极低,适合资源极受限的MCU)
给当前记录的最小值、最大值设置独立的衰减计数器,让极值范围具备缓慢向内收缩的能力,异常值仅会短期影响校准范围,不会造成永久偏移:
// 可根据实际场景调整参数 #define ATTEN_PERIOD 60000 // 极值衰减周期,单位ms,参考值1分钟 #define ATTEN_STEP 1 // 每次衰减步长 #define MIN_AMPLITUDE 20 // 保证最小输出幅值不低于该值,避免范围收缩为单点 static uint16_t calib_min = 2100, calib_max = 2200; static uint32_t min_atten_tick = 0, max_atten_tick = 0; // 旋转状态下每个采样点执行的极值更新逻辑 void update_calib(uint16_t sample) { uint32_t cur_tick = get_sys_tick(); if (sample < calib_min) { calib_min = sample; min_atten_tick = cur_tick; } if (sample > calib_max) { calib_max = sample; max_atten_tick = cur_tick; } // 最小值衰减逻辑,可放在系统定时器回调中定期执行 if (cur_tick - min_atten_tick > ATTEN_PERIOD) { if (calib_min < calib_max - MIN_AMPLITUDE) { calib_min += ATTEN_STEP; } min_atten_tick = cur_tick; } // 最大值衰减逻辑 if (cur_tick - max_atten_tick > ATTEN_PERIOD) { if (calib_max > calib_min + MIN_AMPLITUDE) { calib_max -= ATTEN_STEP; } max_atten_tick = cur_tick; } }
方案2:分块滑动窗极值统计(抗干扰能力更强,内存占用稍高)
如果MCU内存足够,开一个对应1030分钟采样量的环形缓存,将缓存拆分为510个固定大小的块,每个块独立统计自身的最小值、最大值,全局校准用的最小值取所有块最小值的中位数/平均值,最大值取所有块最大值的中位数/平均值。旧块被新采样数据覆盖时,全局校准范围会自动更新,天然支持向内收缩,且单个异常值仅会影响一个块的统计结果,抗干扰能力远高于普通全局极值统计。
平均值计算优化
类正弦信号的平均值等价于峰峰值的中点,直接用(calib_min + calib_max) / 2计算即可,完全不需要移动平均算法,也不会受停转状态的影响。
补充优化:异常值前置过滤
在所有信号处理逻辑前加一阶限幅滤波:当前采样值与上一个有效值的差值超过预设的最大跳变阈值(参考值为正常旋转时单采样间隔最大跳变值的2倍)时,直接丢弃该采样值,不参与校准和旋转计数,进一步降低异常值的干扰。
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

