本帖最后由 小宏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值,如果改得太小会波动变化很大
****************************** DC Monitoring example started *****************************
batt_level_mv = 1697
batt_level_mv = 1691
batt_level_mv = 1683
batt_level_mv = 1672
batt_level_mv = 1660
batt_level_mv = 1646
batt_level_mv = 1632
batt_level_mv = 1617
batt_level_mv = 1602
batt_level_mv = 1587
batt_level_mv = 1573
batt_level_mv = 1559
batt_level_mv = 1546
batt_level_mv = 1534
batt_level_mv = 1522
batt_level_mv = 1511
batt_level_mv = 1501
batt_level_mv = 1492
batt_level_mv = 1484
batt_level_mv = 1476
batt_level_mv = 1469
batt_level_mv = 1463
batt_level_mv = 1457
batt_level_mv = 1452
batt_level_mv = 1447
batt_level_mv = 1442
batt_level_mv = 1438
batt_level_mv = 1435
batt_level_mv = 1431
batt_level_mv = 1428
batt_level_mv = 1426
batt_level_mv = 1423
batt_level_mv = 1421
batt_level_mv = 1419
batt_level_mv = 1417
batt_level_mv = 1416
batt_level_mv = 1414
batt_level_mv = 1413
batt_level_mv = 1412
batt_level_mv = 1411
batt_level_mv = 1409
batt_level_mv = 1409
batt_level_mv = 1408
batt_level_mv = 1407
batt_level_mv = 1406
batt_level_mv = 1406
batt_level_mv = 1405
batt_level_mv = 1405
batt_level_mv = 1404
batt_level_mv = 1404
batt_level_mv = 1403
batt_level_mv = 1403
batt_level_mv = 1403
batt_level_mv = 1402
batt_level_mv = 1402
batt_level_mv = 1402
batt_level_mv = 1402
batt_level_mv = 1402
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
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 = 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 = 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 = 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 = 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 = 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 = 1400
batt_level_mv = 1400
|