本帖最后由 小宏121 于 2024-7-17 23:44 编辑
我这里直接拿一节7号电池做实验,电池正极接到P3.5引脚,负极接到开发板的GND
首先先看看官方例程 “DC_Monitoring” 的采样效果
可以看到没有经过滤波的程序,得到的结果有很轻微的波动
- ****************************** DC Monitoring example started *****************************
- batt_level_mv = 1400
- batt_level_mv = 1399
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1399
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1399
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1400
- batt_level_mv = 1400
下面看看经过滤波后的效果
先复制一个官方例程 “DC_Monitoring”,改名为"my_adc_test"
下面是卡尔曼滤波算法的程序
- static float kalman_adc_old;
- static float kalman_P1;
- static float kalman_Q = 0.05;
- static float kalman_R = 5;
- static float kalman_Kg = 0;
- static float kalman_P = 1;
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] 初始化或重置卡尔曼滤波器的一些参数,每次开始新的滤波循环或者有需要时调用
- * @param temperature:NTC当前的温度值
- * @retval 温度值,单位℃
- * @note
- */
- void refresh_kalman_filter(float temperature)
- {
- kalman_adc_old = temperature;
- kalman_P1 = 0;
- kalman_Q = 0.05;
- kalman_R = 5;
- kalman_Kg = 0;
- kalman_P = 1;
- }
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] 卡尔曼滤波函数,接受一个新的温度测量值并返回经过滤波处理后的温度估计值
- * @param temperature:NTC当前的温度值
- * @retval 温度值,单位℃
- * @note
- */
- static float kalman_filter(float temperature)
- {
- float LastData;
-
- float NowData;
-
- float kalman_data;
- NowData = temperature;
-
- LastData = kalman_adc_old;
-
-
- kalman_P = kalman_P1 + kalman_Q;
-
- kalman_Kg = kalman_P / ( kalman_P + kalman_R );
-
- kalman_data = LastData + kalman_Kg * ( NowData - kalman_adc_old );
-
- kalman_P1 = ( 1 - kalman_Kg ) * kalman_P;
-
- kalman_P = kalman_P1;
-
- kalman_adc_old = kalman_data;
- return ( kalman_data );
- }
在官方例程这里加上滤波算法
滤波稳定下来后,测量到的电池电压保持1.4V,基本没有波动
如果想要快点到目标值,可以适当改小R值,如果改得太小会波动变化很大
|